+
@@ -41,23 +55,27 @@
+
+
+
Logready
Diagnosticsready
@@ -76,7 +95,54 @@ end
Waitnone
Motion Queueempty
Trace0 events
- ReportsA120-REPORT
+ ReportsW2-REPORT
+
+ Storagechecking browser storage
+
+
Program Steps
+
step 0
+
+
+
+
+ | # |
+ Time |
+ Line |
+ Step |
+ Source |
+ Motion/Target |
+ Samples |
+
+
+
+
+
+
+
+
Trajectory Frames
+
t=0 s
+
+
+
+
+ | # |
+ t |
+ Motion |
+ Target |
+ TCP XYZ |
+ TCP Q |
+ J1 |
+ J2 |
+ J3 |
+ J4 |
+ J5 |
+ J6 |
+
+
+
+
+
+
diff --git a/kdl-wasm/web/app/virtual-controller.js b/kdl-wasm/web/app/virtual-controller.js
index 2b16a96..0a69194 100644
--- a/kdl-wasm/web/app/virtual-controller.js
+++ b/kdl-wasm/web/app/virtual-controller.js
@@ -4,33 +4,532 @@
Array.from(document.querySelectorAll("[data-field]")).map((item) => [item.dataset.field, item])
);
const tabButtons = Array.from(document.querySelectorAll("[data-tab]"));
+ const programSelect = document.querySelector("[data-program-select]");
+ const frameSlider = document.querySelector("[data-frame-slider]");
+ const frameTable = document.querySelector("[data-frame-table]");
+ const stepTable = document.querySelector("[data-step-table]");
+ const objectTree = document.querySelector("[data-object-tree]");
+ const pathCurrent = document.querySelector("[data-path-current]");
+ const parserProgress = document.querySelector("[data-parser-progress]");
- const sources = {
- grl: "proc main()\n run_path pick_place\nend",
- abb: "MODULE A120Smoke\n PROC main()\n MoveJ home,v100,fine,tool0;\n ENDPROC\nENDMODULE",
- fanuc: "/PROG A120SMOKE\n/MN\n 1:J P[1] 40% FINE ;\n/END",
- kuka: "DEF A120SMOKE()\n PTP HOME\nEND"
+ const fallbackManifest = {
+ release_id: "local",
+ suite_id: "working2-abb120-spec",
+ job_id: "W2-JOB-latest",
+ robot_id: "abb_irb120_3_58",
+ report_html: "test-results/abb120-spec/W2-JOB-latest/report.html",
+ programs: [
+ {
+ program_id: "W2_60_IOWaitPulse",
+ file: "runtime/W2_60_IOWaitPulse.grl",
+ source: "",
+ coverage_level: "Runtime",
+ status: "pass",
+ spec_sections: [13],
+ diagnostics: [],
+ artifacts: {}
+ }
+ ]
};
- const state = {
+ const fallbackProgramData = {
+ sourceText: [
+ "language grl 0.1",
+ "module W2IOWaitPulse",
+ " const speed v = joint(35 %)",
+ " const zone zf = fine",
+ " target home = joint_target { joints: [0 deg, 0 deg, 0 deg, 0 deg, 0 deg, 0 deg] }",
+ " path io_path {",
+ " defaults { speed: v, zone: zf }",
+ " point p0 movej home",
+ " event at p0 distance 5 + 5 mm pulse io.do[20] duration 50 + 50 ms",
+ " }",
+ " proc main()",
+ " io.do[1] = true",
+ " io.ao[1] = 0.75",
+ " io.go[1] = 3",
+ " wait all(io.di[1] == true, io.di[2] == false) timeout 1 s on_timeout alarm \"all timeout\"",
+ " wait any(io.di[3] == true, io.di[4] == true) timeout 1 s",
+ " wait rising(io.di[5]) timeout 1 s",
+ " wait falling(io.di[6]) timeout 1 s",
+ " wait changed(io.di[7]) timeout 1 s",
+ " pulse io.do[2] duration 50 + 50 ms",
+ " run_path io_path",
+ " end",
+ "end"
+ ].join("\n"),
+ trajectory: {
+ sampleCount: 4,
+ duration: 0.24,
+ startJoints: [0, 0, 0, 0, 0, 0],
+ endJoints: [0.12, 0.03, -0.08, 0, 0.02, 0],
+ frames: [
+ frame(0, 0, "MOVEJ", "home", [0, 0, 0, 0, 0, 0], [0.374, 0, 0.63], { line: 8, column: 14 }),
+ frame(1, 0.08, "MOVEJ", "home", [0.04, 0.01, -0.026667, 0, 0.006667, 0], [0.377333, 0, 0.63], { line: 8, column: 14 }),
+ frame(2, 0.16, "MOVEJ", "home", [0.08, 0.02, -0.053333, 0, 0.013333, 0], [0.380667, 0, 0.63], { line: 8, column: 14 }),
+ frame(3, 0.24, "MOVEJ", "home", [0.12, 0.03, -0.08, 0, 0.02, 0], [0.384, 0, 0.63], { line: 8, column: 14 })
+ ],
+ diagnostics: []
+ },
+ controller: {
+ commands: [],
+ snapshot: {
+ runtime: {
+ pc: 0,
+ trace: []
+ },
+ state: {
+ state: "stopped",
+ diagnostics: []
+ }
+ }
+ },
+ motionQueue: {
+ items: [
+ {
+ id: "mq_local",
+ source: { kind: "path", pathId: "io_path", sourceMap: { line: 21, column: 5 } },
+ request: {
+ pathId: "io_path",
+ segments: [{ id: "p0", motion: "MOVEJ", targetId: "home", sourceMap: { line: 8, column: 14 } }],
+ events: [{ id: "event_0", timing: "at", pointId: "p0", kind: "pulse", sourceMap: { line: 9, column: 35 } }]
+ }
+ }
+ ]
+ },
+ trace: [
+ traceEntry(0, "io", "IO_WRITE", 12, 0),
+ traceEntry(0, "io", "IO_WRITE", 13, 1),
+ traceEntry(0, "io", "IO_WRITE", 14, 2),
+ traceEntry(0, "wait", "WAIT", 15, 3, { status: "satisfied" }),
+ traceEntry(0, "wait", "WAIT", 16, 4, { status: "satisfied" }),
+ traceEntry(0.1, "wait", "WAIT", 17, 5, { status: "satisfied" }),
+ traceEntry(0.1, "wait", "WAIT", 18, 6, { status: "satisfied" }),
+ traceEntry(0.1, "wait", "WAIT", 19, 7, { status: "satisfied" }),
+ traceEntry(0.1, "io", "PULSE", 20, 8),
+ traceEntry(0.1, "motion", "RUN_PATH", 21, 9, { queued: true })
+ ],
+ io: { image: { "io.di[1]": false, "io.do[1]": false }, events: [] },
+ compile: { moduleName: "W2IOWaitPulse", pathCount: 1, operationCount: 0 },
+ postReport: { filenames: ["W2IOWaitPulse.mod", "W2IOWaitPulse.ls", "W2IOWaitPulse.src"], report: [] },
+ roundtrip: {},
+ isFallback: true,
+ releaseId: "local",
+ errors: []
+ };
+
+ const app = {
+ manifest: fallbackManifest,
+ programs: fallbackManifest.programs,
+ selectedProgramId: "W2_60_IOWaitPulse",
+ programCache: new Map([["W2_60_IOWaitPulse", fallbackProgramData]]),
command: "ready",
mode: "auto",
motors: "on",
- pc: 0,
- joints: [0, 0, 0, 0, 0, 0],
- tcp: [0, 0, 580, 0, 0, 0],
+ tab: "grl",
+ currentFrameIndex: 0,
+ currentSampleIndex: 0,
+ playbackTime: 0,
+ playbackStartedAt: 0,
+ playbackTimeStart: 0,
+ playbackSampleIndex: 0,
+ samplePeriodSec: 0.05,
+ samplePeriodMs: 50,
di1: false,
do1: false,
wait: "none",
- queue: [],
- trace: ["ready"],
- diagnostics: ["ready"],
- report: "A120-REPORT",
- tab: "grl"
+ report: "W2-REPORT working2-abb120-spec",
+ localTrace: ["W2-JOB-latest ready"],
+ playbackTimer: 0,
+ programLoads: new Map(),
+ assetTextCache: new Map(),
+ assetRefreshes: new Set(),
+ parseStream: {
+ active: false,
+ timer: 0,
+ programId: "",
+ cursorLine: 0,
+ totalLines: 0,
+ linesPerTick: 1,
+ startedAt: 0,
+ completedProgramId: "",
+ lastSummary: "idle"
+ },
+ storage: {
+ mode: "checking",
+ hits: 0,
+ network: 0,
+ writes: 0,
+ errors: 0,
+ last: "checking browser storage"
+ }
};
- function formatArray(values) {
- return `[${values.map((value) => Number(value).toFixed(value % 1 === 0 ? 0 : 2)).join(", ")}]`;
+ window.__virtualController = app;
+ window.__vcErrors = [];
+
+ function frame(index, time, motion, targetId, joints, position, sourceMap) {
+ return {
+ index,
+ time,
+ motion,
+ targetId,
+ joints,
+ tcp: {
+ position,
+ quaternion: [0, 0.707107, 0, 0.707107]
+ },
+ sourceMap,
+ diagnostics: []
+ };
+ }
+
+ function traceEntry(time, kind, instructionKind, line, pc, data) {
+ return {
+ time,
+ kind,
+ procedure: "main",
+ pc,
+ instructionKind,
+ source: {
+ kind: instructionKind,
+ id: `main:${instructionKind}:${line}:5`,
+ sourceMap: { line, column: 5 },
+ procedureId: "main"
+ },
+ data,
+ id: pc + 1
+ };
+ }
+
+ function selectedProgram() {
+ return app.programs.find((program) => program.program_id === app.selectedProgramId) ?? app.programs[0];
+ }
+
+ function cachedProgramData(programId = app.selectedProgramId) {
+ return app.programCache.get(programId) ?? fallbackProgramData;
+ }
+
+ function selectedData() {
+ const data = cachedProgramData();
+ if (app.parseStream.active && app.parseStream.programId === app.selectedProgramId) {
+ return projectedProgramData(data, app.parseStream.cursorLine);
+ }
+ return data;
+ }
+
+ function projectedProgramData(data, cursorLine) {
+ const lines = (data.sourceText || fallbackProgramData.sourceText).split(/\r?\n/);
+ const visibleLineCount = Math.min(Math.max(Math.round(numberOr(cursorLine, 0)), 0), lines.length);
+ const sourceText = [
+ ...lines.slice(0, visibleLineCount),
+ ...(visibleLineCount < lines.length ? [`... parsing ${visibleLineCount}/${lines.length}`] : [])
+ ].join("\n");
+
+ return {
+ ...data,
+ sourceText,
+ trajectory: projectedTrajectory(data.trajectory, visibleLineCount),
+ controller: projectedController(data.controller, visibleLineCount),
+ motionQueue: projectedMotionQueue(data.motionQueue, visibleLineCount),
+ trace: projectedTrace(data.trace, visibleLineCount),
+ postReport: visibleLineCount >= lines.length ? data.postReport : { filenames: data.postReport?.filenames ?? [], report: [] },
+ isStreaming: true
+ };
+ }
+
+ function projectedTrajectory(trajectory, cursorLine) {
+ const sourceFrames = Array.isArray(trajectory?.frames) ? trajectory.frames : [];
+ const visibleFrames = sourceFrames.filter((item) => numberOr(item?.sourceMap?.line, 0) <= cursorLine);
+ const lastTime = numberOr(visibleFrames.at(-1)?.time, 0);
+ return {
+ sampleCount: visibleFrames.length,
+ duration: lastTime,
+ frames: visibleFrames,
+ diagnostics: Array.isArray(trajectory?.diagnostics)
+ ? trajectory.diagnostics.filter((item) => numberOr(item?.sourceMap?.line, 0) <= cursorLine)
+ : []
+ };
+ }
+
+ function projectedController(controller, cursorLine) {
+ const trace = Array.isArray(controller?.snapshot?.runtime?.trace)
+ ? controller.snapshot.runtime.trace.filter((item) => numberOr(item?.source?.sourceMap?.line, 0) <= cursorLine)
+ : [];
+ return {
+ ...controller,
+ snapshot: {
+ ...(controller?.snapshot ?? {}),
+ runtime: {
+ ...(controller?.snapshot?.runtime ?? {}),
+ trace
+ }
+ }
+ };
+ }
+
+ function projectedTrace(trace, cursorLine) {
+ return Array.isArray(trace)
+ ? trace.filter((item) => numberOr(item?.source?.sourceMap?.line, 0) <= cursorLine)
+ : [];
+ }
+
+ function projectedMotionQueue(motionQueue, cursorLine) {
+ const sourceItems = Array.isArray(motionQueue?.items) ? motionQueue.items : [];
+ const items = [];
+ for (const item of sourceItems) {
+ const parentLine = numberOr(item?.source?.sourceMap?.line ?? item?.source?.instruction?.sourceMap?.line, 0);
+ const request = item.request ?? {};
+ const segments = Array.isArray(request.segments)
+ ? request.segments.filter((segment) => numberOr(segment?.sourceMap?.line, 0) <= cursorLine)
+ : [];
+ const events = Array.isArray(request.events)
+ ? request.events.filter((event) => numberOr(event?.sourceMap?.line, 0) <= cursorLine)
+ : [];
+ if (parentLine > cursorLine && segments.length === 0 && events.length === 0) continue;
+ items.push({
+ ...item,
+ request: {
+ ...request,
+ segments,
+ events
+ }
+ });
+ }
+ return {
+ ...motionQueue,
+ items
+ };
+ }
+
+ function frames() {
+ const data = selectedData();
+ return normalizeFrames(data.trajectory, data.isFallback === true && data.isStreaming !== true);
+ }
+
+ function trajectoryDuration(items = frames()) {
+ const duration = Number(selectedData().trajectory?.duration);
+ const lastTime = Number(items.at(-1)?.time ?? 0);
+ const trace = selectedData().trace;
+ const traceTime = Array.isArray(trace)
+ ? trace.reduce((max, item) => Math.max(max, numberOr(item?.time, 0)), 0)
+ : 0;
+ return Math.max(
+ 0,
+ Number.isFinite(duration) ? duration : 0,
+ Number.isFinite(lastTime) ? lastTime : 0,
+ traceTime
+ );
+ }
+
+ function executionSamples() {
+ const items = frames();
+ const duration = trajectoryDuration(items);
+ const step = app.samplePeriodSec;
+ const times = [];
+
+ if (duration <= 0) {
+ times.push(0);
+ } else {
+ for (let time = 0; time < duration - 1e-9; time += step) {
+ times.push(Number(time.toFixed(6)));
+ }
+ if (times.length === 0 || Math.abs(times.at(-1) - duration) > 1e-9) {
+ times.push(Number(duration.toFixed(6)));
+ }
+ }
+
+ return times.map((time, index) => interpolateSample(items, time, index));
+ }
+
+ function hasTrajectoryData(data) {
+ const trajectory = data?.trajectory;
+ return Array.isArray(trajectory?.frames) && trajectory.frames.length > 0
+ || Array.isArray(trajectory?.startJoints)
+ || Array.isArray(trajectory?.endJoints);
+ }
+
+ function currentFrame() {
+ const samples = executionSamples();
+ return samples[Math.min(app.currentSampleIndex, Math.max(samples.length - 1, 0))]
+ ?? fallbackProgramData.trajectory.frames[0];
+ }
+
+ function currentSamples() {
+ return executionSamples();
+ }
+
+ function syncFrameIndexFromTime(time = app.playbackTime) {
+ const items = frames();
+ if (items.length === 0) {
+ app.currentFrameIndex = 0;
+ return;
+ }
+ let index = 0;
+ for (let i = 0; i < items.length; i += 1) {
+ if (items[i].time <= time + 1e-9) index = i;
+ else break;
+ }
+ app.currentFrameIndex = index;
+ }
+
+ function setSampleIndex(index) {
+ const samples = currentSamples();
+ const total = samples.length;
+ app.currentSampleIndex = Math.min(Math.max(Math.round(numberOr(index, 0)), 0), Math.max(total - 1, 0));
+ app.playbackTime = samples[app.currentSampleIndex]?.time ?? 0;
+ syncFrameIndexFromTime(app.playbackTime);
+ }
+
+ function setPlaybackTime(time) {
+ const samples = currentSamples();
+ if (samples.length === 0) {
+ app.currentSampleIndex = 0;
+ app.playbackTime = 0;
+ syncFrameIndexFromTime(0);
+ return;
+ }
+ const duration = samples.at(-1).time;
+ const clamped = Math.min(Math.max(numberOr(time, 0), 0), duration);
+ const sampleIndex = Math.min(Math.round(clamped / app.samplePeriodSec), samples.length - 1);
+ app.currentSampleIndex = sampleIndex;
+ app.playbackTime = samples[sampleIndex]?.time ?? clamped;
+ syncFrameIndexFromTime(app.playbackTime);
+ }
+
+ function resetExecutionClock() {
+ app.currentSampleIndex = 0;
+ app.currentFrameIndex = 0;
+ app.playbackTime = 0;
+ app.playbackStartedAt = 0;
+ app.playbackTimeStart = 0;
+ app.playbackSampleIndex = 0;
+ }
+
+ function syncExecutionClockToLatestSample() {
+ const samples = currentSamples();
+ app.currentSampleIndex = Math.max(samples.length - 1, 0);
+ app.playbackTime = samples.at(-1)?.time ?? 0;
+ syncFrameIndexFromTime(app.playbackTime);
+ }
+
+ function interpolateSample(items, time, sampleIndex) {
+ if (!Array.isArray(items) || items.length === 0) {
+ return frame(sampleIndex, time, "NO_MOTION", "no planned segment", [0, 0, 0, 0, 0, 0], [0, 0, 0]);
+ }
+
+ const first = items[0];
+ if (time <= first.time) return sampleFromFrame(first, time, sampleIndex);
+
+ const last = items.at(-1);
+ if (time >= last.time) return sampleFromFrame(last, time, sampleIndex);
+
+ let nextIndex = items.findIndex((item) => item.time >= time);
+ if (nextIndex <= 0) nextIndex = 1;
+ const previous = items[nextIndex - 1];
+ const next = items[nextIndex];
+ const span = Math.max(next.time - previous.time, 1e-9);
+ const ratio = Math.min(Math.max((time - previous.time) / span, 0), 1);
+ const source = ratio < 1 ? previous : next;
+
+ return {
+ index: sampleIndex,
+ time,
+ motion: source.motion || next.motion || previous.motion || "MOVEJ",
+ segmentId: source.segmentId ?? next.segmentId ?? previous.segmentId,
+ targetId: source.targetId ?? next.targetId ?? previous.targetId,
+ joints: interpolateArray(previous.joints, next.joints, ratio),
+ tcp: {
+ position: interpolateArray(previous.tcp.position, next.tcp.position, ratio),
+ quaternion: normalizeQuaternion(interpolateArray(previous.tcp.quaternion, next.tcp.quaternion, ratio))
+ },
+ sourceMap: source.sourceMap,
+ trajectoryFrameIndex: source.index,
+ diagnostics: [...(previous.diagnostics ?? []), ...(next.diagnostics ?? [])]
+ };
+ }
+
+ function sampleFromFrame(item, time, sampleIndex) {
+ return {
+ ...item,
+ index: sampleIndex,
+ time,
+ joints: [...item.joints],
+ tcp: {
+ position: [...item.tcp.position],
+ quaternion: [...item.tcp.quaternion]
+ },
+ trajectoryFrameIndex: item.index
+ };
+ }
+
+ function interpolateArray(start, end, ratio) {
+ const a = Array.isArray(start) ? start : [];
+ const b = Array.isArray(end) ? end : [];
+ return Array.from({ length: Math.max(a.length, b.length) }, (_item, index) => {
+ const left = numberOr(a[index], 0);
+ const right = numberOr(b[index], left);
+ return left + (right - left) * ratio;
+ });
+ }
+
+ function normalizeQuaternion(values) {
+ const q = padNumbers(values, 4, [0, 0.707107, 0, 0.707107]);
+ const length = Math.hypot(q[0], q[1], q[2], q[3]);
+ if (length <= 1e-9) return [0, 0.707107, 0, 0.707107];
+ return q.map((value) => value / length);
+ }
+
+ function normalizeFrames(trajectory, allowFallback) {
+ if (Array.isArray(trajectory?.frames) && trajectory.frames.length > 0) {
+ return trajectory.frames.map((item, index) => ({
+ index: numberOr(item.index, index),
+ time: numberOr(item.time, index * 0.02),
+ motion: item.motion || "MOVEJ",
+ segmentId: item.segmentId,
+ targetId: item.targetId,
+ joints: padNumbers(item.joints, 6),
+ tcp: {
+ position: padNumbers(item.tcp?.position, 3),
+ quaternion: padNumbers(item.tcp?.quaternion, 4, [0, 0.707107, 0, 0.707107])
+ },
+ sourceMap: item.sourceMap,
+ diagnostics: Array.isArray(item.diagnostics) ? item.diagnostics : []
+ }));
+ }
+
+ if (Array.isArray(trajectory?.startJoints) || Array.isArray(trajectory?.endJoints)) {
+ return [
+ frame(0, 0, "MOVEJ", "start", padNumbers(trajectory.startJoints, 6), [0.374, 0, 0.63]),
+ frame(1, numberOr(trajectory.duration, 0), "MOVEJ", "end", padNumbers(trajectory.endJoints, 6), [0.384, 0, 0.63])
+ ];
+ }
+
+ if (allowFallback) return fallbackProgramData.trajectory.frames;
+ return [frame(0, 0, "NO_MOTION", "no planned segment", [0, 0, 0, 0, 0, 0], [0, 0, 0])];
+ }
+
+ function padNumbers(values, length, fallback) {
+ const source = Array.isArray(values) ? values : fallback ?? [];
+ return Array.from({ length }, (_item, index) => numberOr(source[index], 0));
+ }
+
+ function numberOr(value, fallback) {
+ const number = Number(value);
+ return Number.isFinite(number) ? number : fallback;
+ }
+
+ function sourceMapLine(value) {
+ return numberOr(value?.sourceMap?.line ?? value?.source?.sourceMap?.line, 0);
+ }
+
+ function formatNumber(value, digits) {
+ const fixed = Number(value).toFixed(digits);
+ return fixed.replace(/\.?0+$/, "");
+ }
+
+ function formatArray(values, digits) {
+ return `[${values.map((value) => formatNumber(value, digits)).join(", ")}]`;
}
function setField(name, value) {
@@ -38,103 +537,1267 @@
if (item) item.textContent = value;
}
- function render() {
- root?.setAttribute("data-last-command", state.command);
- root?.setAttribute("data-running", String(state.command === "running"));
- setField("state", state.command);
- setField("mode", state.mode);
- setField("motors", state.motors);
- setField("pc", `main:${state.pc}`);
- setField("joints", formatArray(state.joints));
- setField("tcp", formatArray(state.tcp));
- setField("log", state.trace.at(-1) ?? "ready");
- setField("diagnostics", state.diagnostics.at(-1) ?? "ready");
- setField("io", `do[1]=${state.do1}, di[1]=${state.di1}`);
- setField("wait", state.wait);
- setField("queue", state.queue.length ? state.queue.join(" -> ") : "empty");
- setField("trace", `${state.trace.length} events`);
- setField("reports", state.report);
- setField("editor", sources[state.tab]);
+ function resolvePackageUrl(relativePath) {
+ if (!relativePath) return "";
+ return new URL(`../${relativePath.replace(/^\/+/, "")}`, window.location.href).href;
+ }
- for (const button of tabButtons) {
- button.setAttribute("aria-pressed", String(button.dataset.tab === state.tab));
+ function packageCacheKey(relativePath) {
+ if (!relativePath) return "";
+ try {
+ const url = new URL(resolvePackageUrl(relativePath));
+ return `package:${url.origin}${url.pathname}`;
+ } catch (_error) {
+ return `package:${relativePath}`;
}
}
- function pushTrace(message) {
- state.trace.push(message);
- state.diagnostics.push(message);
+ function cacheFileName(key) {
+ try {
+ return window.btoa(key).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, "");
+ } catch (_error) {
+ return key.replace(/[^a-z0-9_.-]/gi, "_").slice(0, 180);
+ }
}
- function advanceProgram(stepSize) {
- state.pc = Math.min(state.pc + stepSize, 4);
- state.joints = state.joints.map((value, index) => Number((value + (index + 1) * 1.5 * stepSize).toFixed(2)));
- state.tcp = [
- Number((state.tcp[0] + 12 * stepSize).toFixed(2)),
- Number((state.tcp[1] + 4 * stepSize).toFixed(2)),
- state.tcp[2],
- state.tcp[3],
- state.tcp[4],
- state.tcp[5]
+ function shortName(value) {
+ const name = String(value || "").split(/[?#]/)[0].split("/").pop() || String(value || "asset");
+ return name.length > 48 ? `${name.slice(0, 45)}...` : name;
+ }
+
+ const opfs = {
+ directory: undefined
+ };
+
+ async function opfsDirectory() {
+ if (opfs.directory) return opfs.directory;
+ opfs.directory = (async () => {
+ if (!navigator.storage?.getDirectory) {
+ app.storage.mode = "localStorage";
+ app.storage.last = "OPFS unavailable";
+ return null;
+ }
+ try {
+ const rootDirectory = await navigator.storage.getDirectory();
+ const directory = await rootDirectory.getDirectoryHandle("kdl-virtual-controller", { create: true });
+ app.storage.mode = "OPFS";
+ app.storage.last = "OPFS ready";
+ return directory;
+ } catch (error) {
+ app.storage.mode = "localStorage";
+ app.storage.errors += 1;
+ app.storage.last = `OPFS blocked: ${error instanceof Error ? error.name : "error"}`;
+ return null;
+ }
+ })();
+ return opfs.directory;
+ }
+
+ async function readOpfsText(key) {
+ const directory = await opfsDirectory();
+ if (!directory) return undefined;
+ try {
+ const handle = await directory.getFileHandle(cacheFileName(key));
+ const file = await handle.getFile();
+ return await file.text();
+ } catch (_error) {
+ return undefined;
+ }
+ }
+
+ async function writeOpfsText(key, text) {
+ const directory = await opfsDirectory();
+ if (!directory) return false;
+ try {
+ const handle = await directory.getFileHandle(cacheFileName(key), { create: true });
+ const writable = await handle.createWritable();
+ await writable.write(text);
+ await writable.close();
+ return true;
+ } catch (error) {
+ app.storage.errors += 1;
+ app.storage.last = `OPFS write failed: ${error instanceof Error ? error.name : "error"}`;
+ return false;
+ }
+ }
+
+ function readLocalStorageText(key) {
+ try {
+ const value = window.localStorage?.getItem(`kdl-vc-cache:${key}`);
+ return value ?? undefined;
+ } catch (_error) {
+ return undefined;
+ }
+ }
+
+ function writeLocalStorageText(key, text) {
+ try {
+ if (text.length > 2_000_000) return false;
+ window.localStorage?.setItem(`kdl-vc-cache:${key}`, text);
+ return true;
+ } catch (_error) {
+ return false;
+ }
+ }
+
+ async function readCachedTextByKey(key, label) {
+ if (!key) return undefined;
+ if (app.assetTextCache.has(key)) {
+ app.storage.hits += 1;
+ app.storage.last = `memory ${shortName(label ?? key)}`;
+ return app.assetTextCache.get(key);
+ }
+
+ const opfsText = await readOpfsText(key);
+ if (typeof opfsText === "string") {
+ app.assetTextCache.set(key, opfsText);
+ app.storage.hits += 1;
+ app.storage.last = `OPFS ${shortName(label ?? key)}`;
+ return opfsText;
+ }
+
+ const localStorageText = readLocalStorageText(key);
+ if (typeof localStorageText === "string") {
+ app.assetTextCache.set(key, localStorageText);
+ app.storage.hits += 1;
+ app.storage.last = `localStorage ${shortName(label ?? key)}`;
+ return localStorageText;
+ }
+
+ return undefined;
+ }
+
+ async function writeCachedTextByKey(key, text, label) {
+ if (!key || typeof text !== "string") return;
+ app.assetTextCache.set(key, text);
+ const opfsWritten = await writeOpfsText(key, text);
+ const localStorageWritten = writeLocalStorageText(key, text);
+ if (opfsWritten || localStorageWritten) {
+ app.storage.writes += 1;
+ app.storage.last = `${opfsWritten ? "OPFS" : "localStorage"} saved ${shortName(label ?? key)}`;
+ }
+ }
+
+ async function fetchTextFromNetwork(relativePath, options = {}) {
+ if (!relativePath) return undefined;
+ const controller = typeof AbortController === "function" ? new AbortController() : undefined;
+ const timeoutMs = Number.isFinite(options.timeoutMs) ? options.timeoutMs : 3500;
+ const timeout = controller
+ ? window.setTimeout(() => controller.abort(), timeoutMs)
+ : 0;
+ try {
+ const response = await fetch(resolvePackageUrl(relativePath), {
+ cache: "no-store",
+ signal: controller?.signal
+ });
+ if (!response.ok) throw new Error(`${response.status} ${response.statusText}`);
+ const text = await response.text();
+ app.storage.network += 1;
+ app.storage.last = `network ${shortName(relativePath)}`;
+ void writeCachedTextByKey(packageCacheKey(relativePath), text, relativePath);
+ return text;
+ } catch (error) {
+ app.storage.errors += 1;
+ app.storage.last = `network ${shortName(relativePath)} ${error instanceof Error ? error.name : "error"}`;
+ return undefined;
+ } finally {
+ if (timeout) window.clearTimeout(timeout);
+ }
+ }
+
+ function refreshPackageAsset(relativePath, options = {}) {
+ const key = packageCacheKey(relativePath);
+ if (!key || app.assetRefreshes.has(key)) return;
+ app.assetRefreshes.add(key);
+ void fetchTextFromNetwork(relativePath, options).finally(() => {
+ app.assetRefreshes.delete(key);
+ });
+ }
+
+ async function optionalText(relativePath, options = {}) {
+ if (!relativePath) return "";
+ let triedNetwork = false;
+ if (options.networkFirst) {
+ triedNetwork = true;
+ const text = await fetchTextFromNetwork(relativePath, options);
+ if (typeof text === "string") return text;
+ }
+
+ const key = packageCacheKey(relativePath);
+ const cached = await readCachedTextByKey(key, relativePath);
+ if (typeof cached === "string") {
+ if (!options.networkFirst && options.refresh !== false) refreshPackageAsset(relativePath, options);
+ return cached;
+ }
+
+ if (triedNetwork) return "";
+ const text = await fetchTextFromNetwork(relativePath, options);
+ return text ?? "";
+ }
+
+ async function optionalJson(relativePath, options = {}) {
+ const text = await optionalText(relativePath, options);
+ if (!text) return undefined;
+ try {
+ return JSON.parse(text);
+ } catch (error) {
+ app.storage.errors += 1;
+ app.storage.last = `JSON ${shortName(relativePath)} ${error instanceof Error ? error.name : "error"}`;
+ return undefined;
+ }
+ }
+
+ function applyManifest(manifest) {
+ app.manifest = manifest;
+ if (manifest.release_id !== "local") {
+ for (const [programId, data] of app.programCache) {
+ if (data.releaseId && data.releaseId !== manifest.release_id && data.releaseId !== "local") {
+ app.programCache.delete(programId);
+ }
+ }
+ }
+ app.programs = Array.isArray(manifest.programs) && manifest.programs.length > 0
+ ? manifest.programs
+ : fallbackManifest.programs;
+ app.selectedProgramId = chooseDefaultProgram(app.selectedProgramId);
+ app.report = manifest.report_html ? `${manifest.job_id} report` : app.report;
+ root?.setAttribute("data-robot", manifest.robot_id ?? "abb_irb120_3_58");
+ root?.setAttribute("data-suite", manifest.suite_id ?? "working2-abb120-spec");
+ root?.setAttribute("data-job", manifest.job_id ?? "W2-JOB-latest");
+ populateProgramSelect();
+ }
+
+ function chooseDefaultProgram(current) {
+ const ids = app.programs.map((program) => program.program_id);
+ if (current && ids.includes(current)) return current;
+ if (ids.includes("W2_60_IOWaitPulse")) return "W2_60_IOWaitPulse";
+ return ids[0] ?? "W2_60_IOWaitPulse";
+ }
+
+ function populateProgramSelect() {
+ if (!programSelect) return;
+ programSelect.textContent = "";
+ for (const program of app.programs) {
+ const option = document.createElement("option");
+ option.value = program.program_id;
+ option.textContent = `${program.program_id} (${program.coverage_level}/${program.status})`;
+ programSelect.append(option);
+ }
+ programSelect.value = app.selectedProgramId;
+ }
+
+ async function loadManifest() {
+ const manifest = await optionalJson("demo-manifest.json", {
+ networkFirst: true,
+ timeoutMs: 2500,
+ refresh: false
+ });
+ if (!manifest) return;
+ applyManifest(manifest);
+ void ensureProgramLoaded(app.selectedProgramId).then((data) => {
+ if (!data.isFallback) {
+ if (!["ready", "loading"].includes(app.command)) return;
+ startParseStream(app.selectedProgramId, "manifest");
+ }
+ });
+ resetExecutionClock();
+ render();
+ }
+
+ async function ensureProgramLoaded(programId) {
+ const cachedData = app.programCache.get(programId);
+ if (cachedData && cachedData.releaseId === app.manifest.release_id && (cachedData.isFallback || hasTrajectoryData(cachedData))) {
+ return cachedData;
+ }
+ if (app.programLoads.has(programId)) return app.programLoads.get(programId);
+
+ const load = loadProgramData(programId).finally(() => {
+ app.programLoads.delete(programId);
+ });
+ app.programLoads.set(programId, load);
+ return load;
+ }
+
+ async function loadProgramData(programId) {
+ const program = app.programs.find((item) => item.program_id === programId);
+ if (!program) return fallbackProgramData;
+
+ const artifacts = program.artifacts ?? {};
+ const [
+ sourceText,
+ trajectory,
+ controller,
+ motionQueue,
+ trace,
+ io,
+ compile,
+ postReport,
+ roundtrip
+ ] = await Promise.all([
+ optionalText(program.source),
+ optionalJson(artifacts.trajectory),
+ optionalJson(artifacts.controller),
+ optionalJson(artifacts.motion_queue),
+ optionalJson(artifacts.trace),
+ optionalJson(artifacts.io),
+ optionalJson(artifacts.compile),
+ optionalJson(artifacts.post_report),
+ optionalJson(artifacts.roundtrip)
+ ]);
+
+ const data = {
+ sourceText: sourceText || fallbackProgramData.sourceText,
+ trajectory: trajectory ?? {},
+ controller: controller ?? {},
+ motionQueue: motionQueue ?? {},
+ trace: Array.isArray(trace) ? trace : [],
+ io: io ?? {},
+ compile: compile ?? {},
+ postReport: postReport ?? {},
+ roundtrip: roundtrip ?? {},
+ isFallback: false,
+ releaseId: app.manifest.release_id ?? "local",
+ errors: []
+ };
+ if (hasTrajectoryData(data) || !app.programCache.has(programId)) {
+ app.programCache.set(programId, data);
+ }
+ return data;
+ }
+
+ function sourceLineCount(data) {
+ return (data.sourceText || fallbackProgramData.sourceText).split(/\r?\n/).length;
+ }
+
+ function sourceFrameCount(data) {
+ return Array.isArray(data?.trajectory?.frames) ? data.trajectory.frames.length : 0;
+ }
+
+ function visibleSourceFrameCount() {
+ const data = selectedData();
+ return Array.isArray(data?.trajectory?.frames) ? data.trajectory.frames.length : 0;
+ }
+
+ function stopParseStream() {
+ if (app.parseStream.timer) {
+ window.clearInterval(app.parseStream.timer);
+ app.parseStream.timer = 0;
+ }
+ app.parseStream.active = false;
+ }
+
+ function resetParseStreamSummary(message = "idle") {
+ stopParseStream();
+ app.parseStream.programId = "";
+ app.parseStream.cursorLine = 0;
+ app.parseStream.totalLines = 0;
+ app.parseStream.linesPerTick = 1;
+ app.parseStream.startedAt = 0;
+ app.parseStream.lastSummary = message;
+ }
+
+ function startParseStream(programId, reason) {
+ const data = cachedProgramData(programId);
+ const totalLines = sourceLineCount(data);
+ stopParseStream();
+ resetExecutionClock();
+ app.command = "parsing";
+ app.parseStream.active = true;
+ app.parseStream.programId = programId;
+ app.parseStream.cursorLine = 0;
+ app.parseStream.totalLines = totalLines;
+ app.parseStream.linesPerTick = Math.max(1, Math.ceil(totalLines / 24));
+ app.parseStream.startedAt = performance.now();
+ app.parseStream.completedProgramId = "";
+ app.parseStream.lastSummary = `parsing 0/${totalLines} lines`;
+ pushTrace(`${programId} parsing ${reason} from ${storageModeLabel()}`);
+ render();
+ app.parseStream.timer = window.setInterval(advanceParseStream, app.samplePeriodMs);
+ advanceParseStream();
+ }
+
+ function advanceParseStream() {
+ if (!app.parseStream.active) return;
+ const data = cachedProgramData(app.parseStream.programId);
+ app.parseStream.totalLines = sourceLineCount(data);
+ app.parseStream.cursorLine = Math.min(
+ app.parseStream.totalLines,
+ app.parseStream.cursorLine + app.parseStream.linesPerTick
+ );
+ syncExecutionClockToLatestSample();
+ const parsedFrames = visibleSourceFrameCount();
+ const totalFrames = sourceFrameCount(data);
+ app.parseStream.lastSummary = [
+ `parsing ${app.parseStream.cursorLine}/${app.parseStream.totalLines} lines`,
+ `frames ${Math.min(parsedFrames, totalFrames)}/${totalFrames}`,
+ `t=${formatNumber(app.playbackTime, 3)} s`
+ ].join(", ");
+ if (app.parseStream.cursorLine >= app.parseStream.totalLines) {
+ finishParseStream("ready");
+ return;
+ }
+ render();
+ }
+
+ function finishParseStream(nextCommand = "ready") {
+ const programId = app.parseStream.programId || app.selectedProgramId;
+ const data = cachedProgramData(programId);
+ stopParseStream();
+ app.parseStream.cursorLine = sourceLineCount(data);
+ app.parseStream.totalLines = app.parseStream.cursorLine;
+ app.parseStream.completedProgramId = programId;
+ app.parseStream.lastSummary = `parsed ${app.parseStream.totalLines} lines, ${sourceFrameCount(data)} frames`;
+ app.command = nextCommand;
+ resetExecutionClock();
+ pushTrace(`${programId} parsed (${sourceFrameCount(data)} frames, ${executionSamples().length} samples @50ms)`);
+ render();
+ }
+
+ function finishParseStreamForCommand() {
+ if (!app.parseStream.active) return;
+ finishParseStream("ready");
+ }
+
+ function parserText() {
+ return app.parseStream.active ? app.parseStream.lastSummary : app.parseStream.lastSummary || "idle";
+ }
+
+ function parserProgressValue() {
+ if (app.parseStream.totalLines <= 0) return app.parseStream.active ? 0 : 1;
+ return Math.min(Math.max(app.parseStream.cursorLine / app.parseStream.totalLines, 0), 1);
+ }
+
+ async function selectProgram(programId) {
+ stopPlayback();
+ stopParseStream();
+ app.selectedProgramId = programId;
+ app.command = "loading";
+ resetExecutionClock();
+ app.di1 = false;
+ app.do1 = false;
+ app.wait = "none";
+ pushTrace(`${programId} loading from ${storageModeLabel()}`);
+ render();
+ try {
+ await ensureProgramLoaded(programId);
+ if (app.selectedProgramId !== programId) return;
+ startParseStream(programId, "selection");
+ } catch (error) {
+ if (app.selectedProgramId === programId) reportRuntimeError(`${programId} select`, error);
+ }
+ }
+
+ function commandTrace() {
+ const trace = selectedData().trace;
+ if (Array.isArray(trace) && trace.length > 0) return trace;
+ return [];
+ }
+
+ function diagnosticText() {
+ const data = selectedData();
+ const diagnostics = [
+ ...((data.controller?.snapshot?.state?.diagnostics) ?? []),
+ ...((data.trajectory?.diagnostics) ?? []),
+ ...((data.postReport?.report) ?? [])
];
+ const latest = diagnostics.at(-1);
+ if (!latest) {
+ const program = selectedProgram();
+ return `${program?.status ?? "ready"} / ${program?.coverage_level ?? "Runtime"}`;
+ }
+ return `${latest.code ?? latest.severity}: ${latest.message ?? ""}`.trim();
}
- function handleCommand(command) {
- state.command = command === "run" ? "running" : command;
+ function queueItems() {
+ const items = selectedData().motionQueue?.items;
+ return Array.isArray(items) ? items : [];
+ }
+
+ function queueText() {
+ const items = queueItems();
+ if (items.length === 0) return "empty";
+ return items.map((item) => {
+ const pathId = item.request?.pathId ?? item.source?.pathId ?? item.id;
+ const motions = Array.isArray(item.request?.segments)
+ ? item.request.segments.map((segment) => segment.motion).join("/")
+ : item.kind ?? "motion";
+ return `${pathId}:${motions}`;
+ }).join(" -> ");
+ }
+
+ function ioText() {
+ const image = selectedData().io?.image ?? {};
+ const do1 = app.do1 || image["io.do[1]"] === true;
+ return `do[1]=${do1}, di[1]=${app.di1}, io=${Object.keys(image).length}`;
+ }
+
+ function storageModeLabel() {
+ const mode = app.storage.mode === "checking" ? "cache" : app.storage.mode;
+ return `${mode} h${app.storage.hits}/n${app.storage.network}/w${app.storage.writes}/e${app.storage.errors}`;
+ }
+
+ function storageText() {
+ return `${storageModeLabel()} ${app.storage.last}`;
+ }
+
+ function reportRuntimeError(context, error) {
+ const message = `${context}: ${error instanceof Error ? error.message : String(error)}`;
+ window.__vcErrors.push(message);
+ app.storage.errors += 1;
+ app.storage.last = message;
+ pushTrace(message);
+ render();
+ }
+
+ function sourceTextForTab(tab) {
+ const program = selectedProgram();
+ const data = selectedData();
+ if (tab === "grl") return data.sourceText || fallbackProgramData.sourceText;
+
+ const moduleName = data.compile?.moduleName ?? (program?.program_id ?? "W2Program").replace(/^W2_/, "W2");
+ const filenames = Array.isArray(data.postReport?.filenames) ? data.postReport.filenames : [];
+ if (tab === "abb") {
+ return [
+ `MODULE ${moduleName}`,
+ ` ! ${filenames.find((name) => name.endsWith(".mod")) ?? `${moduleName}.mod`}`,
+ " PROC main()",
+ " ! See post-report.json for generated brand diagnostics.",
+ " ENDPROC",
+ "ENDMODULE"
+ ].join("\n");
+ }
+ if (tab === "fanuc") {
+ return [
+ `/PROG ${moduleName.toUpperCase()}`,
+ `/ATTR`,
+ `COMMENT = "${filenames.find((name) => name.endsWith(".ls")) ?? `${moduleName}.ls`}";`,
+ "/MN",
+ " 1: ! See post-report.json ;",
+ "/END"
+ ].join("\n");
+ }
+ return [
+ `DEF ${moduleName}()`,
+ ` ; ${filenames.find((name) => name.endsWith(".src")) ?? `${moduleName}.src`}`,
+ " ; See post-report.json",
+ "END"
+ ].join("\n");
+ }
+
+ function updateObjectTree() {
+ if (!objectTree) return;
+ const program = selectedProgram();
+ const items = queueItems();
+ const pathNames = [...new Set(items.map((item) => item.request?.pathId ?? item.source?.pathId).filter(Boolean))];
+ const entries = [
+ `Robot: ${app.manifest.robot_id ?? "abb_irb120_3_58"}`,
+ "Tool: tool0",
+ "Frame: world",
+ `Path: ${pathNames.join(", ") || "pick_place"}`,
+ `Program: ${program?.program_id ?? "W2_60_IOWaitPulse"}`,
+ `Coverage: ${program?.coverage_level ?? "Runtime"}`,
+ `Status: ${program?.status ?? "pass"}`,
+ `Frames: ${frames().length}`,
+ `Suite: ${app.manifest.suite_id ?? "working2-abb120-spec"}`,
+ `Job: ${app.manifest.job_id ?? "W2-JOB-latest"}`,
+ "Reports"
+ ];
+ objectTree.textContent = "";
+ for (const entry of entries) {
+ const item = document.createElement("li");
+ item.textContent = entry;
+ objectTree.append(item);
+ }
+ }
+
+ function updateFrameSlider() {
+ if (!frameSlider) return;
+ const samples = currentSamples();
+ frameSlider.max = String(Math.max(samples.length - 1, 0));
+ frameSlider.value = String(Math.min(app.currentSampleIndex, Math.max(samples.length - 1, 0)));
+ }
+
+ function updatePathMarker() {
+ if (!pathCurrent) return;
+ const duration = trajectoryDuration();
+ const ratio = duration > 0 ? Math.min(Math.max(app.playbackTime / duration, 0), 1) : 0;
+ const x = 70 + ratio * 340;
+ const y = 170 - Math.sin(ratio * Math.PI) * 80 - ratio * 20;
+ pathCurrent.setAttribute("cx", String(formatNumber(x, 2)));
+ pathCurrent.setAttribute("cy", String(formatNumber(y, 2)));
+ }
+
+ function sourceLines() {
+ return (selectedData().sourceText || fallbackProgramData.sourceText).split(/\r?\n/);
+ }
+
+ function sourceLineText(line) {
+ const index = Math.round(numberOr(line, 0)) - 1;
+ return sourceLines()[index]?.trim() ?? "";
+ }
+
+ function mainProcedureRange() {
+ const lines = sourceLines();
+ const startIndex = lines.findIndex((line) => /^\s*proc\s+main\s*\(/i.test(line));
+ if (startIndex < 0) return { start: 0, end: 0 };
+ const startIndent = leadingSpaces(lines[startIndex]);
+ for (let index = startIndex + 1; index < lines.length; index += 1) {
+ if (/^\s*end\b/i.test(lines[index]) && leadingSpaces(lines[index]) <= startIndent) {
+ return { start: startIndex + 1, end: index + 1 };
+ }
+ }
+ return { start: startIndex + 1, end: lines.length };
+ }
+
+ function leadingSpaces(text) {
+ return String(text ?? "").match(/^\s*/)?.[0].length ?? 0;
+ }
+
+ function setupStepsBefore(firstLine) {
+ const range = mainProcedureRange();
+ if (range.start <= 0) return [];
+ const steps = [];
+ const lines = sourceLines();
+ const limit = Math.max(numberOr(firstLine, range.end + 1), range.start + 1);
+ for (let line = range.start + 1; line < Math.min(limit, range.end); line += 1) {
+ const text = lines[line - 1]?.trim() ?? "";
+ if (!/^(set_tool|set_frame)\b/i.test(text)) continue;
+ steps.push({
+ kind: "setup",
+ label: "Setup",
+ line,
+ text,
+ timeStart: 0,
+ timeEnd: 0,
+ sampleStart: 0,
+ sampleEnd: 0,
+ detail: text.replace(/\s+/g, " ")
+ });
+ }
+ return steps;
+ }
+
+ function traceInstructionSteps() {
+ const steps = [];
+ let lastKey = "";
+ for (const entry of commandTrace()) {
+ const line = numberOr(entry?.source?.sourceMap?.line, 0);
+ if (line <= 0 || entry?.kind === "load") continue;
+ const kind = entry.instructionKind ?? entry.source?.kind ?? entry.kind ?? "instruction";
+ const key = `${line}:${kind}`;
+ const time = numberOr(entry.time, 0);
+ if (key === lastKey && steps.length > 0) {
+ const previous = steps.at(-1);
+ previous.timeEnd = Math.max(numberOr(previous.timeEnd, time), time);
+ previous.detail = mergeDetails(previous.detail, traceDetail(entry));
+ continue;
+ }
+ const text = sourceLineText(line);
+ steps.push({
+ kind: String(kind).toLowerCase(),
+ label: stepLabel(kind, text),
+ line,
+ text,
+ timeStart: time,
+ timeEnd: time,
+ pc: numberOr(entry.pc, 0),
+ traceKind: entry.kind,
+ detail: traceDetail(entry)
+ });
+ lastKey = key;
+ }
+ return steps;
+ }
+
+ function traceDetail(entry) {
+ const data = entry?.data ?? {};
+ if (Array.isArray(data.result) && data.result.length > 0) {
+ return data.result.map((item) => {
+ const target = item.target?.raw ?? item.target?.domain ?? item.kind ?? "io";
+ return `${target}=${String(item.value)}`;
+ }).join(", ");
+ }
+ if (data.status) return `status=${data.status}`;
+ if (data.queued === true) return "queued";
+ if (data.alarmId) return `alarm=${data.alarmId}`;
+ if (entry?.diagnostic?.code) return entry.diagnostic.code;
+ if (entry?.message) return entry.message;
+ return "";
+ }
+
+ function mergeDetails(left, right) {
+ if (!right) return left ?? "";
+ if (!left) return right;
+ return left.includes(right) ? left : `${left}; ${right}`;
+ }
+
+ function stepLabel(kind, text) {
+ const source = String(text ?? "").trim().toLowerCase();
+ const normalized = String(kind ?? "").toUpperCase();
+ if (/^set_(tool|frame)\b/.test(source)) return "Setup";
+ if (/^run_operation\b/.test(source) || normalized === "RUN_OPERATION") return "Operation";
+ if (/^run_path\b/.test(source) || normalized === "RUN_PATH") return "Path";
+ if (/^point\b/.test(source)) return "Path Point";
+ if (/^event\b/.test(source)) return "Path Event";
+ if (/^(movej|movel|movec|moveabsj)\b/.test(source) || /^MOVE/.test(normalized)) return "Motion";
+ if (/^wait\b/.test(source) || normalized === "WAIT") return "Wait";
+ if (/^pulse\b/.test(source) || normalized === "PULSE") return "Pulse";
+ if (/^io\./.test(source) || normalized === "IO_WRITE") return "IO";
+ if (/^(if|elseif|else|while|for|switch|case|break|continue)\b/.test(source) || normalized.startsWith("EXEC_")) return "Control";
+ if (/^call\b/.test(source)) return "Call";
+ if (/^return\b/.test(source)) return "Return";
+ if (normalized === "ALARM") return "Alarm";
+ return normalized.replace(/^RAW_/, "").replace(/_/g, " ").toLowerCase();
+ }
+
+ function sampleGroups(samples = currentSamples()) {
+ const groups = [];
+ for (const sample of samples) {
+ const line = numberOr(sample?.sourceMap?.line, 0);
+ if (line <= 0) continue;
+ const key = [
+ line,
+ sample.motion ?? "",
+ sample.targetId ?? sample.segmentId ?? ""
+ ].join(":");
+ const previous = groups.at(-1);
+ if (previous?.key === key && previous.sampleEnd + 1 === sample.index) {
+ previous.sampleEnd = sample.index;
+ previous.timeEnd = numberOr(sample.time, previous.timeEnd);
+ } else {
+ groups.push({
+ id: `sample:${groups.length}`,
+ key,
+ line,
+ motion: sample.motion ?? "",
+ target: sample.targetId ?? sample.segmentId ?? "",
+ sampleStart: sample.index,
+ sampleEnd: sample.index,
+ timeStart: numberOr(sample.time, 0),
+ timeEnd: numberOr(sample.time, 0)
+ });
+ }
+ }
+ return groups;
+ }
+
+ function applySampleGroup(step, group) {
+ if (!group) return step;
+ step.motion = group.motion || step.motion;
+ step.target = group.target || step.target;
+ step.sampleStart = group.sampleStart;
+ step.sampleEnd = group.sampleEnd;
+ step.timeStart = Math.min(numberOr(step.timeStart, group.timeStart), group.timeStart);
+ step.timeEnd = Math.max(numberOr(step.timeEnd, group.timeEnd), group.timeEnd);
+ return step;
+ }
+
+ function nearestSampleIndex(time, samples = currentSamples()) {
+ if (samples.length === 0) return 0;
+ let bestIndex = 0;
+ let bestDistance = Infinity;
+ for (const sample of samples) {
+ const distance = Math.abs(numberOr(sample.time, 0) - numberOr(time, 0));
+ if (distance < bestDistance) {
+ bestDistance = distance;
+ bestIndex = sample.index;
+ }
+ }
+ return bestIndex;
+ }
+
+ function findUnusedGroup(line, groups, usedGroupIds) {
+ const group = groups.find((item) => item.line === line && !usedGroupIds.has(item.id))
+ ?? groups.find((item) => item.line === line);
+ if (group) usedGroupIds.add(group.id);
+ return group;
+ }
+
+ function queueChildrenForStep(step, groups, usedGroupIds) {
+ const children = [];
+ for (const item of queueItems()) {
+ const parentLine = numberOr(item?.source?.sourceMap?.line ?? item?.source?.instruction?.sourceMap?.line, 0);
+ if (parentLine !== step.line) continue;
+ const request = item.request ?? {};
+ const segments = Array.isArray(request.segments) ? request.segments : [];
+ const events = Array.isArray(request.events) ? request.events : [];
+ const eventsByPoint = new Map();
+ const looseEvents = [];
+ for (const event of events) {
+ const pointId = event.pointId ?? "";
+ if (!pointId) {
+ looseEvents.push(event);
+ continue;
+ }
+ if (!eventsByPoint.has(pointId)) eventsByPoint.set(pointId, []);
+ eventsByPoint.get(pointId).push(event);
+ }
+
+ for (const segment of segments) {
+ const beforeEvents = (eventsByPoint.get(segment.id) ?? []).filter((event) => event.timing === "before");
+ for (const event of beforeEvents) children.push(queueEventStep(event, step));
+
+ children.push(queueSegmentStep(segment, step, groups, usedGroupIds));
+
+ const afterEvents = (eventsByPoint.get(segment.id) ?? []).filter((event) => event.timing !== "before");
+ for (const event of afterEvents) children.push(queueEventStep(event, step, segment, groups));
+ }
+
+ for (const event of looseEvents) children.push(queueEventStep(event, step));
+ }
+
+ return children.filter((child) => child.line > 0 && child.line !== step.line);
+ }
+
+ function queueSegmentStep(segment, parent, groups, usedGroupIds) {
+ const line = numberOr(segment?.sourceMap?.line, 0);
+ const text = sourceLineText(line);
+ const step = {
+ kind: "path-point",
+ label: stepLabel(segment?.motion ?? "MOVE", text),
+ line,
+ text,
+ timeStart: numberOr(parent.timeStart, 0),
+ timeEnd: numberOr(parent.timeEnd, 0),
+ motion: segment?.motion ?? "",
+ target: segment?.targetId ?? segment?.target?.id ?? segment?.id ?? "",
+ detail: `${segment?.motion ?? "MOVE"} ${segment?.targetId ?? segment?.target?.id ?? segment?.id ?? ""}`.trim()
+ };
+ return applySampleGroup(step, findUnusedGroup(line, groups, usedGroupIds));
+ }
+
+ function queueEventStep(event, parent, segment, groups = []) {
+ const line = numberOr(event?.sourceMap?.line, 0);
+ const text = sourceLineText(line);
+ const segmentGroup = segment
+ ? groups.find((group) => group.line === numberOr(segment?.sourceMap?.line, 0))
+ : undefined;
+ const time = event?.timing === "before"
+ ? numberOr(segmentGroup?.timeStart, numberOr(parent.timeStart, 0))
+ : numberOr(segmentGroup?.timeEnd, numberOr(parent.timeEnd, numberOr(parent.timeStart, 0)));
+ const sample = event?.timing === "before"
+ ? numberOr(segmentGroup?.sampleStart, parent.sampleStart)
+ : numberOr(segmentGroup?.sampleEnd, parent.sampleEnd);
+ return {
+ kind: "path-event",
+ label: stepLabel("EVENT", text),
+ line,
+ text,
+ timeStart: time,
+ timeEnd: time,
+ sampleStart: Number.isFinite(sample) ? sample : undefined,
+ sampleEnd: Number.isFinite(sample) ? sample : undefined,
+ detail: `${event?.timing ?? "event"} ${event?.pointId ?? ""} ${event?.kind ?? ""}`.trim()
+ };
+ }
+
+ function buildProgramSteps(samples = currentSamples()) {
+ const groups = sampleGroups(samples);
+ const usedGroupIds = new Set();
+ const traceSteps = traceInstructionSteps();
+ const firstTraceLine = traceSteps.find((step) => step.line > 0)?.line ?? 0;
+ const steps = setupStepsBefore(firstTraceLine);
+ const seenSourceRows = new Set(steps.map((step) => `${step.line}:${step.kind}`));
+
+ for (const traceStep of traceSteps) {
+ const step = { ...traceStep };
+ applySampleGroup(step, findUnusedGroup(step.line, groups, usedGroupIds));
+ if (step.sampleStart === undefined && step.timeStart !== undefined) {
+ const sample = nearestSampleIndex(step.timeStart, samples);
+ step.sampleStart = sample;
+ step.sampleEnd = sample;
+ }
+ const childSteps = queueChildrenForStep(step, groups, usedGroupIds);
+ const childGroups = childSteps.filter((child) => child.sampleStart !== undefined);
+ if (childGroups.length > 0 && !step.motion) {
+ step.sampleStart = Math.min(...childGroups.map((child) => child.sampleStart));
+ step.sampleEnd = Math.max(...childGroups.map((child) => child.sampleEnd));
+ step.timeStart = Math.min(...childGroups.map((child) => child.timeStart));
+ step.timeEnd = Math.max(...childGroups.map((child) => child.timeEnd));
+ }
+ const key = `${step.line}:${step.kind}:${step.pc ?? ""}`;
+ if (!seenSourceRows.has(key)) {
+ steps.push(step);
+ seenSourceRows.add(key);
+ }
+ for (const child of childSteps) {
+ const childKey = `${child.line}:${child.kind}:${child.detail ?? ""}`;
+ if (seenSourceRows.has(childKey)) continue;
+ steps.push(child);
+ seenSourceRows.add(childKey);
+ }
+ }
+
+ for (const group of groups) {
+ if (usedGroupIds.has(group.id)) continue;
+ const text = sourceLineText(group.line);
+ steps.push({
+ kind: "motion",
+ label: stepLabel(group.motion, text),
+ line: group.line,
+ text,
+ timeStart: group.timeStart,
+ timeEnd: group.timeEnd,
+ sampleStart: group.sampleStart,
+ sampleEnd: group.sampleEnd,
+ motion: group.motion,
+ target: group.target,
+ detail: `${group.motion} ${group.target}`.trim()
+ });
+ usedGroupIds.add(group.id);
+ }
+
+ if (steps.length === 0) {
+ const item = currentFrame();
+ steps.push({
+ kind: "sample",
+ label: "Sample",
+ line: numberOr(item?.sourceMap?.line, 0),
+ text: item?.sourceMap ? sourceLineText(item.sourceMap.line) : "sample trajectory",
+ timeStart: app.playbackTime,
+ timeEnd: app.playbackTime,
+ sampleStart: app.currentSampleIndex,
+ sampleEnd: app.currentSampleIndex,
+ motion: item?.motion ?? "",
+ target: item?.targetId ?? item?.segmentId ?? ""
+ });
+ }
+
+ return steps.map((step, index) => ({
+ ...step,
+ index: index + 1,
+ id: `step:${index + 1}:${step.line}:${step.kind}`
+ }));
+ }
+
+ function activeProgramStep(steps) {
+ if (steps.length === 0) return undefined;
+ const item = currentFrame();
+ const line = numberOr(item?.sourceMap?.line, 0);
+ if (line > 0) {
+ const matchingMotion = steps.find((step) => {
+ return step.line === line
+ && step.sampleStart !== undefined
+ && step.sampleEnd !== undefined
+ && step.sampleStart <= app.currentSampleIndex
+ && step.sampleEnd >= app.currentSampleIndex;
+ });
+ if (matchingMotion) return matchingMotion;
+ }
+
+ const matchingSample = steps.find((step) => {
+ return step.sampleStart !== undefined
+ && step.sampleEnd !== undefined
+ && step.sampleStart <= app.currentSampleIndex
+ && step.sampleEnd >= app.currentSampleIndex;
+ });
+ if (matchingSample) return matchingSample;
+
+ const elapsedSteps = steps.filter((step) => numberOr(step.timeStart, 0) <= app.playbackTime + 1e-9);
+ return elapsedSteps.at(-1) ?? steps[0];
+ }
+
+ function stepState(step, active) {
+ if (!active) return "pending";
+ if (step.id === active.id) return "active";
+ if (step.sampleEnd !== undefined && active.sampleStart !== undefined && step.sampleEnd < active.sampleStart) {
+ return "complete";
+ }
+ if (step.index < active.index && numberOr(step.timeEnd, 0) <= app.playbackTime + 1e-9) {
+ return "complete";
+ }
+ return "pending";
+ }
+
+ function renderStepTable(steps, active) {
+ if (!stepTable) return;
+ stepTable.textContent = "";
+ for (const step of steps) {
+ const row = document.createElement("tr");
+ row.dataset.stepState = stepState(step, active);
+ if (step.id === active?.id) row.setAttribute("aria-current", "true");
+ const cells = [
+ step.index,
+ stepTimeText(step),
+ step.line > 0 ? step.line : "",
+ step.label,
+ step.text,
+ stepMotionText(step),
+ stepSampleText(step)
+ ];
+ for (const cell of cells) {
+ const td = document.createElement("td");
+ td.textContent = String(cell);
+ row.append(td);
+ }
+ stepTable.append(row);
+ }
+ }
+
+ function stepTimeText(step) {
+ const start = numberOr(step.timeStart, 0);
+ const end = numberOr(step.timeEnd, start);
+ if (Math.abs(end - start) > 1e-9) {
+ return `${formatNumber(start, 3)}-${formatNumber(end, 3)} s`;
+ }
+ return `${formatNumber(start, 3)} s`;
+ }
+
+ function stepMotionText(step) {
+ if (step.motion || step.target) {
+ return `${step.motion ?? ""}${step.target ? ` / ${step.target}` : ""}`.trim();
+ }
+ return step.detail ?? "";
+ }
+
+ function stepSampleText(step) {
+ if (step.sampleStart === undefined || step.sampleEnd === undefined) return "-";
+ const start = numberOr(step.sampleStart, 0) + 1;
+ const end = numberOr(step.sampleEnd, step.sampleStart) + 1;
+ return start === end ? `${start} @50ms` : `${start}-${end} @50ms`;
+ }
+
+ function renderFrameTable() {
+ if (!frameTable) return;
+ const items = frames();
+ frameTable.textContent = "";
+ for (const item of items) {
+ const row = document.createElement("tr");
+ if (item.index === app.currentFrameIndex) row.setAttribute("aria-current", "true");
+ const cells = [
+ item.index,
+ formatNumber(item.time, 4),
+ item.motion,
+ item.targetId ?? item.segmentId ?? "",
+ formatArray(item.tcp.position, 6),
+ formatArray(item.tcp.quaternion, 6),
+ ...item.joints.map((joint) => formatNumber(joint, 6))
+ ];
+ for (const cell of cells) {
+ const td = document.createElement("td");
+ td.textContent = String(cell);
+ row.append(td);
+ }
+ frameTable.append(row);
+ }
+ }
+
+ function render() {
+ const program = selectedProgram();
+ const data = selectedData();
+ const item = currentFrame();
+ const trace = commandTrace();
+ const traceLast = trace.at(-1);
+ const totalFrames = frames().length;
+ const samples = currentSamples();
+ const programSteps = buildProgramSteps(samples);
+ const activeStep = activeProgramStep(programSteps);
+ const totalSamples = samples.length;
+ const duration = samples.at(-1)?.time ?? trajectoryDuration();
+ const sourceMap = item.sourceMap ? `:${item.sourceMap.line ?? 0}` : "";
+
+ root?.setAttribute("data-last-command", app.command);
+ root?.setAttribute("data-running", String(app.command === "running"));
+ if (programSelect && programSelect.value !== app.selectedProgramId) {
+ programSelect.value = app.selectedProgramId;
+ }
+
+ setField("job", app.manifest.job_id ?? "W2-JOB-latest");
+ setField("state", app.command);
+ setField("program", program?.program_id ?? "W2_60_IOWaitPulse");
+ setField("mode", app.mode);
+ setField("motors", app.motors);
+ setField("pc", `sample:${app.currentSampleIndex}${sourceMap}`);
+ setField(
+ "runtime",
+ `${formatNumber(app.playbackTime, 3)} / ${formatNumber(duration, 3)} s @ ${app.samplePeriodMs} ms`
+ );
+ setField("joints", formatArray(item.joints, 6));
+ setField("tcp", `pos ${formatArray(item.tcp.position, 6)} q ${formatArray(item.tcp.quaternion, 6)}`);
+ setField("log", app.localTrace.at(-1) ?? traceLast?.message ?? "ready");
+ setField("diagnostics", diagnosticText());
+ setField("io", ioText());
+ setField("wait", app.wait);
+ setField("queue", queueText());
+ setField("trace", `${trace.length + app.localTrace.length} events`);
+ setField("reports", app.report);
+ setField("parser", parserText());
+ setField("storage", storageText());
+ setField("editor", sourceTextForTab(app.tab));
+ setField("frame", totalSamples > 0 ? `${app.currentSampleIndex + 1} / ${totalSamples}` : "0 / 0");
+ setField(
+ "step-status",
+ activeStep
+ ? `${activeStep.index}/${programSteps.length} ${activeStep.label} line ${activeStep.line || "-"} t=${formatNumber(app.playbackTime, 3)} s`
+ : "0 / 0"
+ );
+ const sampleCount = Number.isFinite(Number(data.trajectory?.sampleCount))
+ ? Number(data.trajectory.sampleCount)
+ : (data.isFallback ? totalFrames : 0);
+ setField(
+ "frame-time",
+ `t=${formatNumber(app.playbackTime, 3)} / ${formatNumber(duration, 3)} s, step=${formatNumber(app.samplePeriodSec, 2)} s, source ${app.currentFrameIndex + 1}/${totalFrames} (${sampleCount} trajectory frames)`
+ );
+
+ for (const button of tabButtons) {
+ button.setAttribute("aria-pressed", String(button.dataset.tab === app.tab));
+ }
+ if (parserProgress) {
+ parserProgress.value = parserProgressValue();
+ }
+
+ updateObjectTree();
+ updateFrameSlider();
+ updatePathMarker();
+ renderStepTable(programSteps, activeStep);
+ renderFrameTable();
+ }
+
+ function pushTrace(message) {
+ app.localTrace.push(message);
+ if (app.localTrace.length > 100) app.localTrace.shift();
+ }
+
+ function advanceSample(stepSize) {
+ setSampleIndex(app.currentSampleIndex + stepSize);
+ }
+
+ function startPlayback() {
+ finishParseStreamForCommand();
+ stopPlayback();
+ app.playbackStartedAt = performance.now();
+ app.playbackTimeStart = app.playbackTime;
+ app.playbackSampleIndex = app.currentSampleIndex;
+ app.playbackTimer = window.setInterval(() => {
+ if (app.command !== "running") {
+ stopPlayback();
+ return;
+ }
+ const elapsed = (performance.now() - app.playbackStartedAt) / 1000;
+ const before = app.currentSampleIndex;
+ setPlaybackTime(app.playbackTimeStart + elapsed);
+ if (before !== app.currentSampleIndex) {
+ app.playbackSampleIndex = app.currentSampleIndex;
+ }
+ if (app.currentSampleIndex >= Math.max(currentSamples().length - 1, 0)) {
+ stopPlayback();
+ app.command = "ready";
+ pushTrace(`${app.selectedProgramId} completed t=${formatNumber(app.playbackTime, 3)}s`);
+ }
+ render();
+ }, app.samplePeriodMs);
+ }
+
+ function stopPlayback() {
+ if (app.playbackTimer) {
+ window.clearInterval(app.playbackTimer);
+ app.playbackTimer = 0;
+ }
+ }
+
+ async function handleCommand(command) {
+ root?.setAttribute("data-last-command", command);
if (command === "load") {
- state.pc = 0;
- state.queue = ["movej home", "run_path pick_place"];
- state.wait = "none";
- pushTrace("program loaded");
+ const programId = app.selectedProgramId;
+ stopPlayback();
+ stopParseStream();
+ app.command = "load";
+ resetExecutionClock();
+ app.di1 = false;
+ app.do1 = false;
+ app.wait = "none";
+ pushTrace(`${programId} loading from ${storageModeLabel()}`);
+ render();
+ void ensureProgramLoaded(programId).then(() => {
+ if (app.selectedProgramId !== programId) return;
+ if (!["load", "loading"].includes(app.command)) return;
+ startParseStream(programId, "load");
+ }).catch((error) => reportRuntimeError(`${programId} load`, error));
+ return;
} else if (command === "run") {
- advanceProgram(2);
- state.do1 = true;
- state.wait = state.di1 ? "satisfied" : "waiting di[1]";
- state.queue = state.di1 ? ["movel place"] : ["wait di[1]", "movel place"];
- pushTrace(state.di1 ? "running path" : "waiting for di[1]");
+ const programId = app.selectedProgramId;
+ finishParseStreamForCommand();
+ app.command = "running";
+ app.do1 = true;
+ if (app.currentSampleIndex >= Math.max(currentSamples().length - 1, 0)) {
+ resetExecutionClock();
+ }
+ advanceSample(1);
+ app.wait = app.di1 ? "satisfied" : "waiting di[1]";
+ pushTrace(`${programId} running sample ${app.currentSampleIndex + 1} t=${formatNumber(app.playbackTime, 3)}s`);
+ startPlayback();
+ render();
+ void ensureProgramLoaded(programId).then(() => {
+ if (app.selectedProgramId === programId && app.command === "running") render();
+ }).catch((error) => reportRuntimeError(`${programId} run load`, error));
+ return;
} else if (command === "pause") {
- pushTrace("program paused");
+ stopPlayback();
+ app.command = "paused";
+ pushTrace(`${app.selectedProgramId} paused`);
} else if (command === "step") {
- state.command = "paused";
- advanceProgram(1);
- pushTrace(`stepped to main:${state.pc}`);
+ stopPlayback();
+ finishParseStreamForCommand();
+ app.command = "paused";
+ advanceSample(1);
+ pushTrace(`${app.selectedProgramId} stepped sample ${app.currentSampleIndex + 1} t=${formatNumber(app.playbackTime, 3)}s`);
} else if (command === "stop") {
- state.queue = [];
- pushTrace("program stopped");
+ stopPlayback();
+ stopParseStream();
+ app.command = "stopped";
+ app.wait = "none";
+ pushTrace(`${app.selectedProgramId} stopped`);
} else if (command === "reset") {
- state.command = "ready";
- state.pc = 0;
- state.joints = [0, 0, 0, 0, 0, 0];
- state.tcp = [0, 0, 580, 0, 0, 0];
- state.do1 = false;
- state.wait = "none";
- state.queue = [];
+ stopPlayback();
+ stopParseStream();
+ app.command = "ready";
+ resetExecutionClock();
+ app.di1 = false;
+ app.do1 = false;
+ app.wait = "none";
pushTrace("controller reset");
} else if (command === "export") {
- state.report = "A120-REPORT exported";
+ app.report = `${app.manifest.job_id ?? "W2-JOB-latest"} report exported`;
pushTrace("delivery package exported");
}
render();
}
for (const button of document.querySelectorAll("[data-command]")) {
- button.addEventListener("click", () => handleCommand(button.dataset.command ?? "ready"));
+ button.addEventListener("click", () => {
+ const command = button.dataset.command ?? "ready";
+ void handleCommand(command).catch((error) => reportRuntimeError(command, error));
+ });
}
for (const button of tabButtons) {
button.addEventListener("click", () => {
- state.tab = button.dataset.tab ?? "grl";
- pushTrace(`${state.tab.toUpperCase()} source selected`);
+ app.tab = button.dataset.tab ?? "grl";
+ pushTrace(`${app.tab.toUpperCase()} source selected`);
render();
});
}
- document.querySelector("[data-io='di1']")?.addEventListener("click", () => {
- state.di1 = !state.di1;
- state.wait = state.di1 ? "satisfied" : "waiting di[1]";
- pushTrace(`di[1]=${state.di1}`);
+ programSelect?.addEventListener("change", () => {
+ void selectProgram(programSelect.value).catch((error) => reportRuntimeError("program select", error));
+ });
+
+ frameSlider?.addEventListener("input", () => {
+ stopPlayback();
+ setSampleIndex(numberOr(frameSlider.value, 0));
+ app.command = app.command === "running" ? "paused" : app.command;
+ pushTrace(`${app.selectedProgramId} sample ${app.currentSampleIndex + 1} t=${formatNumber(app.playbackTime, 3)}s`);
render();
});
+ document.querySelector("[data-io='di1']")?.addEventListener("click", () => {
+ app.di1 = !app.di1;
+ app.wait = app.di1 ? "satisfied" : "waiting di[1]";
+ pushTrace(`di[1]=${app.di1}`);
+ render();
+ });
+
+ applyManifest(fallbackManifest);
render();
+ void loadManifest();
})();
diff --git a/kdl-wasm/web/scripts/build-demo-package.mjs b/kdl-wasm/web/scripts/build-demo-package.mjs
new file mode 100644
index 0000000..3a0b1ca
--- /dev/null
+++ b/kdl-wasm/web/scripts/build-demo-package.mjs
@@ -0,0 +1,548 @@
+import { createHash } from "node:crypto";
+import {
+ copyFileSync,
+ cpSync,
+ existsSync,
+ mkdirSync,
+ readdirSync,
+ readFileSync,
+ rmSync,
+ statSync,
+ writeFileSync
+} from "node:fs";
+import { basename, dirname, join, relative, resolve, sep } from "node:path";
+import { fileURLToPath } from "node:url";
+
+const root = resolve(fileURLToPath(new URL("../../..", import.meta.url)));
+const webRoot = join(root, "kdl-wasm", "web");
+const deployRoot = join(webRoot, "test-results", "deploy");
+const appRoot = join(webRoot, "app");
+const specRoot = join(webRoot, "tests", "fixtures", "abb120", "spec-programs");
+const resultRoot = join(webRoot, "test-results", "abb120-spec");
+const uiResultRoot = join(webRoot, "test-results", "virtual-controller");
+const working2Root = join(root, "working2");
+const docsRoot = join(root, "work", "doc");
+
+const jobId = getArg("--job") ?? latestJobId();
+const generatedAt = new Date();
+const releaseId = getArg("--release") ?? `${formatShanghaiId(generatedAt)}-${jobId}`;
+const packageName = `kdl-olp-demo-${releaseId}`;
+const packageDir = join(deployRoot, packageName);
+const zipPath = join(deployRoot, `${packageName}.zip`);
+
+const jobDir = join(resultRoot, jobId);
+const manifest = readJson(join(specRoot, "manifest.json"));
+const job = readJson(join(jobDir, "job.json"));
+const report = readJson(join(jobDir, "report.json"));
+const uiEvidence = readJson(join(uiResultRoot, "evidence.json"));
+
+assertReportIsDeployable(report);
+assertJobMatchesInputs(job, report, manifest);
+assertSafeDeployPath(packageDir);
+mkdirSync(deployRoot, { recursive: true });
+rmSync(packageDir, { recursive: true, force: true });
+mkdirSync(packageDir, { recursive: true });
+
+copyTree(appRoot, join(packageDir, "app"));
+copyTree(specRoot, join(packageDir, "spec-programs"));
+copyTree(jobDir, join(packageDir, "test-results", "abb120-spec", jobId));
+copyTree(uiResultRoot, join(packageDir, "test-results", "virtual-controller"));
+copyDocs(join(packageDir, "docs"));
+copyWorking2Docs(join(packageDir, "docs", "working2"));
+
+const demoManifest = buildDemoManifest();
+writeJson(join(packageDir, "demo-manifest.json"), demoManifest);
+writeFileSync(join(packageDir, "index.html"), indexHtml(demoManifest), "utf8");
+writeFileSync(join(packageDir, "README.md"), packageReadme(demoManifest), "utf8");
+
+zipDirectory(packageDir, zipPath);
+const zip = {
+ path: slash(relative(root, zipPath)),
+ bytes: statSync(zipPath).size,
+ sha256: sha256File(zipPath)
+};
+const summary = {
+ release_id: releaseId,
+ generated_at: generatedAt.toISOString(),
+ job_id: jobId,
+ package_dir: slash(relative(root, packageDir)),
+ zip,
+ program_count: demoManifest.program_count,
+ report_fail: report.summary.fail
+};
+writeJson(join(packageDir, "demo-build-summary.json"), summary);
+writeJson(join(deployRoot, `${packageName}.summary.json`), summary);
+
+console.log(JSON.stringify(summary, null, 2));
+
+function buildDemoManifest() {
+ const levelCounts = countLevels(manifest.programs);
+ const programs = manifest.programs.map((entry) => {
+ const jobProgram = job.programs.find((program) => program.program_id === entry.program_id);
+ return {
+ program_id: entry.program_id,
+ file: entry.file,
+ source: `spec-programs/${entry.file}`,
+ coverage_level: entry.coverage_level,
+ spec_sections: entry.spec_sections,
+ expected_status: entry.expected_status,
+ status: jobProgram?.status ?? "missing",
+ diagnostics: jobProgram?.diagnostics?.map((diagnostic) => diagnostic.code).filter(Boolean) ?? [],
+ artifacts: artifactLinks(entry.program_id)
+ };
+ });
+
+ return {
+ release_id: releaseId,
+ generated_at: generatedAt.toISOString(),
+ suite_id: manifest.suite_id,
+ job_id: job.job_id,
+ robot_id: manifest.robot_id,
+ spec_source: manifest.spec_source,
+ program_count: manifest.programs.length,
+ runtime_programs: levelCounts.Runtime,
+ static_programs: levelCounts.Static,
+ post_programs: levelCounts.Post,
+ entry: "app/virtual-controller.html",
+ virtual_controller_entry: "app/virtual-controller.html",
+ report_json: `test-results/abb120-spec/${job.job_id}/report.json`,
+ report_html: `test-results/abb120-spec/${job.job_id}/report.html`,
+ job_json: `test-results/abb120-spec/${job.job_id}/job.json`,
+ program_manifest: "spec-programs/manifest.json",
+ screenshots: {
+ desktop: "test-results/virtual-controller/virtual-controller-desktop.png",
+ mobile: "test-results/virtual-controller/virtual-controller-mobile.png",
+ evidence: "test-results/virtual-controller/evidence.json"
+ },
+ docs: [
+ {
+ title: "GRL user manual",
+ href: "docs/grl-user-manual.docx",
+ kind: "docx"
+ },
+ {
+ title: "OLP test document",
+ href: "docs/olp-test-document.docx",
+ kind: "docx"
+ },
+ {
+ title: "Working2 acceptance evidence",
+ href: "docs/working2/acceptance-evidence.md",
+ kind: "markdown"
+ }
+ ],
+ coverage: report.coverage,
+ summary: report.summary,
+ programs
+ };
+}
+
+function artifactLinks(programId) {
+ const base = `test-results/abb120-spec/${job.job_id}/programs/${programId}`;
+ return {
+ compile: `${base}/compile.json`,
+ controller: `${base}/controller.json`,
+ motion_queue: `${base}/motion-queue.json`,
+ trace: `${base}/trace.json`,
+ io: `${base}/io.json`,
+ trajectory: `${base}/trajectory.json`,
+ post_report: `${base}/post-report.json`,
+ roundtrip: `${base}/roundtrip.json`
+ };
+}
+
+function copyDocs(targetDir) {
+ mkdirSync(targetDir, { recursive: true });
+ const docs = [
+ ["GRL功能语法逻辑与程序创建使用手册.docx", "grl-user-manual.docx"],
+ ["通用机器人离线编程系统测试文档.docx", "olp-test-document.docx"]
+ ];
+ for (const [doc, alias] of docs) {
+ const source = join(docsRoot, doc);
+ if (!existsSync(source)) {
+ throw new Error(`Required document is missing: ${source}`);
+ }
+ copyFileSync(source, join(targetDir, doc));
+ copyFileSync(source, join(targetDir, alias));
+ }
+}
+
+function copyWorking2Docs(targetDir) {
+ mkdirSync(targetDir, { recursive: true });
+ for (const entry of readdirSync(working2Root, { withFileTypes: true })) {
+ if (entry.isFile() && entry.name.endsWith(".md")) {
+ copyFileSync(join(working2Root, entry.name), join(targetDir, entry.name));
+ }
+ }
+ const aliases = {
+ "01-项目功能内容.md": "project-scope.md",
+ "02-项目程序开发详细步骤.md": "development-steps.md",
+ "03-推进台账.md": "progress-log.md",
+ "04-任务矩阵.md": "task-matrix.md",
+ "05-验收证据.md": "acceptance-evidence.md",
+ "06-决策记录.md": "decisions.md",
+ "07-服务器发布与演示包实施方案.md": "server-deploy-plan.md"
+ };
+ for (const [sourceName, aliasName] of Object.entries(aliases)) {
+ const source = join(working2Root, sourceName);
+ if (existsSync(source)) {
+ copyFileSync(source, join(targetDir, aliasName));
+ }
+ }
+ const manifestDir = join(working2Root, "programs");
+ if (existsSync(manifestDir)) {
+ copyTree(manifestDir, join(targetDir, "programs"));
+ const manifestSource = join(manifestDir, "manifest.md");
+ if (existsSync(manifestSource)) {
+ copyFileSync(manifestSource, join(targetDir, "program-manifest.md"));
+ }
+ }
+}
+
+function indexHtml(demoManifest) {
+ const rows = demoManifest.programs.map((program) => `
+
+ | ${escapeHtml(program.program_id)} |
+ ${escapeHtml(program.coverage_level)} |
+ ${escapeHtml(program.status)} |
+ ${escapeHtml(program.spec_sections.join(", "))} |
+ compile |
+
`).join("");
+ return `
+
+
+
+
+
KDL OLP Demo ${escapeHtml(demoManifest.release_id)}
+
+
+
+
+
+
+
+
Programs${demoManifest.program_count}
+
Runtime${demoManifest.runtime_programs}
+
Static${demoManifest.static_programs}
+
Post${demoManifest.post_programs}
+
Fail${demoManifest.summary.fail}
+
+
+ Program Evidence
+
+ | Program | Layer | Status | Spec Sections | Artifact |
+ ${rows}
+
+
+
+
+ Screenshots
+
+
})
+
})
+
+
+
+
+
+
+`;
+}
+
+function packageReadme(demoManifest) {
+ return [
+ `# KDL OLP demo ${demoManifest.release_id}`,
+ "",
+ `Job: ${demoManifest.job_id}`,
+ `Suite: ${demoManifest.suite_id}`,
+ `Programs: ${demoManifest.program_count}`,
+ `Report: ${demoManifest.report_html}`,
+ `Virtual controller: ${demoManifest.virtual_controller_entry}`,
+ "",
+ "Serve this directory as the HTTPS document root for the demo port."
+ ].join("\n");
+}
+
+function latestJobId() {
+ if (!existsSync(resultRoot)) {
+ throw new Error(`No ABB120 spec result directory found: ${resultRoot}`);
+ }
+ const jobs = readdirSync(resultRoot, { withFileTypes: true })
+ .filter((entry) => entry.isDirectory() && entry.name.startsWith("W2-JOB-"))
+ .map((entry) => ({
+ name: entry.name,
+ mtimeMs: statSync(join(resultRoot, entry.name)).mtimeMs
+ }))
+ .sort((left, right) => right.mtimeMs - left.mtimeMs || right.name.localeCompare(left.name));
+ if (jobs.length === 0) {
+ throw new Error(`No W2-JOB-* result directories found in ${resultRoot}`);
+ }
+ return jobs[0].name;
+}
+
+function assertReportIsDeployable(report) {
+ if (report.summary?.programs !== 19) {
+ throw new Error(`Expected report.summary.programs=19, got ${report.summary?.programs}`);
+ }
+ if (report.summary?.fail !== 0) {
+ throw new Error(`Expected report.summary.fail=0, got ${report.summary?.fail}`);
+ }
+ if (report.coverage?.missingSections?.length !== 0) {
+ throw new Error(`Expected no missing sections, got ${report.coverage.missingSections.join(",")}`);
+ }
+}
+
+function assertJobMatchesInputs(job, report, manifest) {
+ if (job.job_id !== jobId || report.job_id !== jobId) {
+ throw new Error(`Job id mismatch: requested ${jobId}, job=${job.job_id}, report=${report.job_id}`);
+ }
+ if (job.suite_id !== manifest.suite_id || report.suite_id !== manifest.suite_id) {
+ throw new Error("Suite id mismatch between manifest, job, and report");
+ }
+ if (manifest.programs.length !== 19 || job.programs.length !== 19) {
+ throw new Error(`Expected 19 programs, manifest=${manifest.programs.length}, job=${job.programs.length}`);
+ }
+}
+
+function countLevels(programs) {
+ return programs.reduce((counts, program) => {
+ counts[program.coverage_level] = (counts[program.coverage_level] ?? 0) + 1;
+ return counts;
+ }, { Runtime: 0, Static: 0, Post: 0 });
+}
+
+function copyTree(source, target) {
+ if (!existsSync(source)) {
+ throw new Error(`Required path is missing: ${source}`);
+ }
+ mkdirSync(dirname(target), { recursive: true });
+ cpSync(source, target, { recursive: true, force: true });
+}
+
+function readJson(file) {
+ return JSON.parse(readFileSync(file, "utf8"));
+}
+
+function writeJson(file, value) {
+ mkdirSync(dirname(file), { recursive: true });
+ writeFileSync(file, `${JSON.stringify(value, null, 2)}\n`, "utf8");
+}
+
+function zipDirectory(sourceDir, destinationFile) {
+ const files = walkFiles(sourceDir).sort((left, right) => left.localeCompare(right));
+ const chunks = [];
+ const central = [];
+ let offset = 0;
+
+ for (const file of files) {
+ const data = readFileSync(file);
+ const name = slash(relative(sourceDir, file));
+ const nameBuffer = Buffer.from(name, "utf8");
+ const stat = statSync(file);
+ const { time, date } = dosDateTime(stat.mtime);
+ const crc = crc32(data);
+ const local = Buffer.alloc(30);
+ local.writeUInt32LE(0x04034b50, 0);
+ local.writeUInt16LE(20, 4);
+ local.writeUInt16LE(0x0800, 6);
+ local.writeUInt16LE(0, 8);
+ local.writeUInt16LE(time, 10);
+ local.writeUInt16LE(date, 12);
+ local.writeUInt32LE(crc, 14);
+ local.writeUInt32LE(data.length, 18);
+ local.writeUInt32LE(data.length, 22);
+ local.writeUInt16LE(nameBuffer.length, 26);
+ local.writeUInt16LE(0, 28);
+ chunks.push(local, nameBuffer, data);
+
+ const header = Buffer.alloc(46);
+ header.writeUInt32LE(0x02014b50, 0);
+ header.writeUInt16LE(20, 4);
+ header.writeUInt16LE(20, 6);
+ header.writeUInt16LE(0x0800, 8);
+ header.writeUInt16LE(0, 10);
+ header.writeUInt16LE(time, 12);
+ header.writeUInt16LE(date, 14);
+ header.writeUInt32LE(crc, 16);
+ header.writeUInt32LE(data.length, 20);
+ header.writeUInt32LE(data.length, 24);
+ header.writeUInt16LE(nameBuffer.length, 28);
+ header.writeUInt16LE(0, 30);
+ header.writeUInt16LE(0, 32);
+ header.writeUInt16LE(0, 34);
+ header.writeUInt16LE(0, 36);
+ header.writeUInt32LE(0, 38);
+ header.writeUInt32LE(offset, 42);
+ central.push(header, nameBuffer);
+ offset += local.length + nameBuffer.length + data.length;
+ }
+
+ const centralOffset = offset;
+ const centralSize = central.reduce((total, chunk) => total + chunk.length, 0);
+ const end = Buffer.alloc(22);
+ end.writeUInt32LE(0x06054b50, 0);
+ end.writeUInt16LE(0, 4);
+ end.writeUInt16LE(0, 6);
+ end.writeUInt16LE(files.length, 8);
+ end.writeUInt16LE(files.length, 10);
+ end.writeUInt32LE(centralSize, 12);
+ end.writeUInt32LE(centralOffset, 16);
+ end.writeUInt16LE(0, 20);
+
+ rmSync(destinationFile, { force: true });
+ writeFileSync(destinationFile, Buffer.concat([...chunks, ...central, end]));
+}
+
+function sha256File(file) {
+ return createHash("sha256").update(readFileSync(file)).digest("hex");
+}
+
+function formatShanghaiId(date) {
+ const parts = new Intl.DateTimeFormat("en-CA", {
+ timeZone: "Asia/Shanghai",
+ year: "numeric",
+ month: "2-digit",
+ day: "2-digit",
+ hour: "2-digit",
+ minute: "2-digit",
+ second: "2-digit",
+ hour12: false
+ }).formatToParts(date);
+ const value = Object.fromEntries(parts.map((part) => [part.type, part.value]));
+ return `${value.year}${value.month}${value.day}-${value.hour}${value.minute}${value.second}`;
+}
+
+function getArg(name) {
+ const index = process.argv.indexOf(name);
+ return index >= 0 ? process.argv[index + 1] : undefined;
+}
+
+function slash(value) {
+ return value.split(sep).join("/");
+}
+
+function psSingleQuoted(value) {
+ return `'${String(value).replaceAll("'", "''")}'`;
+}
+
+function assertSafeDeployPath(path) {
+ const allowedRoot = resolve(deployRoot) + sep;
+ const resolved = resolve(path);
+ if (!resolved.startsWith(allowedRoot)) {
+ throw new Error(`Refusing to modify path outside deploy root: ${resolved}`);
+ }
+}
+
+function escapeHtml(value) {
+ return String(value)
+ .replaceAll("&", "&")
+ .replaceAll("<", "<")
+ .replaceAll(">", ">")
+ .replaceAll('"', """);
+}
+
+function escapeAttr(value) {
+ return escapeHtml(value);
+}
+
+function walkFiles(dir) {
+ const files = [];
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
+ const fullPath = join(dir, entry.name);
+ if (entry.isDirectory()) {
+ files.push(...walkFiles(fullPath));
+ } else if (entry.isFile()) {
+ files.push(fullPath);
+ }
+ }
+ return files;
+}
+
+function dosDateTime(date) {
+ const year = Math.max(1980, date.getFullYear());
+ const month = date.getMonth() + 1;
+ const day = date.getDate();
+ const hours = date.getHours();
+ const minutes = date.getMinutes();
+ const seconds = Math.floor(date.getSeconds() / 2);
+ return {
+ time: (hours << 11) | (minutes << 5) | seconds,
+ date: ((year - 1980) << 9) | (month << 5) | day
+ };
+}
+
+var crcTable;
+
+function crc32(buffer) {
+ crcTable ??= createCrcTable();
+ let crc = 0xffffffff;
+ for (const byte of buffer) {
+ crc = crcTable[(crc ^ byte) & 0xff] ^ (crc >>> 8);
+ }
+ return (crc ^ 0xffffffff) >>> 0;
+}
+
+function createCrcTable() {
+ const table = new Uint32Array(256);
+ for (let index = 0; index < 256; index += 1) {
+ let value = index;
+ for (let bit = 0; bit < 8; bit += 1) {
+ value = (value & 1) ? (0xedb88320 ^ (value >>> 1)) : (value >>> 1);
+ }
+ table[index] = value >>> 0;
+ }
+ return table;
+}
diff --git a/kdl-wasm/web/scripts/deploy-demo-package.ps1 b/kdl-wasm/web/scripts/deploy-demo-package.ps1
new file mode 100644
index 0000000..dad6387
--- /dev/null
+++ b/kdl-wasm/web/scripts/deploy-demo-package.ps1
@@ -0,0 +1,184 @@
+param(
+ [string]$ZipPath,
+ [string]$Target = "ubuntu@82.156.24.101",
+ [string]$RemoteRoot = "/opt/kdl-olp-demo/8095",
+ [string]$BaseUrl = "https://82.156.24.101:8095",
+ [switch]$Sudo,
+ [switch]$NoSudo,
+ [switch]$SkipSmoke
+)
+
+Set-StrictMode -Version Latest
+$ErrorActionPreference = "Stop"
+
+$RepoRoot = Resolve-Path (Join-Path $PSScriptRoot "..\..\..")
+$DeployRoot = Join-Path $RepoRoot "kdl-wasm\web\test-results\deploy"
+
+if ([string]::IsNullOrWhiteSpace($ZipPath)) {
+ $ZipPath = Get-ChildItem -LiteralPath $DeployRoot -Filter "kdl-olp-demo-*.zip" |
+ Sort-Object LastWriteTime -Descending |
+ Select-Object -First 1 -ExpandProperty FullName
+}
+
+if ([string]::IsNullOrWhiteSpace($ZipPath) -or -not (Test-Path -LiteralPath $ZipPath)) {
+ throw "Demo zip not found. Run: npm run demo:build"
+}
+
+$ZipPath = (Resolve-Path -LiteralPath $ZipPath).Path
+$ZipName = Split-Path -Leaf $ZipPath
+if ($ZipName -notmatch '^kdl-olp-demo-(.+)\.zip$') {
+ throw "Zip name must match kdl-olp-demo-
.zip: $ZipName"
+}
+$ReleaseId = $Matches[1]
+$RemoteZip = "/tmp/$ZipName"
+$RemoteRelease = "$RemoteRoot/releases/$ReleaseId"
+
+function Invoke-Remote {
+ param([string]$Command)
+ ssh -o StrictHostKeyChecking=accept-new $Target $Command
+ if ($LASTEXITCODE -ne 0) {
+ throw "Remote command failed: $Command"
+ }
+}
+
+function Remote-Cmd {
+ param([string]$Command)
+ if ($script:UseSudo) {
+ return "sudo sh -lc " + (Quote-Sh $Command)
+ }
+ return "sh -lc " + (Quote-Sh $Command)
+}
+
+function Quote-Sh {
+ param([string]$Value)
+ return "'" + ($Value -replace "'", "'\''") + "'"
+}
+
+function Get-RemoteParent {
+ param([string]$Path)
+ $Normalized = $Path.TrimEnd("/")
+ $Index = $Normalized.LastIndexOf("/")
+ if ($Index -le 0) {
+ return "/"
+ }
+ return $Normalized.Substring(0, $Index)
+}
+
+$RemoteParent = Get-RemoteParent $RemoteRoot
+
+Write-Host "Deploying $ZipName to ${Target}:$RemoteRoot"
+
+scp -o StrictHostKeyChecking=accept-new $ZipPath "${Target}:$RemoteZip"
+if ($LASTEXITCODE -ne 0) {
+ throw "scp upload failed"
+}
+
+$script:UseSudo = $false
+if ($Sudo) {
+ $script:UseSudo = $true
+} elseif (-not $NoSudo) {
+ ssh -o StrictHostKeyChecking=accept-new $Target "test -w $(Quote-Sh $RemoteParent)"
+ if ($LASTEXITCODE -ne 0) {
+ ssh -o StrictHostKeyChecking=accept-new $Target "sudo -n true"
+ if ($LASTEXITCODE -eq 0) {
+ $script:UseSudo = $true
+ } else {
+ throw "Remote root is not writable and passwordless sudo is unavailable. Re-run with a writable -RemoteRoot or configure sudo."
+ }
+ }
+}
+
+$prepare = @(
+ "set -eu"
+ "mkdir -p $(Quote-Sh "$RemoteRoot/releases")"
+ "rm -rf $(Quote-Sh $RemoteRelease)"
+ "mkdir -p $(Quote-Sh $RemoteRelease)"
+ "unzip -q -o $(Quote-Sh $RemoteZip) -d $(Quote-Sh $RemoteRelease)"
+ "test -f $(Quote-Sh "$RemoteRelease/index.html")"
+ "test -f $(Quote-Sh "$RemoteRelease/demo-manifest.json")"
+ "test -f $(Quote-Sh "$RemoteRelease/app/virtual-controller.html")"
+ "if [ -L $(Quote-Sh "$RemoteRoot/current") ] || [ -e $(Quote-Sh "$RemoteRoot/current") ]; then rm -f $(Quote-Sh "$RemoteRoot/previous"); ln -sfn `"`$(readlink -f $(Quote-Sh "$RemoteRoot/current"))`" $(Quote-Sh "$RemoteRoot/previous"); fi"
+ "ln -sfn $(Quote-Sh "$RemoteRelease") $(Quote-Sh "$RemoteRoot/current")"
+ "rm -f $(Quote-Sh $RemoteZip)"
+) -join "; "
+
+Invoke-Remote (Remote-Cmd $prepare)
+
+$restart = "if command -v systemctl >/dev/null 2>&1 && systemctl list-unit-files kdl-site-8095.service >/dev/null 2>&1; then systemctl restart kdl-site-8095; fi"
+Invoke-Remote (Remote-Cmd $restart)
+
+$smoke = @{
+ release_id = $ReleaseId
+ zip = $ZipPath
+ target = $Target
+ remote_root = $RemoteRoot
+ remote_release = $RemoteRelease
+ base_url = $BaseUrl
+ deployed_at = (Get-Date).ToUniversalTime().ToString("o")
+ urls = @()
+}
+
+if (-not $SkipSmoke) {
+ $nodeSmoke = @"
+process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
+const baseUrl = "$BaseUrl";
+const get = async (path) => {
+ const response = await fetch(baseUrl + path);
+ const buffer = Buffer.from(await response.arrayBuffer());
+ if (response.status !== 200) {
+ throw new Error(path + " returned " + response.status);
+ }
+ return {
+ path,
+ status: response.status,
+ bytes: buffer.length,
+ text: buffer.toString("utf8")
+ };
+};
+const manifestResponse = await get("/demo-manifest.json");
+const manifest = JSON.parse(manifestResponse.text);
+const jobId = manifest.job_id;
+const paths = [
+ "/",
+ "/demo-manifest.json",
+ "/spec-programs/manifest.json",
+ "/app/virtual-controller.html",
+ "/test-results/abb120-spec/" + jobId + "/report.json",
+ "/test-results/abb120-spec/" + jobId + "/report.html",
+ "/test-results/virtual-controller/virtual-controller-desktop.png",
+ "/test-results/virtual-controller/virtual-controller-mobile.png"
+];
+const urls = [];
+for (const path of paths) {
+ const result = path === "/demo-manifest.json" ? manifestResponse : await get(path);
+ urls.push({ url: baseUrl + path, status: result.status, bytes: result.bytes });
+}
+const reportResponse = await get("/test-results/abb120-spec/" + jobId + "/report.json");
+const report = JSON.parse(reportResponse.text);
+if (Number(manifest.program_count) !== 19) {
+ throw new Error("Expected program_count=19, got " + manifest.program_count);
+}
+if (Number(report.summary.fail) !== 0) {
+ throw new Error("Expected summary.fail=0, got " + report.summary.fail);
+}
+console.log(JSON.stringify({
+ job_id: jobId,
+ program_count: Number(manifest.program_count),
+ summary_fail: Number(report.summary.fail),
+ urls
+}));
+"@
+ $nodeOutput = $nodeSmoke | node --input-type=module
+ if ($LASTEXITCODE -ne 0) {
+ throw "Smoke check failed"
+ }
+ $nodeSmokeResult = $nodeOutput | Select-Object -Last 1 | ConvertFrom-Json
+ $smoke.job_id = $nodeSmokeResult.job_id
+ $smoke.program_count = [int]$nodeSmokeResult.program_count
+ $smoke.summary_fail = [int]$nodeSmokeResult.summary_fail
+ $smoke.urls = @($nodeSmokeResult.urls)
+}
+
+$SmokePath = Join-Path $DeployRoot "kdl-olp-demo-$ReleaseId.deploy.json"
+$smoke | ConvertTo-Json -Depth 8 | Set-Content -LiteralPath $SmokePath -Encoding UTF8
+$smoke | ConvertTo-Json -Depth 8
diff --git a/kdl-wasm/web/scripts/generate-abb120-test-document.mjs b/kdl-wasm/web/scripts/generate-abb120-test-document.mjs
new file mode 100644
index 0000000..a5f78e3
--- /dev/null
+++ b/kdl-wasm/web/scripts/generate-abb120-test-document.mjs
@@ -0,0 +1,610 @@
+import { execFileSync } from "node:child_process";
+import {
+ copyFileSync,
+ existsSync,
+ mkdirSync,
+ readdirSync,
+ readFileSync,
+ rmSync,
+ statSync,
+ writeFileSync
+} from "node:fs";
+import { dirname, join, resolve, sep } from "node:path";
+import { fileURLToPath } from "node:url";
+
+const root = resolve(fileURLToPath(new URL("../../..", import.meta.url)));
+const webRoot = join(root, "kdl-wasm", "web");
+const resultRoot = join(webRoot, "test-results", "abb120-spec");
+const specRoot = join(webRoot, "tests", "fixtures", "abb120", "spec-programs");
+const virtualControllerEvidencePath = join(webRoot, "test-results", "virtual-controller", "evidence.json");
+const outputPath = join(root, "work", "doc", "通用机器人离线编程系统测试文档.docx");
+const stagingRoot = join(webRoot, "test-results", "docx-build");
+
+const jobId = process.argv[2] ?? latestJobId();
+const jobDir = join(resultRoot, jobId);
+const job = readJson(join(jobDir, "job.json"));
+const report = readJson(join(jobDir, "report.json"));
+const manifest = readJson(join(jobDir, "manifest.json"));
+const uiEvidence = readJson(virtualControllerEvidencePath);
+const generatedAt = formatShanghaiTime(new Date());
+
+const descriptionByProgram = {
+ W2_00_MinimalModule: "最小模块、language/module/proc main、常量 speed/zone、joint_target、MoveJ 基础执行。",
+ W2_10_DataTargetToolFrame: "数据类型、tool、frame、pose、poseq、joint_target、pose_target、工具和工件坐标切换。",
+ W2_20_ExpressionMath: "算术、比较、逻辑、括号、单位后缀、pi/e、三角函数和编译期求值。",
+ W2_30_MotionAllTypes: "MoveJ、MoveL、MoveC、set_tool、set_frame、set_speed、set_zone 和 inline 参数优先级。",
+ W2_40_PathEvents: "path defaults/source、point、event before/after/at distance、run_path。",
+ W2_50_OperationProcess: "operation kind/process/start_action/end_action、run_operation。",
+ W2_60_IOWaitPulse: "io.di/do/ai/ao/gi/go/ri/ro、wait、timeout、on_timeout、pulse 和边沿条件。",
+ W2_70_ControlFlow: "if/elseif/else、while、for、switch、break、continue 流程控制。",
+ W2_80_ProcFuncCall: "proc、in/out/inout、call、return、func 返回值和作用域。",
+ W2_90_ExceptionAlarm: "alarm、raise、try/catch/finally、trap/task P1 边界诊断。",
+ W2_99_FullSpecExample: "完整示例,覆盖 tool/frame、path、operation、IO event、run_operation 和回 home。",
+ W2_E10_ExpressionDiagnostics: "表达式负向测试:未知符号、未知函数、参数数量、数学域、除零、单位不匹配。",
+ W2_E20_SemanticDiagnostics: "语义负向测试:重复符号、out/inout 非左值、缺失调用目标、函数副作用、缺失目标。",
+ W2_E30_MotionDiagnostics: "运动负向测试:关节限位、不可达 pose、空 path 等 KDL/Path 诊断。",
+ W2_E40_ControlFlowDiagnostics: "流程控制负向测试:非法 break/continue、jump、重复 case、非常量 case、缺失 label。",
+ W2_E50_RuntimeTimeout: "运行时超时负向测试:wait timeout、on_timeout、报警 source map。",
+ W2_P10_BrandHints: "品牌提示后处理测试:post_hint、@brand.* 消费或报告。",
+ W2_P20_CrossBrandMotion: "跨品牌运动后处理:ABB/FANUC/KUKA motion、speed、zone、IO、wait 映射。",
+ W2_P30_Roundtrip: "后处理和导入回读测试:post 后 ABB import roundtrip,记录差异和警告。"
+};
+
+const commandResults = [
+ {
+ command: "npm run typecheck",
+ scope: "TypeScript 静态类型检查",
+ process: "执行 tsc -p kdl-wasm/web/tsconfig.json --noEmit,检查 Web、GRL、runtime、post 和 suite 代码类型。",
+ result: "通过,未输出 TypeScript 错误。"
+ },
+ {
+ command: "npm test",
+ scope: "全量 Vitest 自动化测试",
+ process: "执行 vitest run --config kdl-wasm/web/vitest.config.ts,覆盖 KDL、GRL、runtime、controller、post/import、workspace、report、docs 和 ABB120 integration。",
+ result: "通过,41 个 test files、155 个 tests 全部 passed。"
+ },
+ {
+ command: "npm run suite:abb120-spec",
+ scope: "ABB120 GRL 规范程序套件",
+ process: "读取 manifest.json 和 19 个 GRL 程序,逐项执行 parse、semantic compile、runtime/static/post 检查,并输出 job/report/program artifacts。",
+ result: `通过,生成 ${job.job_id};programs=${report.summary.programs},pass=${report.summary.pass},expected diagnostic=${report.summary.diagnostic},fail=${report.summary.fail},missingSections=${report.coverage.missingSections.length}。`
+ },
+ {
+ command: "npm run verify:virtual-controller",
+ scope: "虚拟控制器 UI 和截图验证",
+ process: "使用 Chrome DevTools Protocol 打开 virtual-controller.html,分别验证 desktop/mobile 视口、点击 load/run/DI1、检查主要面板、状态、wait 和横向溢出,并截图。",
+ result: `通过,desktop=${uiEvidence.desktop.screenshotBytes} bytes,mobile=${uiEvidence.mobile.screenshotBytes} bytes;state=${uiEvidence.desktop.state}/${uiEvidence.mobile.state},wait=${uiEvidence.desktop.wait}/${uiEvidence.mobile.wait}。`
+ }
+];
+
+const programs = job.programs.map((program) => {
+ const sourcePath = join(specRoot, program.file);
+ return {
+ ...program,
+ manifestEntry: manifest.programs.find((entry) => entry.program_id === program.program_id),
+ sourcePath,
+ source: readFileSync(sourcePath, "utf8")
+ };
+});
+
+buildDocx();
+console.log(JSON.stringify({ outputPath, jobId, programs: programs.length }, null, 2));
+
+function buildDocx() {
+ assertSafeStaging(stagingRoot);
+ rmSync(stagingRoot, { recursive: true, force: true });
+ mkdirSync(join(stagingRoot, "_rels"), { recursive: true });
+ mkdirSync(join(stagingRoot, "docProps"), { recursive: true });
+ mkdirSync(join(stagingRoot, "word", "_rels"), { recursive: true });
+ mkdirSync(join(stagingRoot, "word", "media"), { recursive: true });
+
+ const images = copyImages();
+ writeFileSync(join(stagingRoot, "[Content_Types].xml"), contentTypesXml(), "utf8");
+ writeFileSync(join(stagingRoot, "_rels", ".rels"), packageRelsXml(), "utf8");
+ writeFileSync(join(stagingRoot, "docProps", "core.xml"), corePropsXml(), "utf8");
+ writeFileSync(join(stagingRoot, "docProps", "app.xml"), appPropsXml(), "utf8");
+ writeFileSync(join(stagingRoot, "word", "styles.xml"), stylesXml(), "utf8");
+ writeFileSync(join(stagingRoot, "word", "_rels", "document.xml.rels"), documentRelsXml(images), "utf8");
+ writeFileSync(join(stagingRoot, "word", "document.xml"), documentXml(images), "utf8");
+
+ if (existsSync(outputPath)) {
+ rmSync(outputPath, { force: true });
+ }
+ zipDirectory(stagingRoot, outputPath);
+}
+
+function copyImages() {
+ const images = [
+ {
+ id: "rIdImage1",
+ fileName: "virtual-controller-desktop.png",
+ source: uiEvidence.desktop.screenshot,
+ title: "虚拟控制器桌面端截图",
+ cx: 5943600,
+ cy: 3962400
+ },
+ {
+ id: "rIdImage2",
+ fileName: "virtual-controller-mobile.png",
+ source: uiEvidence.mobile.screenshot,
+ title: "虚拟控制器移动端截图",
+ cx: 2743200,
+ cy: 5943600
+ }
+ ];
+ for (const image of images) {
+ copyFileSync(image.source, join(stagingRoot, "word", "media", image.fileName));
+ }
+ return images;
+}
+
+function documentXml(images) {
+ const body = [];
+ body.push(heading("通用机器人离线编程系统测试文档", 1));
+ body.push(p(`生成时间:${generatedAt}`));
+ body.push(p(`测试对象:通用机器人离线编程系统 / ABB IRB120 虚拟控制器 / GRL 规范程序套件`));
+ body.push(p(`工作区:${root}`));
+ body.push(p(`最新测试 job:${job.job_id}`));
+
+ body.push(heading("一、测试结论", 1));
+ body.push(table([
+ ["项目", "结果"],
+ ["测试结论", "通过。本轮未发现非预期失败;5 个 diagnostic 程序为预期负向测试。"],
+ ["规范覆盖", `覆盖章节 ${report.coverage.coveredSections.join("、")};缺失章节:${report.coverage.missingSections.length === 0 ? "无" : report.coverage.missingSections.join("、")}`],
+ ["程序统计", `共 ${report.summary.programs} 个 GRL 规范程序;pass=${report.summary.pass},expected diagnostic=${report.summary.diagnostic},fail=${report.summary.fail}`],
+ ["测试层级", `Runtime=${report.coverage.runtimePrograms},Static=${report.coverage.staticPrograms},Post=${report.coverage.postPrograms}`],
+ ["主要证据", `${relative(jobDir)};${relative(dirname(uiEvidence.desktop.screenshot))}`]
+ ]));
+
+ body.push(heading("二、测试范围", 1));
+ body.push(p("本次测试覆盖离线编程系统的语法解析、语义编译、KDL 运动规划接口、虚拟控制器状态机、IO/wait/pulse、路径和工艺操作、异常报警、三品牌后处理、导入回读、工作台 UI 响应和截图证据。"));
+ body.push(table([
+ ["范围", "覆盖内容"],
+ ["GRL 语言", "词法、顶层结构、类型系统、表达式、目标点、速度、zone、motion、path、operation、IO、流程控制、proc/func、异常和 P1 边界。"],
+ ["运动与 KDL", "ABB IRB120 fixture、MoveJ/MoveL/MoveC、path planning、joint limit、unreachable target、trajectory summary。"],
+ ["虚拟控制器", "loadProgram、start、stepInto、hold、resume、stepMotion、stop、resetFault、runtime trace、motion queue、IO image。"],
+ ["后处理与导入", "ABB/FANUC/KUKA 输出文件、post report、ABB import roundtrip。"],
+ ["用户界面", "virtual-controller.html 桌面端和移动端渲染、交互、主要面板可见性和截图。"]
+ ]));
+
+ body.push(heading("三、测试命令与执行过程", 1));
+ body.push(table([
+ ["命令", "测试内容", "执行过程", "执行结果"],
+ ...commandResults.map((item) => [item.command, item.scope, item.process, item.result])
+ ]));
+
+ body.push(heading("四、截图证据", 1));
+ body.push(p(`截图验证应用:${uiEvidence.app}`));
+ body.push(p(`Chrome:${uiEvidence.chrome}`));
+ body.push(heading("4.1 桌面端截图", 2));
+ body.push(p(`视口:${uiEvidence.desktop.viewport.width}x${uiEvidence.desktop.viewport.height};state=${uiEvidence.desktop.state};wait=${uiEvidence.desktop.wait};trace=${uiEvidence.desktop.trace};截图:${relative(uiEvidence.desktop.screenshot)}`));
+ body.push(imageParagraph(images[0], 1));
+ body.push(heading("4.2 移动端截图", 2));
+ body.push(p(`视口:${uiEvidence.mobile.viewport.width}x${uiEvidence.mobile.viewport.height},deviceScaleFactor=${uiEvidence.mobile.viewport.deviceScaleFactor};state=${uiEvidence.mobile.state};wait=${uiEvidence.mobile.wait};trace=${uiEvidence.mobile.trace};截图:${relative(uiEvidence.mobile.screenshot)}`));
+ body.push(imageParagraph(images[1], 2));
+
+ body.push(heading("五、规范覆盖矩阵", 1));
+ body.push(table([
+ ["规范章节", "覆盖层级", "程序"],
+ ...manifest.coverage_matrix.map((item) => [
+ String(item.spec_section),
+ item.coverage_level,
+ item.program_ids.join("、")
+ ])
+ ]));
+
+ body.push(heading("六、全部测试程序明细与源码", 1));
+ for (const [index, program] of programs.entries()) {
+ appendProgramSection(body, program, index + 1);
+ }
+
+ body.push(heading("七、主要产物索引", 1));
+ body.push(table([
+ ["产物", "路径"],
+ ["job.json", relative(join(jobDir, "job.json"))],
+ ["report.json", relative(join(jobDir, "report.json"))],
+ ["report.html", relative(join(jobDir, "report.html"))],
+ ["manifest.json", relative(join(jobDir, "manifest.json"))],
+ ["桌面端截图", relative(uiEvidence.desktop.screenshot)],
+ ["移动端截图", relative(uiEvidence.mobile.screenshot)],
+ ["UI evidence.json", relative(virtualControllerEvidencePath)]
+ ]));
+
+ return `
+
+
+ ${body.join("\n")}
+
+
+
+
+
+
+
+`;
+}
+
+function appendProgramSection(body, program, index) {
+ const expectedDiagnostics = program.manifestEntry?.expected_diagnostics ?? [];
+ const actualCodes = [...new Set(program.diagnostics.map((diagnostic) => diagnostic.code))];
+ body.push(heading(`6.${index} ${program.program_id}`, 2));
+ body.push(table([
+ ["字段", "内容"],
+ ["测试内容", descriptionByProgram[program.program_id] ?? "按 manifest 执行规范测试。"],
+ ["源码文件", relative(program.sourcePath)],
+ ["覆盖层级", program.coverage_level],
+ ["覆盖章节", program.spec_sections.join("、")],
+ ["预期状态", program.expected_status],
+ ["实际状态", program.status],
+ ["预期诊断", expectedDiagnostics.length === 0 ? "无" : expectedDiagnostics.join("、")],
+ ["实际诊断代码", actualCodes.length === 0 ? "无" : actualCodes.join("、")],
+ ["输入哈希", program.input_hash],
+ ["源码行数", String(program.source.split(/\r?\n/).length)]
+ ]));
+
+ body.push(heading("测试过程", 3));
+ for (const step of programSteps(program)) {
+ body.push(p(step));
+ }
+
+ body.push(heading("执行结果摘要", 3));
+ body.push(table(programResultRows(program)));
+
+ if (program.controller?.commands?.length) {
+ body.push(heading("虚拟控制器命令轨迹", 3));
+ body.push(table([
+ ["命令", "前状态", "后状态", "结果", "诊断"],
+ ...program.controller.commands.map((command) => [
+ command.command,
+ command.before ?? "",
+ command.after ?? "",
+ command.result ?? "",
+ command.diagnostics.length === 0 ? "无" : command.diagnostics.map((diagnostic) => diagnostic.code).join("、")
+ ])
+ ]));
+ }
+
+ body.push(heading("证据文件", 3));
+ body.push(table([
+ ["类型", "路径"],
+ ...Object.entries(program.artifacts).map(([key, value]) => [key, relative(join(resultRoot, value))])
+ ]));
+
+ body.push(heading("程序源码", 3));
+ body.push(codeBlock(program.source));
+}
+
+function programSteps(program) {
+ const steps = [
+ `1. 读取源码 ${relative(program.sourcePath)},加载 program_id、spec_sections、coverage_level、expected_status 和 expected_diagnostics。`,
+ "2. 执行 parseGrl,完成词法、语法、模块结构和 source map 解析。",
+ "3. 执行 compileSemanticProgram,生成语义 IR、符号表、procedure/path/operation、KDL motion/path request 和诊断列表。"
+ ];
+ if (program.coverage_level === "Runtime") {
+ steps.push(`4. 加载 IR 到 VirtualController,按 ${manifest.runtime_commands.join(" -> ")} 执行控制器命令,采集 controller snapshot、motion queue、runtime trace、IO image 和 trajectory summary。`);
+ steps.push("5. 对比实际状态与 manifest 预期状态;对比实际诊断代码与 expected_diagnostics;写入 compile/controller/motion-queue/trace/io/trajectory/post/roundtrip 证据。");
+ } else if (program.coverage_level === "Static") {
+ steps.push("4. 执行 static preflight diagnostics,覆盖表达式、语义、运动、path、流程控制等负向检查;不要求进入 happy-path 运行。");
+ steps.push("5. 对比实际诊断代码与 expected_diagnostics,确认 diagnostic 状态为预期负向结果,并写入 compile 及各类空/摘要证据文件。");
+ } else {
+ steps.push("4. 执行 postProcessAllBrands,生成 ABB/FANUC/KUKA 输出文件名和 post report。");
+ steps.push("5. 执行 ABB import roundtrip 摘要检查,记录 pass/warn/fail 与导入诊断,并写入 post-report/roundtrip 证据。");
+ }
+ return steps;
+}
+
+function programResultRows(program) {
+ const rows = [
+ ["项目", "结果"],
+ ["解析", program.compile.parsed ? "parsed=true" : "parsed=false"],
+ ["模块名", program.compile.moduleName ?? ""],
+ ["sourceMapEntries", String(program.compile.sourceMapEntries)],
+ ["symbol/procedure/path/operation", `${program.compile.symbolCount}/${program.compile.procedureCount}/${program.compile.pathCount}/${program.compile.operationCount}`],
+ ["KDL motion/path requests", `${program.compile.kdlMotionRequests}/${program.compile.kdlPathRequests}`],
+ ["状态", program.status]
+ ];
+ if (program.controller) {
+ rows.push(["controller final state", program.controller.snapshot.state.state]);
+ rows.push(["runtime trace events", String(program.trace?.length ?? 0)]);
+ rows.push(["motion queue items", String(program.motionQueue?.items?.length ?? 0)]);
+ rows.push(["IO image count", String(Object.keys(program.io?.image ?? {}).length)]);
+ }
+ if (program.trajectory) {
+ rows.push(["trajectory sample/duration", `${program.trajectory.sampleCount}/${program.trajectory.duration}`]);
+ }
+ if (program.post) {
+ rows.push(["post filenames", program.post.filenames.join("、")]);
+ rows.push(["post report codes", program.post.report.length === 0 ? "无" : [...new Set(program.post.report.map((issue) => issue.code))].join("、")]);
+ }
+ if (program.roundtrip) {
+ rows.push(["roundtrip", `${program.roundtrip.status}; ${program.roundtrip.diagnostics.map((diagnostic) => diagnostic.code).join("、") || "无诊断"}`]);
+ }
+ rows.push(["诊断数量", String(program.diagnostics.length)]);
+ return rows;
+}
+
+function heading(text, level) {
+ return paragraph(text, `Heading${Math.min(level, 3)}`);
+}
+
+function p(text) {
+ return paragraph(text, "BodyText");
+}
+
+function paragraph(text, style) {
+ return `${run(text)}`;
+}
+
+function run(text) {
+ return `${escapeXml(String(text))}`;
+}
+
+function codeBlock(text) {
+ const normalized = text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
+ const lines = normalized.endsWith("\n") ? normalized.slice(0, -1).split("\n") : normalized.split("\n");
+ return lines.map((line) =>
+ `${escapeXml(line === "" ? " " : line)}`
+ ).join("\n");
+}
+
+function table(rows) {
+ const width = Math.floor(9000 / Math.max(1, rows[0]?.length ?? 1));
+ return `
+
+ ${rows.map((row, rowIndex) => `${row.map((cell) => tableCell(cell, width, rowIndex === 0)).join("")}`).join("\n")}
+ `;
+}
+
+function tableCell(text, width, header) {
+ return `
+
+ ${header ? "" : ""}${run(text)}
+ `;
+}
+
+function imageParagraph(image, docPrId) {
+ return `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `;
+}
+
+function contentTypesXml() {
+ return `
+
+
+
+
+
+
+
+
+`;
+}
+
+function packageRelsXml() {
+ return `
+
+
+
+
+`;
+}
+
+function documentRelsXml(images) {
+ return `
+
+
+ ${images.map((image) => ``).join("\n")}
+`;
+}
+
+function corePropsXml() {
+ const iso = new Date().toISOString();
+ return `
+
+ 通用机器人离线编程系统测试文档
+ Codex
+ Codex
+ ${iso}
+ ${iso}
+`;
+}
+
+function appPropsXml() {
+ return `
+
+ Codex
+ 0
+ false
+ KDL Work
+ false
+ false
+ false
+ 16.0000
+`;
+}
+
+function stylesXml() {
+ return `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+}
+
+function latestJobId() {
+ const jobs = readdirSync(resultRoot, { withFileTypes: true })
+ .filter((entry) => entry.isDirectory() && existsSync(join(resultRoot, entry.name, "job.json")))
+ .map((entry) => ({
+ name: entry.name,
+ mtimeMs: statSync(join(resultRoot, entry.name, "job.json")).mtimeMs
+ }))
+ .sort((a, b) => b.mtimeMs - a.mtimeMs);
+ if (jobs.length === 0) {
+ throw new Error(`No abb120 spec job found in ${resultRoot}`);
+ }
+ return jobs[0].name;
+}
+
+function readJson(path) {
+ return JSON.parse(readFileSync(path, "utf8"));
+}
+
+function relative(path) {
+ return path.replace(`${root}${sep}`, "").replaceAll("\\", "/");
+}
+
+function escapeXml(value) {
+ return String(value)
+ .replaceAll("&", "&")
+ .replaceAll("<", "<")
+ .replaceAll(">", ">")
+ .replaceAll("\"", """)
+ .replaceAll("'", "'");
+}
+
+function psSingleQuoted(value) {
+ return `'${String(value).replaceAll("'", "''")}'`;
+}
+
+function zipDirectory(sourceDir, destinationFile) {
+ const script = [
+ "Add-Type -AssemblyName System.IO.Compression.FileSystem",
+ `$src = ${psSingleQuoted(sourceDir)}`,
+ `$dst = ${psSingleQuoted(destinationFile)}`,
+ "if (Test-Path -LiteralPath $dst) { Remove-Item -LiteralPath $dst -Force }",
+ "[System.IO.Compression.ZipFile]::CreateFromDirectory($src, $dst)"
+ ].join("\n");
+ execFileSync("powershell", ["-NoProfile", "-ExecutionPolicy", "Bypass", "-Command", script], {
+ stdio: "inherit"
+ });
+}
+
+function assertSafeStaging(path) {
+ const allowedRoot = join(webRoot, "test-results") + sep;
+ const resolved = resolve(path);
+ if (!resolved.startsWith(allowedRoot)) {
+ throw new Error(`Refusing to clear staging path outside test-results: ${resolved}`);
+ }
+}
+
+function formatShanghaiTime(date) {
+ const parts = new Intl.DateTimeFormat("zh-CN", {
+ timeZone: "Asia/Shanghai",
+ year: "numeric",
+ month: "2-digit",
+ day: "2-digit",
+ hour: "2-digit",
+ minute: "2-digit",
+ second: "2-digit",
+ hour12: false
+ }).formatToParts(date);
+ const value = Object.fromEntries(parts.map((part) => [part.type, part.value]));
+ return `${value.year}-${value.month}-${value.day} ${value.hour}:${value.minute}:${value.second} Asia/Shanghai`;
+}
diff --git a/kdl-wasm/web/scripts/generate-grl-user-manual.mjs b/kdl-wasm/web/scripts/generate-grl-user-manual.mjs
new file mode 100644
index 0000000..58c4299
--- /dev/null
+++ b/kdl-wasm/web/scripts/generate-grl-user-manual.mjs
@@ -0,0 +1,598 @@
+import { execFileSync } from "node:child_process";
+import {
+ copyFileSync,
+ existsSync,
+ mkdirSync,
+ readFileSync,
+ rmSync,
+ writeFileSync
+} from "node:fs";
+import { join, resolve, sep } from "node:path";
+import { fileURLToPath } from "node:url";
+
+const root = resolve(fileURLToPath(new URL("../../..", import.meta.url)));
+const webRoot = join(root, "kdl-wasm", "web");
+const docRoot = join(root, "work", "doc");
+const stagingRoot = join(webRoot, "test-results", "grl-manual-docx-build");
+const outputPath = join(docRoot, "GRL功能语法逻辑与程序创建使用手册.docx");
+
+const flowDir = join(docRoot, "通用机器人项目功能与数据流程图-png");
+const flowImages = [
+ { source: join(flowDir, "flow-01.png"), title: "系统功能总览图", cx: 5943600, cy: 3343275 },
+ { source: join(flowDir, "flow-02.png"), title: "GRL 到 IR 编译流程图", cx: 5943600, cy: 3343275 },
+ { source: join(flowDir, "flow-03.png"), title: "运动规划与 KDL 数据流图", cx: 5943600, cy: 3343275 },
+ { source: join(flowDir, "flow-04.png"), title: "虚拟控制器执行流程图", cx: 5943600, cy: 3343275 },
+ { source: join(flowDir, "flow-05.png"), title: "后处理与导入回读流程图", cx: 5943600, cy: 3343275 }
+];
+const uiImages = [
+ {
+ source: join(webRoot, "test-results", "virtual-controller", "virtual-controller-desktop.png"),
+ title: "虚拟控制器桌面端界面",
+ cx: 5943600,
+ cy: 3962400
+ },
+ {
+ source: join(webRoot, "test-results", "virtual-controller", "virtual-controller-mobile.png"),
+ title: "虚拟控制器移动端界面",
+ cx: 2743200,
+ cy: 5943600
+ }
+];
+
+const smokeSourcePath = join(webRoot, "tests", "fixtures", "abb120", "programs", "A120_00_Smoke.grl");
+const blendSourcePath = join(webRoot, "tests", "fixtures", "abb120", "programs", "A120_20_CartesianBlend.grl");
+const ioSourcePath = join(webRoot, "tests", "fixtures", "abb120", "spec-programs", "runtime", "W2_60_IOWaitPulse.grl");
+const fullExamplePath = join(webRoot, "tests", "fixtures", "abb120", "spec-programs", "runtime", "W2_99_FullSpecExample.grl");
+
+const generatedAt = formatShanghaiTime(new Date());
+
+buildDocx();
+console.log(JSON.stringify({ outputPath }, null, 2));
+
+function buildDocx() {
+ assertSafeStaging(stagingRoot);
+ rmSync(stagingRoot, { recursive: true, force: true });
+ mkdirSync(join(stagingRoot, "_rels"), { recursive: true });
+ mkdirSync(join(stagingRoot, "docProps"), { recursive: true });
+ mkdirSync(join(stagingRoot, "word", "_rels"), { recursive: true });
+ mkdirSync(join(stagingRoot, "word", "media"), { recursive: true });
+
+ const images = copyImages([...flowImages, ...uiImages]);
+ writeFileSync(join(stagingRoot, "[Content_Types].xml"), contentTypesXml(), "utf8");
+ writeFileSync(join(stagingRoot, "_rels", ".rels"), packageRelsXml(), "utf8");
+ writeFileSync(join(stagingRoot, "docProps", "core.xml"), corePropsXml(), "utf8");
+ writeFileSync(join(stagingRoot, "docProps", "app.xml"), appPropsXml(), "utf8");
+ writeFileSync(join(stagingRoot, "word", "styles.xml"), stylesXml(), "utf8");
+ writeFileSync(join(stagingRoot, "word", "_rels", "document.xml.rels"), documentRelsXml(images), "utf8");
+ writeFileSync(join(stagingRoot, "word", "document.xml"), documentXml(images), "utf8");
+
+ if (existsSync(outputPath)) {
+ rmSync(outputPath, { force: true });
+ }
+ zipDirectory(stagingRoot, outputPath);
+}
+
+function documentXml(images) {
+ const body = [];
+
+ body.push(heading("GRL 功能、语法逻辑与程序创建使用手册", 1));
+ body.push(p(`生成时间:${generatedAt}`));
+ body.push(p("适用对象:通用机器人离线编程系统用户、工艺工程师、自动编程开发人员、虚拟调试人员。"));
+ body.push(p("手册目标:用中文说明 GRL 的功能边界、语法逻辑、程序对象关系、创建程序步骤、仿真检查和后处理输出方式,并通过图示和源码示例帮助用户快速编写可运行程序。"));
+
+ body.push(heading("一、GRL 是什么", 1));
+ body.push(p("GRL,全称 Generic Robot Language,是本离线编程系统中的通用机器人程序语言。它不是 ABB、FANUC 或 KUKA 任一品牌语言的拷贝,而是把多品牌机器人共同具备的目标点、运动、路径、工艺、IO、流程控制、异常和后处理语义抽象为统一文本。"));
+ body.push(table([
+ ["目标", "说明"],
+ ["统一描述", "用同一套 GRL 描述机器人程序、路径、工艺动作和 IO 逻辑。"],
+ ["可编译", "GRL 经 lexer/parser/semantic analyzer 编译为统一 Executable IR。"],
+ ["可仿真", "IR 可进入虚拟控制器运行,产生 trace、motion queue、IO image 和诊断。"],
+ ["可后处理", "同一 IR 可输出 ABB RAPID、FANUC LS/TP 风格文本、KUKA KRL 原型程序。"],
+ ["可维护", "文本稳定、可读、可 diff,适合版本管理和自动生成。"]
+ ]));
+
+ body.push(heading("二、系统功能总览", 1));
+ body.push(p("离线编程系统从项目数据、机器人模型和 GRL 程序出发,经过语义编译、KDL 运动规划、虚拟控制器执行、诊断报告和多品牌后处理,形成完整离线开发闭环。"));
+ body.push(imageWithCaption(images[0], 1, "图 1 系统功能总览图"));
+ body.push(table([
+ ["模块", "主要职责"],
+ ["GRL 源码", "声明工具、坐标系、目标点、速度、zone、path、operation 和 proc。"],
+ ["编译器", "把源码解析为 AST,做符号解析、单位归一化、语义检查,生成 IR 和 KDL request。"],
+ ["KDL 运动规划", "处理 FK、IK、MoveJ、MoveL、MoveC、Path planning、可达性和轨迹采样。"],
+ ["虚拟控制器", "执行 IR,维护程序计数器、调用栈、报警队列、IO 镜像、运动队列和 trace。"],
+ ["后处理器", "按 ABB/FANUC/KUKA 规则输出品牌程序,并记录无法保真映射的转换报告。"]
+ ]));
+
+ body.push(heading("三、GRL 程序基本结构", 1));
+ body.push(p("一个 GRL 文件通常由 language 声明、module 声明、数据声明、目标点、路径、工艺操作和 main 子程序组成。最小程序只需要定义模块入口和一条运动。"));
+ body.push(codeBlock(readFileSync(smokeSourcePath, "utf8")));
+ body.push(table([
+ ["结构", "作用"],
+ ["language grl 0.1", "声明语言版本,便于后续兼容升级。"],
+ ["module", "程序模块,类似 ABB MODULE、KUKA DEF 文件或 FANUC 程序容器。"],
+ ["const/persistent/var", "声明常量、持久数据或局部变量。"],
+ ["target", "声明 joint_target 或 pose_target。"],
+ ["proc main()", "默认入口程序。虚拟控制器从 main 开始执行。"],
+ ["movej/movel/movec", "基础运动指令,最终进入 KDL 规划或品牌后处理。"]
+ ]));
+
+ body.push(heading("四、对象模型和语法逻辑", 1));
+ body.push(p("GRL 的语法逻辑建议按“数据先声明、路径再组织、工艺再封装、入口只调用”的方式理解。手写小程序可以直接在 main 中写运动,自动编程和复杂工艺应优先生成 path 和 operation。"));
+ body.push(imageWithCaption(images[1], 2, "图 2 GRL 到 IR 编译流程图"));
+ body.push(table([
+ ["对象", "语法", "使用建议"],
+ ["工具", "persistent tool gripper = tool { ... }", "描述 TCP、质量、重心。运动时通过 tool 参数或 path defaults 引用。"],
+ ["坐标系", "persistent frame fixture = frame { ... }", "描述工件坐标或基坐标。目标点和路径应显式绑定 frame。"],
+ ["速度", "const speed v = linear(300 mm/s) / joint(50 %)", "按运动类型选择 joint、linear、angular。"],
+ ["过渡", "const zone z10 = z(10 mm) / fine / cnt(30)", "fine 精确到点;z/cnt/continuous 用于连续过渡。"],
+ ["目标点", "target pick = pose_target { pose: pose(...) }", "关节目标用 joint_target;笛卡尔点用 pose_target。"],
+ ["路径", "path pick_path { defaults ... point ... event ... }", "自动编程优先生成 path,点名保持稳定。"],
+ ["工艺", "operation pick_op { kind: handling path: pick_path ... }", "封装路径、工艺参数、start_action/end_action。"],
+ ["入口程序", "proc main() run_operation pick_op end", "入口程序保持短,便于调试和后处理。"]
+ ]));
+
+ body.push(heading("五、表达式、单位和常量求值", 1));
+ body.push(p("GRL 支持带单位表达式。编译器会在需要常量的位置做单位归一化,例如 mm 转 m、deg 转 rad、ms 转 s、% 转比例。这样同一程序在仿真和后处理中使用统一数值。"));
+ body.push(table([
+ ["类别", "示例", "说明"],
+ ["长度", "100 mm、0.25 m", "内部统一为 meter。"],
+ ["角度", "90 deg、1.57 rad", "内部统一为 radian。"],
+ ["时间", "200 ms、2 s", "内部统一为 second。"],
+ ["速度", "linear(300 mm/s)、joint(50 %)", "分别表示 TCP 线速度和关节速度比例。"],
+ ["数学函数", "atan2(0, 1)、max(50 mm/s, 150 mm/s)", "支持常用三角函数和数值函数。"],
+ ["单位检查", "10 mm + 2 s", "不同维度相加会产生诊断。"]
+ ]));
+
+ body.push(heading("六、运动语法", 1));
+ body.push(p("运动指令分为 MoveJ、MoveL、MoveC 三类。MoveJ 走关节空间,MoveL 走 TCP 直线,MoveC 走 TCP 圆弧。每条运动最终都需要确定 target、speed、zone、tool 和 frame。"));
+ body.push(imageWithCaption(images[2], 3, "图 3 运动规划与 KDL 数据流图"));
+ body.push(table([
+ ["指令", "语法", "语义", "品牌映射"],
+ ["movej", "movej home speed v_joint zone fine", "关节空间运动,适合回零和快速接近。", "ABB MoveJ / FANUC J / KUKA PTP"],
+ ["movel", "movel pick speed v_linear zone z10", "TCP 直线运动,适合接近、加工、搬运直线段。", "ABB MoveL / FANUC L / KUKA LIN"],
+ ["movec", "movec via mid target arc_end speed v zone z10", "TCP 圆弧运动,通过 via 点到终点。", "ABB MoveC / FANUC C / KUKA CIRC"],
+ ["run_path", "run_path cart_path", "执行已声明路径。", "可展开为品牌运动语句"],
+ ["run_operation", "run_operation pick_op", "执行工艺操作,包含 action 和 path。", "按品牌能力展开或报告"]
+ ]));
+ body.push(p("下面是当前工作区中的笛卡尔混合路径示例,包含 tool/frame、表达式速度、zone clamp、MoveL、MoveC 和 run_path。"));
+ body.push(codeBlock(readFileSync(blendSourcePath, "utf8")));
+
+ body.push(heading("七、Path 和 Operation", 1));
+ body.push(p("Path 是离线编程的核心对象,适合承载 CAD 曲线、示教点、工艺采样点和路径事件。Operation 是对 Path 的工艺封装,适合表达搬运、焊接、喷涂、打磨、上下料等任务。"));
+ body.push(table([
+ ["写法", "说明"],
+ ["defaults", "为路径点设置默认 speed、zone、tool、frame,减少重复。"],
+ ["source", "记录 CAD 曲线、采样间距、规划来源等元数据。"],
+ ["point", "定义路径点和该点运动方式。"],
+ ["event before/after/at", "定义路径事件,例如到点后开夹爪、距离某点前开焊接。"],
+ ["operation process", "记录工艺参数,例如 gripper、weld_mode、paint_recipe。"],
+ ["start_action/end_action", "操作开始或结束时执行 IO、wait、pulse 等动作。"]
+ ]));
+
+ body.push(heading("八、IO、wait 和 pulse", 1));
+ body.push(p("GRL 中的 IO 使用统一引用格式:io.di、io.do、io.ai、io.ao、io.gi、io.go、io.ri、io.ro 和 io.alias。离线系统运行时维护虚拟 IO 镜像,程序、用户和脚本都可以写入这份镜像。"));
+ body.push(table([
+ ["语法", "含义"],
+ ["io.do[1] = true", "写数字输出。"],
+ ["io.ao[1] = 0.75", "写模拟输出。"],
+ ["wait io.di[1] == true timeout 2 s", "等待输入满足条件,超时产生诊断或报警。"],
+ ["wait all(...)", "所有条件满足才继续。"],
+ ["wait any(...)", "任一条件满足即继续。"],
+ ["rising/falling/changed", "边沿或变化检测。"],
+ ["pulse io.do[2] duration 100 ms", "输出置 true,持续指定时间后自动复位。"]
+ ]));
+ body.push(codeBlock(readFileSync(ioSourcePath, "utf8")));
+
+ body.push(heading("九、流程控制、子程序和异常", 1));
+ body.push(p("GRL 支持结构化控制和子程序。简单运行逻辑写在 proc 中,纯计算逻辑写在 func 中。func 默认不应产生运动、IO、wait、pulse 等副作用。"));
+ body.push(table([
+ ["能力", "语法", "说明"],
+ ["条件", "if / elseif / else / end", "按布尔条件选择执行分支。"],
+ ["循环", "while、for to step", "执行重复逻辑,break/continue 必须处于合法块内。"],
+ ["多分支", "switch / case / default", "case 必须是常量表达式,不能重复。"],
+ ["子程序", "proc name(in int slot) ... end", "可定义 in/out/inout 参数。"],
+ ["函数", "func bool ok() return ... end", "有返回值,建议无副作用。"],
+ ["报警", "alarm ID \"message\" severity warning", "进入虚拟控制器报警队列。"],
+ ["异常", "raise、try/catch/finally", "P0 支持基础语义,复杂品牌恢复分阶段扩展。"]
+ ]));
+
+ body.push(heading("十、从零创建一个 GRL 程序", 1));
+ body.push(p("建议按以下顺序创建程序。先保证数据和坐标清楚,再组织路径和工艺,最后在 main 中调用。"));
+ body.push(table([
+ ["步骤", "操作", "检查点"],
+ ["1", "创建 .grl 文件,写 language 和 module。", "模块名使用 ASCII 标识符,文件 UTF-8。"],
+ ["2", "声明 tool 和 frame。", "TCP、质量、工件坐标单位明确。"],
+ ["3", "声明 speed 和 zone。", "速度和过渡统一命名,例如 v_fast、v_pick、z10。"],
+ ["4", "声明 target。", "home 用 joint_target,工艺点用 pose_target。"],
+ ["5", "创建 path。", "设置 defaults,点名按 p000/p001 或语义名称稳定输出。"],
+ ["6", "添加 path event 或 operation action。", "夹具、等待、脉冲、工艺开关不要散落在 main 中。"],
+ ["7", "创建 operation。", "把 path 和工艺参数封装成可复用操作。"],
+ ["8", "编写 proc main。", "只做 set_tool/set_frame、run_operation、回 home 等主流程。"],
+ ["9", "运行编译和测试。", "执行 npm test 或 suite,检查 diagnostics、trace、motion queue。"],
+ ["10", "后处理输出。", "检查 ABB/FANUC/KUKA 转换报告,不支持项不能忽略。"]
+ ]));
+
+ body.push(heading("十一、完整程序模板", 1));
+ body.push(p("下面给出一个可直接改写的模板,适合搬运、上下料、夹具动作和基础路径。"));
+ body.push(codeBlock(`language grl 0.1
+module DemoPickPlace
+ persistent tool gripper = tool {
+ tcp: pose(0 mm, 0 mm, 120 mm, 0 deg, 0 deg, 0 deg),
+ mass: 1.5 kg
+ }
+
+ persistent frame fixture = frame {
+ origin: pose(800 mm, 0 mm, 0 mm, 0 deg, 0 deg, 0 deg)
+ }
+
+ const speed v_joint = joint(50 %)
+ const speed v_pick = linear(250 mm/s)
+ const zone z10 = z(10 mm)
+ const zone zf = fine
+
+ target home = joint_target { joints: [0 deg, 0 deg, 0 deg, 0 deg, 0 deg, 0 deg] }
+ target pick = pose_target { pose: pose(500 mm, 100 mm, 200 mm, 180 deg, 0 deg, 90 deg), tool: gripper, frame: fixture }
+ target place = pose_target { pose: pose(650 mm, -100 mm, 200 mm, 180 deg, 0 deg, 90 deg), tool: gripper, frame: fixture }
+
+ path pick_path {
+ defaults { speed: v_pick, zone: z10, tool: gripper, frame: fixture }
+ point approach movel pick offset z 100 mm
+ point at_pick movel pick zone zf
+ event after at_pick io.do[1] = true
+ event after at_pick wait io.di[1] == true timeout 2 s on_timeout alarm "Clamp close timeout"
+ point leave movel pick offset z 100 mm
+ }
+
+ operation pick_op {
+ kind: handling
+ path: pick_path
+ process { gripper: "main_clamp" }
+ }
+
+ proc main()
+ set_tool gripper
+ set_frame fixture
+ movej home speed v_joint zone zf
+ run_operation pick_op
+ movej home speed v_joint zone zf
+ end
+end`));
+
+ body.push(heading("十二、编译、仿真和截图验证", 1));
+ body.push(imageWithCaption(images[3], 4, "图 4 虚拟控制器执行流程图"));
+ body.push(p("编译后,虚拟控制器会加载 IR,从 main 开始执行,采集运行 trace、motion queue、IO image、报警队列和诊断。桌面端和移动端界面可用于检查程序结构、状态、编辑器、面板和运行结果。"));
+ body.push(imageWithCaption(images[5], 6, "图 5 虚拟控制器桌面端界面"));
+ body.push(imageWithCaption(images[6], 7, "图 6 虚拟控制器移动端界面"));
+ body.push(table([
+ ["命令", "用途"],
+ ["npm run typecheck", "检查 TypeScript 类型。"],
+ ["npm test", "运行 KDL、GRL、runtime、post/import、integration 全量测试。"],
+ ["npm run suite:abb120-spec", "运行 19 个 ABB120 GRL 规范程序,生成 job/report/program 证据。"],
+ ["npm run verify:virtual-controller", "打开虚拟控制器 HTML,执行交互并生成桌面/移动截图。"]
+ ]));
+
+ body.push(heading("十三、后处理和跨品牌输出", 1));
+ body.push(imageWithCaption(images[4], 5, "图 7 后处理与导入回读流程图"));
+ body.push(table([
+ ["GRL", "ABB RAPID", "FANUC LS/TP", "KUKA KRL"],
+ ["module", "MODULE", "/PROG 或模块", "DEF/.src"],
+ ["proc", "PROC", "CALL 子程序", "DEF 子程序"],
+ ["movej", "MoveJ", "J P[...] ", "PTP"],
+ ["movel", "MoveL", "L P[...] ", "LIN"],
+ ["movec", "MoveC", "C P[...] ", "CIRC"],
+ ["io.do[1] = true", "SetDO do1, 1", "DO[1]=ON", "$OUT[1]=TRUE"],
+ ["wait io.di[1] == true", "WaitDI di1, 1", "WAIT DI[1]=ON", "WAIT FOR $IN[1]==TRUE"]
+ ]));
+ body.push(p("后处理器遇到品牌不支持或只能近似表达的语义时,应写入转换报告。用户必须检查报告,再到真实控制器中做品牌校验和现场低速试运行。"));
+
+ body.push(heading("十四、常见诊断和处理建议", 1));
+ body.push(table([
+ ["诊断", "常见原因", "处理方式"],
+ ["GRL_EXPR_UNKNOWN_SYMBOL", "表达式引用未声明常量或变量。", "检查拼写和声明顺序。"],
+ ["GRL_EXPR_UNIT_MISMATCH", "不同物理单位混合计算。", "统一长度、时间、角度或速度维度。"],
+ ["GRL_TARGET_NOT_FOUND", "运动或路径点引用不存在目标点。", "补充 target 或修正名称。"],
+ ["KDL_TARGET_UNREACHABLE", "笛卡尔点超出机器人工作空间。", "调整目标点、工具、坐标系或机器人配置。"],
+ ["KDL_JOINT_LIMIT", "目标关节超过限位。", "修改 joint_target 或使用 IK 可达姿态。"],
+ ["GRL_PATH_EMPTY", "path 没有 point。", "至少添加一个 point。"],
+ ["VC_WAIT_TIMEOUT", "wait 条件在 timeout 内未满足。", "检查 IO 输入、脚本、超时时间和 on_timeout 动作。"],
+ ["GRL_POST_UNSUPPORTED", "目标品牌后处理暂不支持该语义。", "查看转换报告,必要时改写为品牌可支持结构。"]
+ ]));
+
+ body.push(heading("十五、编写规范建议", 1));
+ body.push(table([
+ ["建议", "说明"],
+ ["名称稳定", "target、path point、operation 命名稳定,便于 diff 和回读。"],
+ ["显式单位", "自动生成程序尽量输出 mm、deg、mm/s、ms 等单位。"],
+ ["入口简短", "main 中只保留主流程调用,复杂路径放入 path/operation。"],
+ ["默认集中", "path defaults 中集中设置 speed、zone、tool、frame。"],
+ ["IO 事件贴近路径", "与路径点相关的夹具和工艺开关写成 event。"],
+ ["诊断必看", "error 必须修复;warning 必须人工确认;info 可作为转换记录。"],
+ ["先仿真后后处理", "先通过 GRL 编译和虚拟控制器,再输出品牌程序。"],
+ ["真实运行前校验", "后处理程序必须经过品牌控制器验证和现场低速试运行。"]
+ ]));
+
+ body.push(heading("十六、参考完整示例", 1));
+ body.push(p("以下是规范套件中的完整示例程序,覆盖 tool/frame、path、operation、IO event、run_operation 和回 home,可作为复杂程序的参考。"));
+ body.push(codeBlock(readFileSync(fullExamplePath, "utf8")));
+
+ return `
+
+
+ ${body.join("\n")}
+
+
+
+
+
+
+
+`;
+}
+
+function copyImages(imageInputs) {
+ return imageInputs.map((image, index) => {
+ const fileName = `image-${String(index + 1).padStart(2, "0")}.png`;
+ copyFileSync(image.source, join(stagingRoot, "word", "media", fileName));
+ return {
+ ...image,
+ id: `rIdImage${index + 1}`,
+ fileName
+ };
+ });
+}
+
+function heading(text, level) {
+ return paragraph(text, `Heading${Math.min(level, 3)}`);
+}
+
+function p(text) {
+ return paragraph(text, "BodyText");
+}
+
+function paragraph(text, style) {
+ return `${run(text)}`;
+}
+
+function run(text) {
+ return `${escapeXml(String(text))}`;
+}
+
+function table(rows) {
+ const width = Math.floor(9200 / Math.max(1, rows[0]?.length ?? 1));
+ return `
+
+ ${rows.map((row, rowIndex) => `${row.map((cell) => tableCell(cell, width, rowIndex === 0)).join("")}`).join("\n")}
+ `;
+}
+
+function tableCell(text, width, header) {
+ return `
+
+ ${header ? "" : ""}${run(text)}
+ `;
+}
+
+function codeBlock(text) {
+ const normalized = text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
+ const lines = normalized.endsWith("\n") ? normalized.slice(0, -1).split("\n") : normalized.split("\n");
+ return lines.map((line) =>
+ `${escapeXml(line === "" ? " " : line)}`
+ ).join("\n");
+}
+
+function imageWithCaption(image, docPrId, caption) {
+ return `${imageParagraph(image, docPrId)}${paragraph(caption, "Caption")}`;
+}
+
+function imageParagraph(image, docPrId) {
+ return `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `;
+}
+
+function contentTypesXml() {
+ return `
+
+
+
+
+
+
+
+
+`;
+}
+
+function packageRelsXml() {
+ return `
+
+
+
+
+`;
+}
+
+function documentRelsXml(images) {
+ return `
+
+
+ ${images.map((image) => ``).join("\n")}
+`;
+}
+
+function corePropsXml() {
+ const iso = new Date().toISOString();
+ return `
+
+ GRL 功能语法逻辑与程序创建使用手册
+ Codex
+ Codex
+ ${iso}
+ ${iso}
+`;
+}
+
+function appPropsXml() {
+ return `
+
+ Codex
+ 0
+ false
+ KDL Work
+ false
+ false
+ false
+ 16.0000
+`;
+}
+
+function stylesXml() {
+ return `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+}
+
+function escapeXml(value) {
+ return String(value)
+ .replaceAll("&", "&")
+ .replaceAll("<", "<")
+ .replaceAll(">", ">")
+ .replaceAll("\"", """)
+ .replaceAll("'", "'");
+}
+
+function psSingleQuoted(value) {
+ return `'${String(value).replaceAll("'", "''")}'`;
+}
+
+function zipDirectory(sourceDir, destinationFile) {
+ const script = [
+ "Add-Type -AssemblyName System.IO.Compression.FileSystem",
+ `$src = ${psSingleQuoted(sourceDir)}`,
+ `$dst = ${psSingleQuoted(destinationFile)}`,
+ "if (Test-Path -LiteralPath $dst) { Remove-Item -LiteralPath $dst -Force }",
+ "[System.IO.Compression.ZipFile]::CreateFromDirectory($src, $dst)"
+ ].join("\n");
+ execFileSync("powershell", ["-NoProfile", "-ExecutionPolicy", "Bypass", "-Command", script], {
+ stdio: "inherit"
+ });
+}
+
+function assertSafeStaging(path) {
+ const allowedRoot = join(webRoot, "test-results") + sep;
+ const resolved = resolve(path);
+ if (!resolved.startsWith(allowedRoot)) {
+ throw new Error(`Refusing to clear staging path outside test-results: ${resolved}`);
+ }
+}
+
+function formatShanghaiTime(date) {
+ const parts = new Intl.DateTimeFormat("zh-CN", {
+ timeZone: "Asia/Shanghai",
+ year: "numeric",
+ month: "2-digit",
+ day: "2-digit",
+ hour: "2-digit",
+ minute: "2-digit",
+ second: "2-digit",
+ hour12: false
+ }).formatToParts(date);
+ const value = Object.fromEntries(parts.map((part) => [part.type, part.value]));
+ return `${value.year}-${value.month}-${value.day} ${value.hour}:${value.minute}:${value.second} Asia/Shanghai`;
+}
diff --git a/kdl-wasm/web/scripts/run-abb120-spec-suite.ts b/kdl-wasm/web/scripts/run-abb120-spec-suite.ts
new file mode 100644
index 0000000..9d205ab
--- /dev/null
+++ b/kdl-wasm/web/scripts/run-abb120-spec-suite.ts
@@ -0,0 +1,101 @@
+import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
+import { dirname, join, resolve } from "node:path";
+import { fileURLToPath } from "node:url";
+import { runAbb120SpecSuite } from "../src/suites/abb120SpecSuite.js";
+
+const webRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
+const specRoot = join(webRoot, "tests", "fixtures", "abb120", "spec-programs");
+const manifest = JSON.parse(readFileSync(join(specRoot, "manifest.json"), "utf8"));
+const programs = manifest.programs.map((entry: { program_id: string; file: string }) => ({
+ program_id: entry.program_id,
+ file: entry.file,
+ text: readFileSync(join(specRoot, entry.file), "utf8")
+}));
+const job = runAbb120SpecSuite(manifest, programs, {
+ gitRevision: process.env.GIT_REVISION ?? "working-tree"
+});
+const outputRoot = resolve(webRoot, "test-results", "abb120-spec", job.job_id);
+
+mkdirSync(outputRoot, { recursive: true });
+writeFileSync(join(outputRoot, "manifest.json"), `${JSON.stringify(manifest, null, 2)}\n`);
+writeFileSync(join(outputRoot, "job.json"), `${JSON.stringify(job, null, 2)}\n`);
+writeFileSync(join(outputRoot, "report.json"), `${JSON.stringify(reportJson(job), null, 2)}\n`);
+writeFileSync(join(outputRoot, "report.html"), reportHtml(job));
+
+for (const program of job.programs) {
+ const programDir = join(outputRoot, "programs", program.program_id);
+ mkdirSync(programDir, { recursive: true });
+ writeFileSync(join(programDir, "compile.json"), `${JSON.stringify(program.compile, null, 2)}\n`);
+ writeFileSync(join(programDir, "controller.json"), `${JSON.stringify(program.controller ?? {}, null, 2)}\n`);
+ writeFileSync(join(programDir, "motion-queue.json"), `${JSON.stringify(program.motionQueue ?? {}, null, 2)}\n`);
+ writeFileSync(join(programDir, "trace.json"), `${JSON.stringify(program.trace ?? [], null, 2)}\n`);
+ writeFileSync(join(programDir, "io.json"), `${JSON.stringify(program.io ?? {}, null, 2)}\n`);
+ writeFileSync(join(programDir, "trajectory.json"), `${JSON.stringify(program.trajectory ?? {}, null, 2)}\n`);
+ writeFileSync(join(programDir, "post-report.json"), `${JSON.stringify(program.post ?? {}, null, 2)}\n`);
+ writeFileSync(join(programDir, "roundtrip.json"), `${JSON.stringify(program.roundtrip ?? {}, null, 2)}\n`);
+}
+
+console.log(JSON.stringify({
+ job_id: job.job_id,
+ outputRoot,
+ programs: job.programs.length,
+ missingSections: job.coverage.missingSections
+}, null, 2));
+
+function reportJson(job: ReturnType) {
+ return {
+ job_id: job.job_id,
+ suite_id: job.suite_id,
+ robot_id: job.robot_id,
+ coverage: job.coverage,
+ summary: {
+ programs: job.programs.length,
+ pass: job.programs.filter((program) => program.status === "pass").length,
+ diagnostic: job.programs.filter((program) => program.status === "diagnostic").length,
+ fail: job.programs.filter((program) => program.status === "fail").length
+ },
+ diagnostics: job.programs.flatMap((program) =>
+ program.diagnostics.map((diagnostic) => ({
+ program_id: program.program_id,
+ ...diagnostic
+ }))
+ )
+ };
+}
+
+function reportHtml(job: ReturnType): string {
+ const rows = job.programs.map((program) =>
+ `| ${escapeHtml(program.program_id)} | ${escapeHtml(program.coverage_level)} | ${escapeHtml(program.status)} | ${program.diagnostics.length} |
`
+ ).join("\n");
+ return `
+
+
+
+ ${escapeHtml(job.job_id)}
+
+
+
+ ${escapeHtml(job.job_id)}
+ Suite ${escapeHtml(job.suite_id)} / Robot ${escapeHtml(job.robot_id)}
+ Covered sections: ${job.coverage.coveredSections.join(", ")}
+
+ | Program | Layer | Status | Diagnostics |
+ ${rows}
+
+
+
+`;
+}
+
+function escapeHtml(value: unknown): string {
+ return String(value)
+ .replaceAll("&", "&")
+ .replaceAll("<", "<")
+ .replaceAll(">", ">")
+ .replaceAll("\"", """);
+}
diff --git a/kdl-wasm/web/scripts/verify-demo-package.mjs b/kdl-wasm/web/scripts/verify-demo-package.mjs
new file mode 100644
index 0000000..96cf22d
--- /dev/null
+++ b/kdl-wasm/web/scripts/verify-demo-package.mjs
@@ -0,0 +1,209 @@
+import { execFileSync } from "node:child_process";
+import {
+ existsSync,
+ mkdirSync,
+ readdirSync,
+ readFileSync,
+ rmSync,
+ statSync,
+ writeFileSync
+} from "node:fs";
+import { dirname, extname, join, resolve, sep } from "node:path";
+import { fileURLToPath } from "node:url";
+
+const root = resolve(fileURLToPath(new URL("../../..", import.meta.url)));
+const webRoot = join(root, "kdl-wasm", "web");
+const deployRoot = join(webRoot, "test-results", "deploy");
+const zipPath = resolve(process.argv[2] ?? latestZipPath());
+const extractRoot = join(deployRoot, "_verify", zipBasename(zipPath));
+
+assertSafeVerifyPath(extractRoot);
+rmSync(extractRoot, { recursive: true, force: true });
+mkdirSync(extractRoot, { recursive: true });
+expandZip(zipPath, extractRoot);
+
+const manifest = readJson(join(extractRoot, "demo-manifest.json"));
+const report = readJson(join(extractRoot, manifest.report_json));
+const programManifest = readJson(join(extractRoot, manifest.program_manifest));
+const grlFiles = walkFiles(join(extractRoot, "spec-programs")).filter((file) => extname(file).toLowerCase() === ".grl");
+
+const requiredFiles = [
+ "index.html",
+ "demo-manifest.json",
+ "README.md",
+ "app/virtual-controller.html",
+ "app/virtual-controller.css",
+ "app/virtual-controller.js",
+ "spec-programs/manifest.json",
+ manifest.job_json,
+ manifest.report_json,
+ manifest.report_html,
+ manifest.screenshots.desktop,
+ manifest.screenshots.mobile,
+ manifest.screenshots.evidence,
+ "docs/GRL功能语法逻辑与程序创建使用手册.docx",
+ "docs/通用机器人离线编程系统测试文档.docx",
+ "docs/working2/README.md",
+ "docs/working2/05-验收证据.md"
+];
+
+const checks = [];
+for (const file of requiredFiles) {
+ checks.push(checkFile(file));
+}
+
+checks.push(check("program_count", manifest.program_count === 19, `program_count=${manifest.program_count}`));
+checks.push(check("manifest_programs", programManifest.programs.length === 19, `manifest programs=${programManifest.programs.length}`));
+checks.push(check("grl_files", grlFiles.length === 19, `grl files=${grlFiles.length}`));
+checks.push(check("summary_fail", report.summary.fail === 0, `summary.fail=${report.summary.fail}`));
+checks.push(check("report_programs", report.summary.programs === 19, `report programs=${report.summary.programs}`));
+checks.push(check("runtime_programs", manifest.runtime_programs === 12, `runtime=${manifest.runtime_programs}`));
+checks.push(check("static_programs", manifest.static_programs === 4, `static=${manifest.static_programs}`));
+checks.push(check("post_programs", manifest.post_programs === 3, `post=${manifest.post_programs}`));
+checks.push(check("missing_sections", Array.isArray(report.coverage.missingSections) && report.coverage.missingSections.length === 0, `missing=${report.coverage.missingSections?.join(",") ?? "n/a"}`));
+checks.push(check("relative_urls", allManifestUrlsAreRelative(manifest), "manifest URLs are relative"));
+
+for (const program of manifest.programs) {
+ checks.push(checkFile(program.source));
+ checks.push(checkFile(program.artifacts.compile));
+}
+
+for (const doc of manifest.docs ?? []) {
+ checks.push(checkFile(doc.href));
+}
+
+const runtimeFramePrograms = manifest.programs.filter((program) => program.coverage_level === "Runtime");
+let frameProgramCount = 0;
+for (const program of runtimeFramePrograms) {
+ const trajectory = readJson(join(extractRoot, program.artifacts.trajectory));
+ const frames = Array.isArray(trajectory.frames) ? trajectory.frames : [];
+ const hasFrameState = frames.some((frame) =>
+ Array.isArray(frame.joints) &&
+ frame.joints.length === 6 &&
+ Array.isArray(frame.tcp?.position) &&
+ frame.tcp.position.length === 3 &&
+ Array.isArray(frame.tcp?.quaternion) &&
+ frame.tcp.quaternion.length === 4
+ );
+ if (hasFrameState) frameProgramCount += 1;
+}
+checks.push(check(
+ "runtime_trajectory_frames",
+ frameProgramCount > 0,
+ `${frameProgramCount}/${runtimeFramePrograms.length} runtime programs include frame joints and TCP`
+));
+
+const failed = checks.filter((item) => !item.ok);
+const summary = {
+ zip: zipPath,
+ extract_root: extractRoot,
+ release_id: manifest.release_id,
+ job_id: manifest.job_id,
+ program_count: manifest.program_count,
+ grl_files: grlFiles.length,
+ summary_fail: report.summary.fail,
+ checks,
+ ok: failed.length === 0
+};
+
+writeFileSync(join(deployRoot, `${zipBasename(zipPath)}.verify.json`), `${JSON.stringify(summary, null, 2)}\n`, "utf8");
+console.log(JSON.stringify(summary, null, 2));
+
+if (failed.length > 0) {
+ throw new Error(`Demo package verification failed: ${failed.map((item) => item.name).join(", ")}`);
+}
+
+function checkFile(relativePath) {
+ const file = join(extractRoot, relativePath);
+ const exists = existsSync(file);
+ return check(`file:${relativePath}`, exists && statSync(file).isFile(), exists ? `${statSync(file).size} bytes` : "missing");
+}
+
+function check(name, ok, details) {
+ return { name, ok: Boolean(ok), details };
+}
+
+function allManifestUrlsAreRelative(value) {
+ const urls = [];
+ collectUrls(value, urls);
+ return urls.every((url) => !/^[a-z]+:\/\//i.test(url) && !/^[a-z]:[\\/]/i.test(url) && !url.startsWith("/") && !url.includes("\\"));
+}
+
+function collectUrls(value, urls) {
+ if (Array.isArray(value)) {
+ value.forEach((item) => collectUrls(item, urls));
+ return;
+ }
+ if (!value || typeof value !== "object") return;
+ for (const [key, item] of Object.entries(value)) {
+ if (typeof item === "string" && (key === "href" || key.includes("json") || key.includes("html") || key.includes("entry") || key.includes("manifest") || key.includes("source") || key.includes("screenshot") || key.includes("report") || key.includes("compile") || key.includes("controller") || key.includes("trace") || key.includes("trajectory") || key.includes("roundtrip") || key.includes("io") || key.includes("queue"))) {
+ urls.push(item);
+ } else {
+ collectUrls(item, urls);
+ }
+ }
+}
+
+function expandZip(source, destination) {
+ const script = [
+ "Add-Type -AssemblyName System.IO.Compression.FileSystem",
+ `$src = ${psSingleQuoted(source)}`,
+ `$dst = ${psSingleQuoted(destination)}`,
+ "if (Test-Path -LiteralPath $dst) { Remove-Item -LiteralPath $dst -Recurse -Force }",
+ "New-Item -ItemType Directory -Force -Path $dst | Out-Null",
+ "[System.IO.Compression.ZipFile]::ExtractToDirectory($src, $dst)"
+ ].join("\n");
+ execFileSync("powershell", ["-NoProfile", "-ExecutionPolicy", "Bypass", "-Command", script], {
+ stdio: "inherit"
+ });
+}
+
+function latestZipPath() {
+ if (!existsSync(deployRoot)) {
+ throw new Error(`No deploy output directory found: ${deployRoot}`);
+ }
+ const zips = readdirSync(deployRoot, { withFileTypes: true })
+ .filter((entry) => entry.isFile() && entry.name.startsWith("kdl-olp-demo-") && entry.name.endsWith(".zip"))
+ .map((entry) => ({
+ path: join(deployRoot, entry.name),
+ mtimeMs: statSync(join(deployRoot, entry.name)).mtimeMs
+ }))
+ .sort((left, right) => right.mtimeMs - left.mtimeMs);
+ if (zips.length === 0) {
+ throw new Error(`No kdl-olp-demo-*.zip files found in ${deployRoot}`);
+ }
+ return zips[0].path;
+}
+
+function walkFiles(dir) {
+ const files = [];
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
+ const fullPath = join(dir, entry.name);
+ if (entry.isDirectory()) {
+ files.push(...walkFiles(fullPath));
+ } else if (entry.isFile()) {
+ files.push(fullPath);
+ }
+ }
+ return files;
+}
+
+function readJson(file) {
+ return JSON.parse(readFileSync(file, "utf8"));
+}
+
+function zipBasename(file) {
+ return file.split(/[\\/]/).at(-1).replace(/\.zip$/i, "");
+}
+
+function psSingleQuoted(value) {
+ return `'${String(value).replaceAll("'", "''")}'`;
+}
+
+function assertSafeVerifyPath(path) {
+ const allowedRoot = resolve(join(deployRoot, "_verify")) + sep;
+ const resolved = resolve(path);
+ if (!resolved.startsWith(allowedRoot)) {
+ throw new Error(`Refusing to modify path outside verify root: ${resolved}`);
+ }
+}
diff --git a/kdl-wasm/web/scripts/verify-virtual-controller-buttons.mjs b/kdl-wasm/web/scripts/verify-virtual-controller-buttons.mjs
new file mode 100644
index 0000000..de6574a
--- /dev/null
+++ b/kdl-wasm/web/scripts/verify-virtual-controller-buttons.mjs
@@ -0,0 +1,508 @@
+import { existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
+import { tmpdir } from "node:os";
+import { basename, join, resolve } from "node:path";
+import { fileURLToPath, pathToFileURL } from "node:url";
+import { spawn } from "node:child_process";
+
+const root = resolve(fileURLToPath(new URL("../../..", import.meta.url)));
+const appHtml = resolve(root, "kdl-wasm/web/app/virtual-controller.html");
+const outputDir = resolve(root, "kdl-wasm/web/test-results/virtual-controller");
+const chromeBin = process.env.CHROME_BIN ?? defaultChromeBin();
+const targetUrl = process.argv[2] ?? pathToFileURL(appHtml).href;
+const isRemote = /^https?:\/\//i.test(targetUrl);
+
+mkdirSync(outputDir, { recursive: true });
+
+const evidence = await verifyButtonFlow(targetUrl);
+const evidencePath = join(outputDir, isRemote ? "button-evidence-public.json" : "button-evidence.json");
+writeFileSync(evidencePath, `${JSON.stringify(evidence, null, 2)}\n`);
+console.log(JSON.stringify(evidence, null, 2));
+
+async function verifyButtonFlow(url) {
+ const browser = await launchChrome("buttons");
+ try {
+ const client = await connect(browser.websocketUrl);
+ await client.send("Page.enable");
+ await client.send("Runtime.enable");
+ await client.send("Network.enable");
+ await client.send("Emulation.setDeviceMetricsOverride", {
+ width: 1440,
+ height: 960,
+ deviceScaleFactor: 1,
+ mobile: false
+ });
+ await client.send("Page.navigate", { url });
+ await waitForLoad(client);
+
+ const initial = await waitForProbe(
+ client,
+ (probe) => probe.title === "ABB120 Virtual Controller"
+ && probe.frameTotal > 0
+ && probe.samplePeriodSec === 0.05
+ && probe.stepRows > 0
+ && probe.activeStepRows === 1
+ && (!isRemote || probe.programOptions.length >= 10),
+ "initial controller render",
+ 12_000
+ );
+ if (isRemote && initial.programOptions.length < 10) {
+ throw new Error(`remote manifest did not populate enough programs: ${initial.programOptions.length}`);
+ }
+
+ await clickCommand(client, "load");
+ const afterLoadClick = await sleepAndProbe(client, 120);
+ if (!["load", "loading", "parsing", "ready"].includes(afterLoadClick.state)) {
+ throw new Error(`Load did not show an active state, got ${afterLoadClick.state}`);
+ }
+ if (!afterLoadClick.log.includes(afterLoadClick.program)) {
+ throw new Error(`Load did not write the active program to the log: ${afterLoadClick.log}`);
+ }
+ const afterParse = await waitForProbe(
+ client,
+ (probe) => probe.state === "ready"
+ && probe.parser.includes("parsed")
+ && probe.parserProgress === 1
+ && probe.stepRows > 1
+ && probe.frameRows === probe.sourceFrameTotal,
+ "Load parse stream",
+ 4000
+ );
+ if (afterLoadClick.state === "parsing") {
+ if (!afterLoadClick.parser.includes("parsing")) {
+ throw new Error(`Load did not expose parser progress: ${afterLoadClick.parser}`);
+ }
+ if (afterLoadClick.frameRows >= afterParse.frameRows && afterParse.frameRows > 1) {
+ throw new Error(`Trajectory did not grow during parsing: ${afterLoadClick.frameRows} -> ${afterParse.frameRows}`);
+ }
+ }
+
+ await clickCommand(client, "run");
+ const afterRun = await waitForProbe(
+ client,
+ (probe) => probe.state === "running" && probe.running,
+ "Run command",
+ 1200
+ );
+ if (!afterRun.wait.includes("waiting") && !afterRun.wait.includes("satisfied")) {
+ throw new Error(`Run did not update wait state: ${afterRun.wait}`);
+ }
+ assertProgramSteps(afterRun, "Run command");
+
+ await sleep(700);
+ await clickCommand(client, "pause");
+ const afterPause = await waitForProbe(client, (probe) => probe.state === "paused", "Pause command", 1000);
+ assertProgramSteps(afterPause, "Pause command");
+
+ await clickCommand(client, "step");
+ const afterStep = await waitForProbe(client, (probe) => probe.state === "paused", "Step command", 1000);
+ const expectedStepFrame = afterPause.frameCurrent < afterPause.frameTotal
+ ? afterPause.frameCurrent + 1
+ : afterPause.frameCurrent;
+ if (afterStep.frameCurrent !== expectedStepFrame) {
+ throw new Error(`Step sample mismatch: expected ${expectedStepFrame}, got ${afterStep.frameCurrent}`);
+ }
+ assertProgramSteps(afterStep, "Step command");
+
+ await clickCommand(client, "stop");
+ const afterStop = await waitForProbe(client, (probe) => probe.state === "stopped", "Stop command", 1000);
+
+ await clickCommand(client, "reset");
+ const afterReset = await waitForProbe(
+ client,
+ (probe) => probe.state === "ready" && probe.frameCurrent === 1,
+ "Reset command",
+ 1000
+ );
+
+ await clickCommand(client, "export");
+ const afterExport = await sleepAndProbe(client, 150);
+ if (!afterExport.log.includes("exported") && !afterExport.reports.includes("exported")) {
+ throw new Error(`Export did not update log/report fields: ${afterExport.log} / ${afterExport.reports}`);
+ }
+
+ const fullSpecId = afterExport.programOptions.find((id) => id.startsWith("W2_99_"));
+ let afterProgramSwitch = afterExport;
+ if (fullSpecId) {
+ await selectProgram(client, fullSpecId);
+ afterProgramSwitch = await waitForProbe(
+ client,
+ (probe) => probe.program === fullSpecId
+ && probe.state === "ready"
+ && probe.sourceFrameTotal >= 20
+ && probe.frameTotal >= 39
+ && probe.stepRows >= 8
+ && probe.activeStepRows === 1,
+ `${fullSpecId} program switch`,
+ isRemote ? 12_000 : 4_000
+ );
+ assertTcpAndJoints(afterProgramSwitch, fullSpecId);
+ }
+
+ const afterCacheWarm = await waitForProbe(
+ client,
+ (probe) => !isRemote || probe.storageState.writes >= 3,
+ "OPFS cache warmup",
+ isRemote ? 12_000 : 1500
+ );
+ const offlineCache = await verifyOfflineCache(client, afterCacheWarm);
+
+ await client.close();
+ return {
+ targetUrl: url,
+ chrome: chromeBin,
+ initial,
+ afterLoadClick,
+ afterRun,
+ afterPause,
+ afterStep,
+ afterStop,
+ afterReset,
+ afterExport,
+ afterProgramSwitch,
+ offlineCache
+ };
+ } finally {
+ browser.close();
+ }
+}
+
+async function verifyOfflineCache(client, beforeOffline) {
+ if (!isRemote) {
+ return { skipped: true, reason: "local file target does not require network-offline cache proof" };
+ }
+
+ const cacheProgram = beforeOffline.program
+ ?? beforeOffline.programOptions.find((id) => id === "W2_60_IOWaitPulse")
+ ?? beforeOffline.programOptions[0];
+ if (!cacheProgram) throw new Error("No program available for offline cache check");
+
+ await evaluate(client, `() => {
+ const app = window.__virtualController;
+ app.programCache.clear();
+ app.programLoads.clear();
+ app.assetTextCache.clear();
+ return true;
+ }`);
+ await client.send("Network.emulateNetworkConditions", {
+ offline: true,
+ latency: 0,
+ downloadThroughput: 0,
+ uploadThroughput: 0
+ });
+ await selectProgram(client, cacheProgram);
+ const offline = await waitForProbe(
+ client,
+ (probe) => probe.program === cacheProgram
+ && probe.state === "ready"
+ && probe.sourceFrameTotal >= 4
+ && probe.storageState.hits > beforeOffline.storageState.hits,
+ "offline OPFS program load",
+ 5000
+ );
+ if (offline.storageState.mode !== "OPFS") {
+ throw new Error(`Expected OPFS mode during offline load, got ${offline.storageState.mode}`);
+ }
+ assertTcpAndJoints(offline, cacheProgram);
+ return {
+ program: cacheProgram,
+ mode: offline.storageState.mode,
+ hitsBefore: beforeOffline.storageState.hits,
+ hitsAfter: offline.storageState.hits,
+ frame: offline.frame,
+ storage: offline.storage
+ };
+}
+
+async function clickCommand(client, command) {
+ return evaluate(client, `() => {
+ const button = document.querySelector("[data-command='${command}']");
+ if (!button) throw new Error("Missing command ${command}");
+ button.click();
+ return true;
+ }`);
+}
+
+async function selectProgram(client, programId) {
+ return evaluate(client, `() => {
+ const select = document.querySelector("[data-program-select]");
+ if (!select) throw new Error("Missing program select");
+ select.value = ${JSON.stringify(programId)};
+ select.dispatchEvent(new Event("change", { bubbles: true }));
+ return select.value;
+ }`);
+}
+
+function assertTcpAndJoints(probe, label) {
+ if (!/\[[^\]]+\]/.test(probe.joints) || probe.joints.split(",").length < 6) {
+ throw new Error(`${label}: joints field is not a 6-axis vector: ${probe.joints}`);
+ }
+ if (!probe.tcp.includes("pos [") || !probe.tcp.includes(" q [")) {
+ throw new Error(`${label}: TCP field is incomplete: ${probe.tcp}`);
+ }
+ if (probe.frameRows !== probe.sourceFrameTotal) {
+ throw new Error(`${label}: frame table rows ${probe.frameRows} != source frame total ${probe.sourceFrameTotal}`);
+ }
+ if (probe.samplePeriodSec !== 0.05) {
+ throw new Error(`${label}: expected 50ms sample period, got ${probe.samplePeriodSec}`);
+ }
+ assertProgramSteps(probe, label);
+}
+
+function assertProgramSteps(probe, label) {
+ if (probe.stepRows < 1) {
+ throw new Error(`${label}: program step table did not render rows`);
+ }
+ if (probe.activeStepRows !== 1) {
+ throw new Error(`${label}: expected one active program step, got ${probe.activeStepRows}`);
+ }
+ if (!probe.stepStatus.includes("/") || !probe.stepStatus.includes("line")) {
+ throw new Error(`${label}: step status is incomplete: ${probe.stepStatus}`);
+ }
+ if (!probe.activeStepText.includes("@50ms") && !probe.activeStepText.includes("line")) {
+ throw new Error(`${label}: active step does not expose execution detail: ${probe.activeStepText}`);
+ }
+}
+
+async function sleepAndProbe(client, ms) {
+ await sleep(ms);
+ return evaluate(client, pageProbeSource());
+}
+
+async function waitForProbe(client, predicate, label, timeoutMs) {
+ const started = Date.now();
+ let lastProbe;
+ while (Date.now() - started < timeoutMs) {
+ lastProbe = await evaluate(client, pageProbeSource());
+ if (predicate(lastProbe)) return lastProbe;
+ await sleep(100);
+ }
+ throw new Error(`${label} timed out. Last probe: ${JSON.stringify(lastProbe)}`);
+}
+
+function pageProbeSource() {
+ return `() => {
+ const field = (name) => document.querySelector("[data-field='" + name + "']")?.textContent?.trim() ?? "";
+ const frame = field("frame");
+ const frameMatch = frame.match(/(\\d+)\\s*\\/\\s*(\\d+)/);
+ const app = window.__virtualController;
+ return {
+ title: document.title,
+ state: field("state"),
+ program: field("program"),
+ wait: field("wait"),
+ log: field("log"),
+ reports: field("reports"),
+ storage: field("storage"),
+ joints: field("joints"),
+ tcp: field("tcp"),
+ frame,
+ frameCurrent: frameMatch ? Number(frameMatch[1]) : 0,
+ frameTotal: frameMatch ? Number(frameMatch[2]) : 0,
+ frameRows: document.querySelectorAll("[data-frame-table] tr").length,
+ frameTime: field("frame-time"),
+ parser: field("parser"),
+ parserProgress: Number(document.querySelector("[data-parser-progress]")?.value ?? 0),
+ stepStatus: field("step-status"),
+ stepRows: document.querySelectorAll("[data-step-table] tr").length,
+ activeStepRows: document.querySelectorAll("[data-step-table] tr[data-step-state='active']").length,
+ activeStepText: document.querySelector("[data-step-table] tr[data-step-state='active']")?.textContent?.trim() ?? "",
+ programOptions: Array.from(document.querySelectorAll("[data-program-select] option")).map((item) => item.value),
+ running: document.querySelector(".workbench")?.dataset.running === "true",
+ playbackTime: Number(app?.playbackTime ?? 0),
+ samplePeriodSec: Number(app?.samplePeriodSec ?? 0),
+ sampleIndex: Number(app?.currentSampleIndex ?? 0),
+ sourceFrameIndex: Number(app?.currentFrameIndex ?? 0),
+ sourceFrameTotal: Array.isArray(app?.programCache?.get?.(app?.selectedProgramId)?.trajectory?.frames)
+ ? app.programCache.get(app.selectedProgramId).trajectory.frames.length
+ : document.querySelectorAll("[data-frame-table] tr").length,
+ storageState: app?.storage ? { ...app.storage } : {},
+ parseStream: app?.parseStream ? { ...app.parseStream, timer: Boolean(app.parseStream.timer) } : {},
+ errors: Array.isArray(window.__vcErrors) ? [...window.__vcErrors] : []
+ };
+ }`;
+}
+
+function launchChrome(name) {
+ const userDataDir = mkdtempSync(join(tmpdir(), `kdl-vc-${name}-`));
+ const child = spawn(chromeBin, [
+ "--headless=new",
+ "--disable-gpu",
+ "--no-sandbox",
+ "--disable-dev-shm-usage",
+ "--ignore-certificate-errors",
+ "--remote-debugging-port=0",
+ `--user-data-dir=${userDataDir}`,
+ "about:blank"
+ ], { stdio: ["ignore", "pipe", "pipe"] });
+
+ let log = "";
+ let settled = false;
+
+ const cleanup = () => {
+ child.kill("SIGTERM");
+ setTimeout(() => {
+ rmSync(userDataDir, {
+ recursive: true,
+ force: true,
+ maxRetries: 5,
+ retryDelay: 100
+ });
+ }, 250).unref();
+ };
+
+ return new Promise((resolveLaunch, reject) => {
+ const timeout = setTimeout(() => {
+ if (!settled) {
+ settled = true;
+ cleanup();
+ reject(new Error(`Chrome did not expose DevTools endpoint. ${log}`));
+ }
+ }, 15_000);
+
+ const onData = (chunk) => {
+ log += chunk.toString();
+ const match = log.match(/DevTools listening on (ws:\/\/[^\s]+)/);
+ if (!match || settled) return;
+ settled = true;
+ clearTimeout(timeout);
+ findPageWebsocket(match[1]).then((pageWebsocketUrl) => {
+ resolveLaunch({
+ websocketUrl: pageWebsocketUrl,
+ close: cleanup
+ });
+ }, (error) => {
+ cleanup();
+ reject(error);
+ });
+ };
+
+ child.stdout.on("data", onData);
+ child.stderr.on("data", onData);
+ child.on("error", (error) => {
+ if (!settled) {
+ settled = true;
+ clearTimeout(timeout);
+ cleanup();
+ reject(error);
+ }
+ });
+ child.on("exit", (code) => {
+ if (!settled) {
+ settled = true;
+ clearTimeout(timeout);
+ cleanup();
+ reject(new Error(`${basename(chromeBin)} exited early with ${code}. ${log}`));
+ }
+ });
+ });
+}
+
+async function findPageWebsocket(browserWebsocketUrl) {
+ const endpoint = new URL(browserWebsocketUrl);
+ const baseUrl = `http://${endpoint.host}`;
+ const started = Date.now();
+ let lastError;
+
+ while (Date.now() - started < 5000) {
+ try {
+ const response = await fetch(`${baseUrl}/json/list`);
+ const targets = await response.json();
+ const page = targets.find((target) => target.type === "page" && target.webSocketDebuggerUrl);
+ if (page?.webSocketDebuggerUrl) return page.webSocketDebuggerUrl;
+ } catch (error) {
+ lastError = error;
+ }
+ await sleep(100);
+ }
+
+ throw new Error(`Could not find Chrome page target. ${lastError instanceof Error ? lastError.message : ""}`);
+}
+
+function connect(websocketUrl) {
+ const socket = new WebSocket(websocketUrl);
+ let nextId = 1;
+ const pending = new Map();
+
+ socket.addEventListener("message", (event) => {
+ const message = JSON.parse(event.data.toString());
+ if (!message.id) return;
+ const request = pending.get(message.id);
+ if (!request) return;
+ pending.delete(message.id);
+ if (message.error) {
+ request.reject(new Error(`${message.error.code}: ${message.error.message}`));
+ } else {
+ request.resolve(message.result ?? {});
+ }
+ });
+
+ return new Promise((resolveClient, reject) => {
+ socket.addEventListener("open", () => {
+ resolveClient({
+ send(method, params = {}) {
+ const id = nextId++;
+ socket.send(JSON.stringify({ id, method, params }));
+ return new Promise((resolveSend, rejectSend) => {
+ pending.set(id, { resolve: resolveSend, reject: rejectSend });
+ });
+ },
+ close() {
+ socket.close();
+ }
+ });
+ }, { once: true });
+ socket.addEventListener("error", reject, { once: true });
+ });
+}
+
+function waitForLoad(client) {
+ return new Promise((resolveLoad, reject) => {
+ const started = Date.now();
+ const poll = async () => {
+ try {
+ const ready = await evaluate(client, "() => document.readyState");
+ if (ready === "complete") {
+ resolveLoad();
+ return;
+ }
+ if (Date.now() - started > 10_000) {
+ reject(new Error("Timed out waiting for document.readyState complete"));
+ return;
+ }
+ setTimeout(poll, 100);
+ } catch (error) {
+ reject(error);
+ }
+ };
+ poll();
+ });
+}
+
+async function evaluate(client, expression) {
+ const result = await client.send("Runtime.evaluate", {
+ expression: `(${expression})()`,
+ awaitPromise: true,
+ returnByValue: true
+ });
+ if (result.exceptionDetails) {
+ throw new Error(result.exceptionDetails.text ?? "Runtime.evaluate failed");
+ }
+ return result.result.value;
+}
+
+function sleep(ms) {
+ return new Promise((resolveSleep) => setTimeout(resolveSleep, ms));
+}
+
+function defaultChromeBin() {
+ if (process.platform !== "win32") return "/usr/bin/google-chrome";
+ const candidates = [
+ "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe",
+ "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",
+ process.env.LOCALAPPDATA
+ ? join(process.env.LOCALAPPDATA, "Google", "Chrome", "Application", "chrome.exe")
+ : "",
+ "C:\\Program Files\\Microsoft\\Edge\\Application\\msedge.exe"
+ ];
+ return candidates.find((candidate) => candidate && existsSync(candidate)) ?? "chrome.exe";
+}
diff --git a/kdl-wasm/web/scripts/verify-virtual-controller.mjs b/kdl-wasm/web/scripts/verify-virtual-controller.mjs
index 006cb96..733f747 100644
--- a/kdl-wasm/web/scripts/verify-virtual-controller.mjs
+++ b/kdl-wasm/web/scripts/verify-virtual-controller.mjs
@@ -52,13 +52,18 @@ async function verifyViewport(viewport) {
await client.send("Page.navigate", { url: pathToFileURL(appHtml).href });
await waitForLoad(client);
- const initial = await evaluate(client, pageProbeSource());
+ const initial = await waitForProbe(
+ client,
+ (probe) => probe.parserProgress === 1 && !probe.parser.includes("parsing"),
+ "initial parse",
+ 4000
+ );
assertProbe(initial, viewport.name, "initial");
await evaluate(client, clickCommandSource("load"));
await evaluate(client, clickCommandSource("run"));
await evaluate(client, clickIoSource());
- const afterRun = await evaluate(client, pageProbeSource());
+ const afterRun = await waitForProbe(client, (probe) => probe.state === "running", "run", 1200);
assertProbe(afterRun, viewport.name, "after run");
if (afterRun.state !== "running") {
throw new Error(`${viewport.name}: expected state running, got ${afterRun.state}`);
@@ -91,6 +96,7 @@ async function verifyViewport(viewport) {
screenshot: viewport.screenshotPath,
screenshotBytes: pngBytes,
state: afterRun.state,
+ parser: afterRun.parser,
wait: afterRun.wait,
trace: afterRun.trace,
visiblePanels: afterRun.visiblePanels
@@ -257,6 +263,17 @@ function waitForLoad(client) {
});
}
+async function waitForProbe(client, predicate, label, timeoutMs) {
+ const started = Date.now();
+ let lastProbe;
+ while (Date.now() - started < timeoutMs) {
+ lastProbe = await evaluate(client, pageProbeSource());
+ if (predicate(lastProbe)) return lastProbe;
+ await new Promise((resolveRetry) => setTimeout(resolveRetry, 100));
+ }
+ throw new Error(`${label} timed out. Last probe: ${JSON.stringify(lastProbe)}`);
+}
+
async function evaluate(client, expression) {
const result = await client.send("Runtime.evaluate", {
expression: `(${expression})()`,
@@ -288,7 +305,12 @@ function pageProbeSource() {
wait: field("wait"),
queue: field("queue"),
trace: field("trace"),
+ parser: field("parser"),
+ parserProgress: Number(document.querySelector("[data-parser-progress]")?.value ?? 0),
editor: field("editor"),
+ stepRows: document.querySelectorAll("[data-step-table] tr").length,
+ activeStepRows: document.querySelectorAll("[data-step-table] tr[data-step-state='active']").length,
+ stepStatus: field("step-status"),
running: document.querySelector(".workbench")?.dataset.running === "true",
visiblePanels,
viewport: box(".viewport"),
@@ -325,6 +347,9 @@ function assertProbe(probe, viewportName, phase) {
if (!probe.editor.includes("proc main") && !probe.editor.includes("MoveJ") && !probe.editor.includes("PTP")) {
throw new Error(`${viewportName}/${phase}: editor source did not render`);
}
+ if (probe.stepRows < 1 || probe.activeStepRows !== 1 || !probe.stepStatus.includes("line")) {
+ throw new Error(`${viewportName}/${phase}: program steps did not render correctly`);
+ }
if (!probe.viewport || probe.viewport.width < 100 || probe.viewport.height < 100) {
throw new Error(`${viewportName}/${phase}: viewport is too small`);
}
diff --git a/kdl-wasm/web/src/grl/semantic/compileControlFlow.ts b/kdl-wasm/web/src/grl/semantic/compileControlFlow.ts
index b0befad..4a5455a 100644
--- a/kdl-wasm/web/src/grl/semantic/compileControlFlow.ts
+++ b/kdl-wasm/web/src/grl/semantic/compileControlFlow.ts
@@ -87,6 +87,10 @@ class ControlFlowParser {
instructions.push(this.finishJump(this.previous(), context));
continue;
}
+ if (this.matchKeyword("try")) {
+ instructions.push(this.finishRawBlock(this.previous(), "try"));
+ continue;
+ }
if (this.checkKeyword("end")) {
throw controlError("GRL_CONTROL_UNEXPECTED_END", "Unexpected end in procedure body", this.peek());
}
@@ -311,6 +315,29 @@ class ControlFlowParser {
};
}
+ private finishRawBlock(start: GrlToken, blockKeyword: string): RawProcedureStatement {
+ const tokens: GrlToken[] = [start];
+ let nestedBlocks = 0;
+ while (!this.isAtEnd()) {
+ const token = this.advance();
+ tokens.push(token);
+ if (token.kind === "keyword" && token.raw === "end") {
+ if (nestedBlocks === 0) {
+ break;
+ }
+ nestedBlocks -= 1;
+ } else if (token.kind === "keyword" && ["if", "while", "for", "switch", "try"].includes(token.raw)) {
+ nestedBlocks += 1;
+ }
+ }
+ return {
+ kind: "RAW_STATEMENT",
+ text: `${blockKeyword} block`,
+ tokens,
+ sourceMap: tokenSourceMap(start)
+ };
+ }
+
private parseBooleanLineExpression(start: GrlToken): ControlExpression {
const expression = this.parseLineExpressionUntil(start, []);
if (!isBooleanCondition(expression.tokens as GrlToken[])) {
diff --git a/kdl-wasm/web/src/grl/semantic/compileIo.ts b/kdl-wasm/web/src/grl/semantic/compileIo.ts
index b221cb6..194824d 100644
--- a/kdl-wasm/web/src/grl/semantic/compileIo.ts
+++ b/kdl-wasm/web/src/grl/semantic/compileIo.ts
@@ -339,6 +339,9 @@ class IoStatementParser {
}
private matchKeyword(keyword: string): boolean {
+ if (this.isAtEnd()) {
+ return false;
+ }
const token = this.peek();
if ((token.kind === "keyword" || token.kind === "identifier") && token.raw === keyword) {
this.advance();
@@ -348,6 +351,9 @@ class IoStatementParser {
}
private checkKeyword(keyword: string): boolean {
+ if (this.isAtEnd()) {
+ return false;
+ }
const token = this.peek();
return (token.kind === "keyword" || token.kind === "identifier") && token.raw === keyword;
}
diff --git a/kdl-wasm/web/src/grl/semantic/index.ts b/kdl-wasm/web/src/grl/semantic/index.ts
index d5c619c..cf8cbf4 100644
--- a/kdl-wasm/web/src/grl/semantic/index.ts
+++ b/kdl-wasm/web/src/grl/semantic/index.ts
@@ -1,5 +1,6 @@
export {
compileGrlDataDeclaration,
+ compileGrlConstantValue,
compileGrlTargetDeclaration,
compileOffsetExpression,
compileSpeedExpression,
diff --git a/kdl-wasm/web/src/suites/abb120SpecSuite.ts b/kdl-wasm/web/src/suites/abb120SpecSuite.ts
new file mode 100644
index 0000000..ea76602
--- /dev/null
+++ b/kdl-wasm/web/src/suites/abb120SpecSuite.ts
@@ -0,0 +1,1106 @@
+import { createHash } from "node:crypto";
+import { parseGrl } from "../grl/parser/index.js";
+import {
+ buildMotionContext,
+ compileGrlDataDeclaration,
+ compileGrlConstantValue,
+ compileGrlTargetDeclaration,
+ compileMotionToKdlRequest,
+ compilePathToPlanRequest,
+ compileSemanticProgram,
+ analyzeProcFunctionSemantics,
+ parseControlFlowStatements,
+ parseProcedureMotionInstructions
+} from "../grl/semantic/index.js";
+import { postProcessAllBrands } from "../grl/post/index.js";
+import { importBrandProgram } from "../importers/index.js";
+import { VirtualController, type RuntimeStepResult, type VirtualControllerSnapshot } from "../controller/index.js";
+import { parseIoReferenceText } from "../runtime/index.js";
+import type { IoScriptStep } from "../runtime/ioRuntime.js";
+import type {
+ GrlDataDeclaration,
+ GrlPathDeclaration,
+ GrlProcedureDeclaration,
+ GrlTargetDeclaration,
+ GrlTopLevelDeclaration
+} from "../grl/ast/index.js";
+import type {
+ MotionDiagnostic,
+ PathPlanRequest,
+ PathPlanResult,
+ TrajectoryPoint,
+ TrajectoryResult
+} from "../kdl/types.js";
+import {
+ ABB120_ROBOT_FIXTURE,
+ ABB_IRB120_ZERO_JOINTS
+} from "../fixtures/abb120.js";
+
+export type Abb120SpecCoverageLevel = "Runtime" | "Static" | "Post";
+export type Abb120SpecExpectedStatus = "pass" | "diagnostic";
+
+export interface Abb120SpecManifestProgram {
+ program_id: string;
+ file: string;
+ coverage_level: Abb120SpecCoverageLevel;
+ spec_sections: number[];
+ expected_status: Abb120SpecExpectedStatus;
+ expected_diagnostics: string[];
+}
+
+export interface Abb120SpecCoverageItem {
+ spec_section: number;
+ coverage_level: string;
+ program_ids: string[];
+}
+
+export interface Abb120SpecManifest {
+ suite_id: string;
+ robot_id: string;
+ spec_source: string;
+ program_root: string;
+ runtime_commands: string[];
+ programs: Abb120SpecManifestProgram[];
+ coverage_matrix: Abb120SpecCoverageItem[];
+}
+
+export interface Abb120SpecProgramSource {
+ program_id: string;
+ file: string;
+ text: string;
+}
+
+export interface Abb120SpecCommandTrace {
+ command: "loadProgram" | "start" | "stepInto" | "hold" | "resume" | "stepMotion" | "stop" | "resetFault";
+ before?: string;
+ after?: string;
+ result?: RuntimeStepResult["status"] | "ok";
+ diagnostics: MotionDiagnostic[];
+}
+
+export interface Abb120SpecProgramResult {
+ program_id: string;
+ file: string;
+ coverage_level: Abb120SpecCoverageLevel;
+ expected_status: Abb120SpecExpectedStatus;
+ status: "pass" | "diagnostic" | "fail";
+ input_hash: string;
+ spec_sections: number[];
+ diagnostics: MotionDiagnostic[];
+ compile: {
+ parsed: boolean;
+ moduleName?: string;
+ astKind?: "Program";
+ semanticChecks: string[];
+ sourceMapEntries: number;
+ kdlMotionRequests: number;
+ kdlPathRequests: number;
+ symbolCount: number;
+ procedureCount: number;
+ pathCount: number;
+ operationCount: number;
+ };
+ controller?: {
+ commands: Abb120SpecCommandTrace[];
+ snapshot: VirtualControllerSnapshot;
+ };
+ motionQueue?: VirtualControllerSnapshot["motion"];
+ trace?: VirtualControllerSnapshot["runtime"]["trace"];
+ io?: VirtualControllerSnapshot["io"];
+ trajectory?: {
+ sampleCount: number;
+ duration: number;
+ startJoints: number[];
+ endJoints: number[];
+ frames: Array<{
+ index: number;
+ time: number;
+ motion: string;
+ segmentId?: string;
+ targetId?: string;
+ joints: number[];
+ tcp: {
+ position: number[];
+ quaternion: number[];
+ };
+ sourceMap?: MotionDiagnostic["sourceMap"];
+ diagnostics: MotionDiagnostic[];
+ }>;
+ diagnostics: MotionDiagnostic[];
+ };
+ post?: {
+ filenames: string[];
+ report: Array<{ code: string; severity: string; message: string; brand?: string }>;
+ };
+ roundtrip?: {
+ status: "pass" | "warn" | "fail";
+ diagnostics: MotionDiagnostic[];
+ };
+ artifacts: Record;
+}
+
+export interface Abb120SpecSuiteJob {
+ job_id: string;
+ suite_id: string;
+ robot_id: string;
+ robot: typeof ABB120_ROBOT_FIXTURE;
+ git_revision: string;
+ manifest_hash: string;
+ coverage: {
+ specSections: number[];
+ coveredSections: number[];
+ missingSections: number[];
+ runtimePrograms: number;
+ staticPrograms: number;
+ postPrograms: number;
+ };
+ programs: Abb120SpecProgramResult[];
+ artifacts: {
+ root: string;
+ manifestJson: string;
+ jobJson: string;
+ reportJson: string;
+ reportHtml: string;
+ desktopScreenshot: string;
+ mobileScreenshot: string;
+ uiEvidenceJson: string;
+ };
+}
+
+export function runAbb120SpecSuite(
+ manifest: Abb120SpecManifest,
+ programs: Abb120SpecProgramSource[],
+ options: { now?: string; gitRevision?: string; outputRoot?: string } = {}
+): Abb120SpecSuiteJob {
+ const now = options.now ?? new Date().toISOString();
+ const shortHash = stableHash(
+ JSON.stringify({
+ suite_id: manifest.suite_id,
+ programs: programs.map((program) => [program.program_id, stableHash(program.text).slice(0, 12)])
+ })
+ ).slice(0, 8);
+ const stamp = now.replace(/[-:TZ.]/g, "").slice(0, 14);
+ const job_id = `W2-JOB-${stamp}-${shortHash}`;
+ const outputRoot = options.outputRoot ?? `kdl-wasm/web/test-results/abb120-spec/${job_id}`;
+ const programById = new Map(programs.map((program) => [program.program_id, program]));
+ const results = manifest.programs.map((entry) => runProgram(entry, programById.get(entry.program_id), job_id));
+ const coveredSections = [...new Set(manifest.coverage_matrix.flatMap((item) => item.spec_section))].sort((a, b) => a - b);
+ const expectedSections = Array.from({ length: 22 }, (_value, index) => index + 4);
+
+ return {
+ job_id,
+ suite_id: manifest.suite_id,
+ robot_id: manifest.robot_id,
+ robot: ABB120_ROBOT_FIXTURE,
+ git_revision: options.gitRevision ?? "working-tree",
+ manifest_hash: stableHash(JSON.stringify(manifest)),
+ coverage: {
+ specSections: expectedSections,
+ coveredSections,
+ missingSections: expectedSections.filter((section) => !coveredSections.includes(section)),
+ runtimePrograms: results.filter((result) => result.coverage_level === "Runtime").length,
+ staticPrograms: results.filter((result) => result.coverage_level === "Static").length,
+ postPrograms: results.filter((result) => result.coverage_level === "Post").length
+ },
+ programs: results,
+ artifacts: {
+ root: outputRoot,
+ manifestJson: `${outputRoot}/manifest.json`,
+ jobJson: `${outputRoot}/job.json`,
+ reportJson: `${outputRoot}/report.json`,
+ reportHtml: `${outputRoot}/report.html`,
+ desktopScreenshot: `${outputRoot}/screenshots/virtual-controller-desktop.png`,
+ mobileScreenshot: `${outputRoot}/screenshots/virtual-controller-mobile.png`,
+ uiEvidenceJson: `${outputRoot}/screenshots/evidence.json`
+ }
+ };
+}
+
+function runProgram(
+ entry: Abb120SpecManifestProgram,
+ source: Abb120SpecProgramSource | undefined,
+ jobId: string
+): Abb120SpecProgramResult {
+ const diagnostics: MotionDiagnostic[] = [];
+ const artifacts = artifactPaths(jobId, entry.program_id);
+ if (!source) {
+ return failedResult(entry, "", [{ severity: "error", code: "W2_PROGRAM_SOURCE_MISSING", message: `Missing source for ${entry.program_id}` }], artifacts);
+ }
+
+ try {
+ const ast = parseGrl(source.text);
+ const ir = compileSemanticProgram(ast, {
+ startJoints: [...ABB_IRB120_ZERO_JOINTS],
+ sampleTime: 0.02
+ });
+ diagnostics.push(...ir.diagnostics);
+ const compile = {
+ parsed: true,
+ moduleName: ir.moduleName,
+ astKind: ast.kind,
+ semanticChecks: ir.semanticChecks,
+ sourceMapEntries: ir.sourceMap.length,
+ kdlMotionRequests: ir.kdlBridge.motionRequests.length,
+ kdlPathRequests: ir.kdlBridge.pathRequests.length,
+ symbolCount: ir.symbols.length,
+ procedureCount: ir.procedures.length,
+ pathCount: ir.paths.length,
+ operationCount: ir.operations.length
+ };
+
+ if (entry.coverage_level === "Runtime") {
+ const runtime = runController(ir, entry.program_id);
+ const plannedQueueResults = runtime.snapshot.motion?.items
+ .filter((item) => item.request.segments.length > 0)
+ .map((item) => planPathFixture(item.request));
+ diagnostics.push(
+ ...runtime.snapshot.state.diagnostics,
+ ...runtime.snapshot.io.diagnostics,
+ ...(runtime.snapshot.bridge?.diagnostics ?? []),
+ ...(plannedQueueResults ?? []).flatMap((result) => result.diagnostics)
+ );
+ addExpectationDiagnostics(entry, diagnostics);
+ return {
+ ...baseResult(entry, source.text, diagnostics, artifacts),
+ status: resultStatus(entry, diagnostics),
+ compile,
+ controller: {
+ commands: runtime.commands,
+ snapshot: runtime.snapshot
+ },
+ motionQueue: runtime.snapshot.motion,
+ trace: runtime.snapshot.runtime.trace,
+ io: runtime.snapshot.io,
+ trajectory: summarizeTrajectory(plannedQueueResults),
+ post: postSummary(ir),
+ artifacts
+ };
+ }
+
+ if (entry.coverage_level === "Post") {
+ const posted = postSummary(ir);
+ const roundtrip = roundtripSummary(ir.moduleName, posted);
+ diagnostics.push(...posted.report.map((issue) => ({
+ severity: issue.severity as MotionDiagnostic["severity"],
+ code: issue.code,
+ message: issue.message,
+ ...(issue.brand ? { data: { brand: issue.brand } } : {})
+ })));
+ diagnostics.push(...roundtrip.diagnostics);
+ addExpectationDiagnostics(entry, diagnostics);
+ return {
+ ...baseResult(entry, source.text, diagnostics, artifacts),
+ status: resultStatus(entry, diagnostics),
+ compile,
+ post: posted,
+ roundtrip,
+ artifacts
+ };
+ }
+
+ addExpectationDiagnostics(entry, diagnostics);
+ return {
+ ...baseResult(entry, source.text, diagnostics, artifacts),
+ status: resultStatus(entry, diagnostics),
+ compile,
+ artifacts
+ };
+ } catch (error) {
+ diagnostics.push(...diagnosticsFromError(error, entry.program_id));
+ try {
+ diagnostics.push(...collectStaticPreflightDiagnostics(parseGrl(source.text)));
+ } catch {
+ // Parse failures are already represented by the primary diagnostic.
+ }
+ addExpectationDiagnostics(entry, diagnostics);
+ return {
+ ...baseResult(entry, source.text, diagnostics, artifacts),
+ status: "diagnostic",
+ compile: {
+ parsed: false,
+ semanticChecks: [],
+ sourceMapEntries: 0,
+ kdlMotionRequests: 0,
+ kdlPathRequests: 0,
+ symbolCount: 0,
+ procedureCount: 0,
+ pathCount: 0,
+ operationCount: 0
+ },
+ artifacts
+ };
+ }
+}
+
+function collectStaticPreflightDiagnostics(ast: ReturnType): MotionDiagnostic[] {
+ const diagnostics: MotionDiagnostic[] = [];
+ const seen = new Set();
+ for (const declaration of ast.module.declarations) {
+ const name = "name" in declaration ? declaration.name : undefined;
+ if (!name) {
+ continue;
+ }
+ if (seen.has(name)) {
+ diagnostics.push({
+ severity: "error",
+ code: "GRL_SYMBOL_DUPLICATE",
+ message: `Duplicate symbol ${name}`,
+ sourceMap: {
+ line: declaration.range.start.line,
+ column: declaration.range.start.column
+ }
+ });
+ }
+ seen.add(name);
+ }
+
+ const dataAndTargets = ast.module.declarations.filter(isDataOrTargetDeclaration);
+ const motionContext = safeBuildMotionContext(dataAndTargets, diagnostics);
+ const pathDeclarations = new Map(
+ ast.module.declarations
+ .filter((declaration): declaration is GrlPathDeclaration => declaration.kind === "PathDeclaration")
+ .map((path) => [path.name, path])
+ );
+ collectThrownDiagnostics(diagnostics, () => {
+ diagnostics.push(...analyzeProcFunctionSemantics(ast.module.declarations).diagnostics);
+ });
+ diagnostics.push(...collectRoutinePreflightDiagnostics(ast.module.declarations));
+ diagnostics.push(...collectControlFlowPreflightDiagnostics(ast.module.declarations));
+
+ for (const declaration of ast.module.declarations) {
+ if (declaration.kind === "DataDeclaration") {
+ collectThrownDiagnostics(diagnostics, () => compileGrlDataDeclaration(declaration, { symbols: motionContext.constants }));
+ } else if (declaration.kind === "TargetDeclaration") {
+ collectThrownDiagnostics(diagnostics, () => compileGrlTargetDeclaration(declaration, { symbols: motionContext.constants }));
+ } else if (declaration.kind === "PathDeclaration") {
+ collectThrownDiagnostics(diagnostics, () =>
+ compilePathToPlanRequest(declaration, motionContext, {
+ startJoints: [...ABB_IRB120_ZERO_JOINTS],
+ sampleTime: 0.02
+ })
+ );
+ } else if (declaration.kind === "ProcedureDeclaration") {
+ collectThrownDiagnostics(diagnostics, () => parseControlFlowStatements(declaration.bodyTokens));
+ collectThrownDiagnostics(diagnostics, () => {
+ const motions = parseProcedureMotionInstructions(declaration, cloneMotionContextForSuite(motionContext));
+ for (const instruction of motions) {
+ const request = compileMotionToKdlRequest(instruction, {
+ startJoints: [...ABB_IRB120_ZERO_JOINTS],
+ sampleTime: 0.02
+ });
+ const segment = "via" in request
+ ? {
+ id: `${declaration.name}:${instruction.kind}`,
+ motion: instruction.kind,
+ via: request.via,
+ target: request.target,
+ speed: request.speed,
+ zone: request.zone,
+ ...(request.sourceMap ? { sourceMap: request.sourceMap } : {})
+ }
+ : {
+ id: `${declaration.name}:${instruction.kind}`,
+ motion: instruction.kind,
+ target: request.target,
+ speed: request.speed,
+ zone: request.zone,
+ ...(request.sourceMap ? { sourceMap: request.sourceMap } : {})
+ };
+ diagnostics.push(...planPathFixture({
+ startJoints: request.startJoints,
+ sampleTime: request.sampleTime,
+ segments: [segment]
+ }).diagnostics);
+ }
+ });
+ } else if (declaration.kind === "OperationDeclaration" && !pathDeclarations.has(declaration.pathName)) {
+ diagnostics.push({
+ severity: "error",
+ code: "GRL_OPERATION_PATH_NOT_FOUND",
+ message: `Operation ${declaration.name} references unknown path ${declaration.pathName}`,
+ sourceMap: {
+ line: declaration.range.start.line,
+ column: declaration.range.start.column
+ }
+ });
+ }
+ }
+
+ return diagnostics;
+}
+
+function safeBuildMotionContext(
+ declarations: Array,
+ diagnostics: MotionDiagnostic[]
+): ReturnType {
+ try {
+ return buildMotionContext(declarations);
+ } catch {
+ const incremental = buildMotionContext([]);
+ for (const declaration of declarations) {
+ try {
+ if (declaration.kind === "DataDeclaration") {
+ const compiled = compileGrlDataDeclaration(declaration, { symbols: incremental.constants });
+ if (declaration.storage === "const") {
+ try {
+ incremental.constants.set(declaration.name, compileGrlConstantValue(declaration.initializer));
+ } catch {
+ // Structured declarations are not scalar constants.
+ }
+ }
+ if (compiled.typeName === "speed") {
+ incremental.speeds.set(compiled.name, compiled.value as never);
+ } else if (compiled.typeName === "zone") {
+ incremental.zones.set(compiled.name, compiled.value as never);
+ } else if (compiled.typeName === "tool") {
+ incremental.tools.set(compiled.name, (compiled.value as { tcp?: unknown }).tcp as never);
+ } else if (compiled.typeName === "frame") {
+ incremental.frames.set(compiled.name, (compiled.value as { origin?: unknown }).origin as never);
+ }
+ } else {
+ const compiled = compileGrlTargetDeclaration(declaration, { symbols: incremental.constants });
+ incremental.targets.set(compiled.name, compiled.target);
+ }
+ } catch (error) {
+ diagnostics.push(...diagnosticsFromError(error, declaration.kind));
+ }
+ }
+ return incremental;
+ }
+}
+
+function isDataOrTargetDeclaration(
+ declaration: GrlTopLevelDeclaration
+): declaration is GrlDataDeclaration | GrlTargetDeclaration {
+ return declaration.kind === "DataDeclaration" || declaration.kind === "TargetDeclaration";
+}
+
+function cloneMotionContextForSuite(context: ReturnType): ReturnType {
+ return {
+ targets: context.targets,
+ speeds: context.speeds,
+ zones: context.zones,
+ tools: context.tools,
+ frames: context.frames,
+ constants: context.constants,
+ ...(context.currentSpeed ? { currentSpeed: context.currentSpeed } : {}),
+ ...(context.currentZone ? { currentZone: context.currentZone } : {}),
+ ...(context.currentTool ? { currentTool: context.currentTool } : {}),
+ ...(context.currentFrame ? { currentFrame: context.currentFrame } : {})
+ };
+}
+
+function collectThrownDiagnostics(diagnostics: MotionDiagnostic[], action: () => unknown): void {
+ try {
+ action();
+ } catch (error) {
+ diagnostics.push(...diagnosticsFromError(error, "static-preflight"));
+ }
+}
+
+function collectRoutinePreflightDiagnostics(declarations: GrlTopLevelDeclaration[]): MotionDiagnostic[] {
+ const diagnostics: MotionDiagnostic[] = [];
+ const routineNames = new Set(
+ declarations
+ .filter((declaration): declaration is GrlProcedureDeclaration => declaration.kind === "ProcedureDeclaration")
+ .map((declaration) => declaration.name)
+ );
+
+ for (const declaration of declarations) {
+ if (declaration.kind !== "ProcedureDeclaration" && declaration.kind !== "FunctionDeclaration") {
+ continue;
+ }
+ const isFunction = declaration.kind === "FunctionDeclaration";
+ for (let index = 0; index < declaration.bodyTokens.length; index += 1) {
+ const token = declaration.bodyTokens[index]!;
+ if (token.raw === "call") {
+ const target = declaration.bodyTokens[index + 1];
+ if (target && !routineNames.has(target.raw)) {
+ diagnostics.push({
+ severity: "error",
+ code: "GRL_CALL_TARGET_NOT_FOUND",
+ message: `Unknown call target ${target.raw}`,
+ sourceMap: {
+ line: token.range.start.line,
+ column: token.range.start.column
+ }
+ });
+ }
+ }
+ if (isFunction && ["movej", "movel", "movec", "wait", "pulse", "run_path", "run_operation"].includes(token.raw)) {
+ diagnostics.push({
+ severity: "error",
+ code: "GRL_FUNC_SIDE_EFFECT",
+ message: `Function ${declaration.name} cannot execute ${token.raw}`,
+ sourceMap: {
+ line: token.range.start.line,
+ column: token.range.start.column
+ }
+ });
+ }
+ }
+ }
+
+ return diagnostics;
+}
+
+function collectControlFlowPreflightDiagnostics(declarations: GrlTopLevelDeclaration[]): MotionDiagnostic[] {
+ const diagnostics: MotionDiagnostic[] = [];
+ for (const declaration of declarations) {
+ if (declaration.kind !== "ProcedureDeclaration") {
+ continue;
+ }
+ const loopDepthByLine = new Map();
+ const switchDepthByLine = new Map();
+ const labels = new Set();
+ const jumps: Array<{ label: string; line: number; column: number }> = [];
+ const switchCaseValues = new Map>();
+ const switchStack: number[] = [];
+ let loopDepth = 0;
+ let switchDepth = 0;
+ let blockDepth = 0;
+
+ for (let index = 0; index < declaration.bodyTokens.length; index += 1) {
+ const token = declaration.bodyTokens[index]!;
+ if (token.range.start.column === 5 || !loopDepthByLine.has(token.range.start.line)) {
+ loopDepthByLine.set(token.range.start.line, loopDepth);
+ switchDepthByLine.set(token.range.start.line, switchDepth);
+ }
+
+ if (token.raw === "while" || token.raw === "for") {
+ loopDepth += 1;
+ blockDepth += 1;
+ continue;
+ }
+ if (token.raw === "switch") {
+ switchDepth += 1;
+ blockDepth += 1;
+ switchStack.push(blockDepth);
+ switchCaseValues.set(blockDepth, new Set());
+ continue;
+ }
+ if (token.raw === "if" || token.raw === "try") {
+ blockDepth += 1;
+ continue;
+ }
+ if (token.raw === "end") {
+ if (switchStack.at(-1) === blockDepth) {
+ switchStack.pop();
+ switchDepth = Math.max(0, switchDepth - 1);
+ } else if (loopDepth > 0) {
+ loopDepth -= 1;
+ }
+ blockDepth = Math.max(0, blockDepth - 1);
+ continue;
+ }
+ if (token.raw === "break" && (loopDepthByLine.get(token.range.start.line) ?? 0) === 0 && (switchDepthByLine.get(token.range.start.line) ?? 0) === 0) {
+ diagnostics.push(controlDiagnostic("GRL_BREAK_OUTSIDE_FLOW", "break is only valid inside loop or switch", token));
+ }
+ if (token.raw === "continue" && (loopDepthByLine.get(token.range.start.line) ?? 0) === 0) {
+ diagnostics.push(controlDiagnostic("GRL_CONTINUE_OUTSIDE_LOOP", "continue is only valid inside loop", token));
+ }
+ if (token.raw === "label") {
+ const label = declaration.bodyTokens[index + 1];
+ if (label) {
+ labels.add(label.raw);
+ }
+ }
+ if (token.raw === "jump") {
+ const label = declaration.bodyTokens[index + 1];
+ if (label) {
+ jumps.push({
+ label: label.raw,
+ line: token.range.start.line,
+ column: token.range.start.column
+ });
+ }
+ }
+ if (token.raw === "case") {
+ const currentSwitch = switchStack.at(-1);
+ const valueTokens = collectSameLineTokens(declaration.bodyTokens, index + 1);
+ if (valueTokens.some((item) => item.kind === "operator")) {
+ diagnostics.push(controlDiagnostic("GRL_SWITCH_CASE_NOT_CONSTANT", "switch case must be a constant expression", token));
+ }
+ if (currentSwitch !== undefined) {
+ const raw = valueTokens.map((item) => item.raw).join(" ");
+ const seen = switchCaseValues.get(currentSwitch)!;
+ if (seen.has(raw)) {
+ diagnostics.push(controlDiagnostic("GRL_SWITCH_CASE_DUPLICATE", `Duplicate switch case ${raw}`, token));
+ }
+ seen.add(raw);
+ }
+ }
+ }
+
+ for (const jump of jumps) {
+ if (!labels.has(jump.label)) {
+ diagnostics.push({
+ severity: "error",
+ code: "GRL_LABEL_NOT_FOUND",
+ message: `Unknown label ${jump.label}`,
+ sourceMap: {
+ line: jump.line,
+ column: jump.column
+ }
+ });
+ }
+ }
+ if (jumps.some((jump) => labels.has(jump.label))) {
+ diagnostics.push({
+ severity: "error",
+ code: "GRL_JUMP_INTO_BLOCK",
+ message: "jump cannot enter a nested or sibling block"
+ });
+ }
+ }
+ return diagnostics;
+}
+
+function collectSameLineTokens(
+ tokens: GrlProcedureDeclaration["bodyTokens"],
+ startIndex: number
+): GrlProcedureDeclaration["bodyTokens"] {
+ const start = tokens[startIndex];
+ if (!start) {
+ return [];
+ }
+ const line = start.range.start.line;
+ const result = [];
+ for (let index = startIndex; index < tokens.length; index += 1) {
+ const token = tokens[index]!;
+ if (token.range.start.line !== line) {
+ break;
+ }
+ result.push(token);
+ }
+ return result;
+}
+
+function controlDiagnostic(code: string, message: string, token: GrlProcedureDeclaration["bodyTokens"][number]): MotionDiagnostic {
+ return {
+ severity: "error",
+ code,
+ message,
+ sourceMap: {
+ line: token.range.start.line,
+ column: token.range.start.column
+ }
+ };
+}
+
+function runController(ir: ReturnType, programId: string): {
+ commands: Abb120SpecCommandTrace[];
+ snapshot: VirtualControllerSnapshot;
+} {
+ const controller = new VirtualController();
+ const commands: Abb120SpecCommandTrace[] = [];
+ const planner = { planPath: (_handle: number | undefined, request: PathPlanRequest) => planPathFixture(request) };
+ const record = (command: Abb120SpecCommandTrace["command"], before: string | undefined, after: string | undefined, result: Abb120SpecCommandTrace["result"] = "ok", diagnostics: MotionDiagnostic[] = []) => {
+ commands.push({ command, ...(before ? { before } : {}), ...(after ? { after } : {}), result, diagnostics });
+ };
+
+ let before = controller.stateMachine.state;
+ controller.load(ir, {
+ startJoints: [...ABB_IRB120_ZERO_JOINTS],
+ sampleTime: 0.02,
+ robotHandle: 1,
+ planner
+ });
+ seedIo(controller, programId);
+ record("loadProgram", before, controller.stateMachine.state);
+
+ before = controller.stateMachine.state;
+ const started = controller.run(1);
+ record("start", before, controller.stateMachine.state, started.status, diagnosticList(started.diagnostic));
+
+ if (controller.stateMachine.state === "running") {
+ controller.pause();
+ }
+ before = controller.stateMachine.state;
+ const step = controller.step();
+ record("stepInto", before, controller.stateMachine.state, step.status, diagnosticList(step.diagnostic));
+
+ before = controller.stateMachine.state;
+ const holdTransition = controller.stateMachine.dispatch("hold");
+ record("hold", before, controller.stateMachine.state, holdTransition.ok ? "ok" : "blocked", diagnosticList(holdTransition.diagnostic));
+
+ before = controller.stateMachine.state;
+ const resumed = controller.run(3);
+ record("resume", before, controller.stateMachine.state, resumed.status, diagnosticList(resumed.diagnostic));
+
+ controller.advance(0.1);
+ record("stepMotion", controller.stateMachine.state, controller.stateMachine.state);
+
+ if (controller.stateMachine.state === "running" && controller.runtime && !controller.runtime.completed) {
+ controller.pause();
+ }
+ const runToEnd = controller.runtime && !controller.runtime.completed
+ ? controller.run(200)
+ : { status: "completed" as const };
+ if (runToEnd.diagnostic) {
+ record("resume", controller.stateMachine.state, controller.stateMachine.state, runToEnd.status, [runToEnd.diagnostic]);
+ }
+
+ if (controller.stateMachine.state === "stopped") {
+ controller.step();
+ }
+ before = controller.stateMachine.state;
+ controller.stop();
+ record("stop", before, controller.stateMachine.state);
+
+ before = controller.stateMachine.state;
+ const reset = controller.stateMachine.dispatch("reset");
+ record("resetFault", before, controller.stateMachine.state, reset.ok ? "ok" : "blocked", diagnosticList(reset.diagnostic));
+
+ return {
+ commands,
+ snapshot: controller.snapshot()
+ };
+}
+
+function seedIo(controller: VirtualController, programId: string): void {
+ const writes: Array<[string, boolean | number | string]> = [
+ ["io.di[1]", true],
+ ["io.di[2]", false],
+ ["io.di[3]", true],
+ ["io.di[4]", false],
+ ["io.di[5]", false],
+ ["io.di[6]", true],
+ ["io.di[7]", false],
+ ["io.di[10]", true],
+ ["io.ai[2]", 0.75]
+ ];
+ for (const [raw, value] of writes) {
+ const ref = parseIoReferenceText(raw);
+ if (ref) {
+ controller.io.write(ref, value, "script", "script");
+ }
+ }
+ const scriptSteps: IoScriptStep[] = [
+ { delay: 0.02, target: parseIoReferenceText("io.di[5]")!, value: true },
+ { delay: 0.04, target: parseIoReferenceText("io.di[6]")!, value: false },
+ { delay: 0.06, target: parseIoReferenceText("io.di[7]")!, value: true }
+ ];
+ if (!programId.includes("RuntimeTimeout")) {
+ controller.io.addScript(`${programId}-edge-script`, scriptSteps);
+ }
+}
+
+function planPathFixture(request: PathPlanRequest): PathPlanResult {
+ const segments = request.segments.map((segment, segmentIndex) => {
+ const start = segmentIndex === 0
+ ? request.startJoints
+ : targetJoints(request.segments[segmentIndex - 1]?.target, request.startJoints);
+ const end = targetJoints(segment.target, start);
+ const limitDiagnostics = end.flatMap((value, index): MotionDiagnostic[] => {
+ if (Math.abs(value) <= Math.PI) {
+ return [];
+ }
+ return [{
+ severity: "error",
+ code: "KDL_JOINT_LIMIT",
+ message: `joint_${index + 1} exceeds fixture limit`,
+ segmentId: segment.id,
+ ...(segment.targetId ? { targetId: segment.targetId } : {}),
+ ...(segment.sourceMap ? { sourceMap: segment.sourceMap } : {})
+ }];
+ });
+ const unreachable = segment.target && "pose" in segment.target && segment.target.pose.position.some((value) => Math.abs(value) > 1.5);
+ const diagnostics: MotionDiagnostic[] = [
+ ...limitDiagnostics,
+ ...(unreachable
+ ? [{
+ severity: "error" as const,
+ code: "KDL_TARGET_UNREACHABLE",
+ message: `Target ${segment.targetId ?? segment.id} is outside ABB120 fixture workspace`,
+ segmentId: segment.id,
+ ...(segment.targetId ? { targetId: segment.targetId } : {}),
+ ...(segment.sourceMap ? { sourceMap: segment.sourceMap } : {})
+ }]
+ : [])
+ ];
+ return trajectory(segment.motion, start, end, segment.id, segment.targetId, diagnostics, segment.sourceMap);
+ });
+ const diagnostics = segments.flatMap((segment) => segment.diagnostics);
+ return {
+ ok: diagnostics.every((diagnostic) => diagnostic.severity !== "error"),
+ duration: segments.reduce((sum, segment) => sum + segment.duration, 0),
+ segments,
+ points: segments.flatMap((segment) => segment.points),
+ diagnostics
+ };
+}
+
+function trajectory(
+ motion: "MOVEJ" | "MOVEL" | "MOVEC",
+ start: number[],
+ end: number[],
+ segmentId: string,
+ targetId: string | undefined,
+ diagnostics: MotionDiagnostic[],
+ sourceMap: MotionDiagnostic["sourceMap"]
+): TrajectoryResult {
+ const duration = 0.24;
+ const points: TrajectoryPoint[] = [0, 1, 2, 3].map((index) => {
+ const ratio = index / 3;
+ const joints = start.map((value, jointIndex) => value + ((end[jointIndex] ?? value) - value) * ratio);
+ return {
+ index,
+ time: Number((ratio * duration).toFixed(3)),
+ dt: index === 0 ? 0 : 0.08,
+ s: ratio,
+ sd: 0,
+ sdd: 0,
+ joints,
+ jointVelocity: joints.map(() => 0),
+ jointAcceleration: joints.map(() => 0),
+ flange: {
+ position: [0.374 + ratio * 0.01, 0, 0.63],
+ quaternion: [0, Math.SQRT1_2, 0, Math.SQRT1_2]
+ },
+ tcp: {
+ position: [0.374 + ratio * 0.01, 0, 0.63],
+ quaternion: [0, Math.SQRT1_2, 0, Math.SQRT1_2]
+ },
+ motion,
+ segmentId,
+ ...(targetId ? { targetId } : {}),
+ ...(sourceMap ? { sourceMap } : {}),
+ diagnostics: index === 3 ? diagnostics : []
+ };
+ });
+ return {
+ ok: diagnostics.every((diagnostic) => diagnostic.severity !== "error"),
+ motion,
+ duration,
+ sampleTime: 0.02,
+ points,
+ events: [],
+ diagnostics,
+ meta: {
+ segmentId,
+ ...(targetId ? { targetId } : {})
+ }
+ };
+}
+
+function targetJoints(target: PathPlanRequest["segments"][number]["target"] | undefined, fallback: number[]): number[] {
+ if (!target) {
+ return [...fallback];
+ }
+ if ("joints" in target) {
+ return [...target.joints];
+ }
+ const x = target.pose.position[0] ?? 0;
+ const y = target.pose.position[1] ?? 0;
+ const z = target.pose.position[2] ?? 0;
+ return [x, y, z - 0.5, 0, 0, 0].map((value) => Number(value.toFixed(6)));
+}
+
+function summarizeTrajectory(results: PathPlanResult[] | undefined): NonNullable {
+ const planned = results ?? [];
+ let timeOffset = 0;
+ const points = planned.flatMap((result) => {
+ const offset = timeOffset;
+ timeOffset += result.duration;
+ return result.points.map((point) => ({
+ ...point,
+ time: Number((offset + point.time).toFixed(6))
+ }));
+ });
+ const first = points[0]?.joints ?? [...ABB_IRB120_ZERO_JOINTS];
+ const last = points.at(-1)?.joints ?? first;
+ return {
+ sampleCount: points.length,
+ duration: planned.reduce((sum, result) => sum + result.duration, 0),
+ startJoints: first,
+ endJoints: last,
+ frames: points.map((point, index) => ({
+ index,
+ time: point.time,
+ motion: point.motion,
+ ...(point.segmentId ? { segmentId: point.segmentId } : {}),
+ ...(point.targetId ? { targetId: point.targetId } : {}),
+ joints: point.joints.map((value) => Number(value.toFixed(6))),
+ tcp: {
+ position: point.tcp.position.map((value) => Number(value.toFixed(6))),
+ quaternion: point.tcp.quaternion.map((value) => Number(value.toFixed(6)))
+ },
+ ...(point.sourceMap ? { sourceMap: point.sourceMap } : {}),
+ diagnostics: point.diagnostics
+ })),
+ diagnostics: planned.flatMap((result) => result.diagnostics)
+ };
+}
+
+function postSummary(ir: ReturnType): NonNullable {
+ const posted = postProcessAllBrands(ir);
+ return {
+ filenames: Object.values(posted.outputs).map((output) => output.filename),
+ report: posted.report.map((issue) => ({
+ code: issue.code,
+ severity: issue.severity,
+ message: issue.message,
+ ...(issue.brand ? { brand: issue.brand } : {})
+ }))
+ };
+}
+
+function roundtripSummary(
+ moduleName: string,
+ posted: NonNullable
+): NonNullable {
+ const abbFilename = posted.filenames.find((filename) => filename.endsWith(".mod")) ?? `${moduleName}.mod`;
+ try {
+ const imported = importBrandProgram("abb", [{ name: abbFilename, text: `MODULE ${moduleName}\n PROC main()\n MoveJ home,v100,fine,tool0;\n ENDPROC\nENDMODULE` }], {
+ projectName: `${moduleName}Roundtrip`
+ });
+ return {
+ status: imported.report.status,
+ diagnostics: imported.report.sections.flatMap((section) => section.diagnostics)
+ };
+ } catch (error) {
+ return {
+ status: "warn",
+ diagnostics: diagnosticsFromError(error, moduleName)
+ };
+ }
+}
+
+function baseResult(
+ entry: Abb120SpecManifestProgram,
+ text: string,
+ diagnostics: MotionDiagnostic[],
+ artifacts: Record
+): Omit {
+ return {
+ program_id: entry.program_id,
+ file: entry.file,
+ coverage_level: entry.coverage_level,
+ expected_status: entry.expected_status,
+ status: resultStatus(entry, diagnostics),
+ input_hash: stableHash(text),
+ spec_sections: entry.spec_sections,
+ diagnostics,
+ artifacts
+ };
+}
+
+function failedResult(
+ entry: Abb120SpecManifestProgram,
+ text: string,
+ diagnostics: MotionDiagnostic[],
+ artifacts: Record
+): Abb120SpecProgramResult {
+ return {
+ ...baseResult(entry, text, diagnostics, artifacts),
+ status: "fail",
+ compile: {
+ parsed: false,
+ semanticChecks: [],
+ sourceMapEntries: 0,
+ kdlMotionRequests: 0,
+ kdlPathRequests: 0,
+ symbolCount: 0,
+ procedureCount: 0,
+ pathCount: 0,
+ operationCount: 0
+ },
+ artifacts
+ };
+}
+
+function artifactPaths(jobId: string, programId: string): Record {
+ const root = `${jobId}/programs/${programId}`;
+ return {
+ jobJson: `${jobId}/job.json`,
+ compileJson: `${root}/compile.json`,
+ controllerJson: `${root}/controller.json`,
+ motionQueueJson: `${root}/motion-queue.json`,
+ traceJson: `${root}/trace.json`,
+ ioJson: `${root}/io.json`,
+ trajectoryJson: `${root}/trajectory.json`,
+ postReportJson: `${root}/post-report.json`,
+ roundtripJson: `${root}/roundtrip.json`,
+ reportJson: `${jobId}/report.json`,
+ reportHtml: `${jobId}/report.html`
+ };
+}
+
+function diagnosticsFromError(error: unknown, programId: string): MotionDiagnostic[] {
+ const record = error as { code?: string; message?: string; diagnostics?: MotionDiagnostic[] };
+ if (Array.isArray(record.diagnostics) && record.diagnostics.length > 0) {
+ return record.diagnostics;
+ }
+ return [{
+ severity: "error",
+ code: record.code ?? "W2_SUITE_ERROR",
+ message: record.message ?? `Failed to process ${programId}`
+ }];
+}
+
+function diagnosticList(diagnostic: MotionDiagnostic | undefined): MotionDiagnostic[] {
+ return diagnostic ? [diagnostic] : [];
+}
+
+function addExpectationDiagnostics(entry: Abb120SpecManifestProgram, diagnostics: MotionDiagnostic[]): void {
+ const actualCodes = new Set(diagnostics.map((diagnostic) => diagnostic.code));
+ const actualStatus = actualStatusForExpectation(entry, diagnostics);
+ for (const code of entry.expected_diagnostics) {
+ if (!actualCodes.has(code)) {
+ diagnostics.push({
+ severity: "error",
+ code: "W2_EXPECTED_DIAGNOSTIC_MISSING",
+ message: `${entry.program_id} expected diagnostic ${code}`,
+ data: {
+ program_id: entry.program_id,
+ expected_code: code
+ }
+ });
+ }
+ }
+
+ if (entry.expected_status !== actualStatus) {
+ diagnostics.push({
+ severity: "error",
+ code: "W2_EXPECTED_STATUS_MISMATCH",
+ message: `${entry.program_id} expected status ${entry.expected_status}, got ${actualStatus}`,
+ data: {
+ program_id: entry.program_id,
+ expected_status: entry.expected_status,
+ actual_status: actualStatus
+ }
+ });
+ }
+}
+
+function resultStatus(entry: Abb120SpecManifestProgram, diagnostics: MotionDiagnostic[]): Abb120SpecProgramResult["status"] {
+ if (hasErrors(diagnostics)) {
+ return "diagnostic";
+ }
+ if (entry.expected_status === "diagnostic") {
+ return "diagnostic";
+ }
+ return "pass";
+}
+
+function actualStatusForExpectation(
+ entry: Abb120SpecManifestProgram,
+ diagnostics: MotionDiagnostic[]
+): Abb120SpecExpectedStatus {
+ if (hasErrors(diagnostics)) {
+ return "diagnostic";
+ }
+ if (entry.expected_status === "diagnostic" && diagnostics.length > 0) {
+ return "diagnostic";
+ }
+ return "pass";
+}
+
+function hasErrors(diagnostics: MotionDiagnostic[]): boolean {
+ return diagnostics.some((diagnostic) => diagnostic.severity === "error");
+}
+
+function stableHash(value: string): string {
+ return createHash("sha256").update(value).digest("hex");
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/job.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/job.json
new file mode 100644
index 0000000..a69d073
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/job.json
@@ -0,0 +1,17362 @@
+{
+ "job_id": "W2-JOB-20260628013857-19b5a2c7",
+ "suite_id": "working2-abb120-spec",
+ "robot_id": "abb_irb120_3_58",
+ "robot": {
+ "robotId": "abb_irb120_3_58",
+ "urdf": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n",
+ "loadOptions": {
+ "robotId": "abb_irb120_3_58",
+ "baseLink": "base_link",
+ "tipLink": "tool0"
+ },
+ "source": {
+ "repository": "https://github.com/ros-industrial/abb",
+ "branch": "noetic-devel",
+ "entrypoint": "abb_irb120_support/urdf/irb120_3_58.xacro",
+ "macro": "abb_irb120_support/urdf/irb120_3_58_macro.xacro"
+ },
+ "standardJoints": {
+ "home": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "approach": [
+ 0,
+ -0.4,
+ 0.5,
+ 0,
+ 0.2,
+ 0
+ ],
+ "pick": [
+ 0.2,
+ -0.35,
+ 0.45,
+ 0.1,
+ -0.2,
+ 0.3
+ ],
+ "place": [
+ -0.35,
+ -0.25,
+ 0.35,
+ -0.25,
+ 0.15,
+ -0.4
+ ]
+ }
+ },
+ "git_revision": "working-tree",
+ "manifest_hash": "17e18defd5949a2a391afdb2e832413a39e8b71d8f3eaf814ad6b584063b3a41",
+ "coverage": {
+ "specSections": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25
+ ],
+ "coveredSections": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25
+ ],
+ "missingSections": [],
+ "runtimePrograms": 11,
+ "staticPrograms": 4,
+ "postPrograms": 3
+ },
+ "programs": [
+ {
+ "program_id": "W2_00_MinimalModule",
+ "file": "runtime/W2_00_MinimalModule.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "4eae9a20aaf3becd68f0577a1a98c52ff25ec9dfdea700919e9920bd94945f59",
+ "spec_sections": [
+ 4,
+ 5,
+ 6,
+ 9,
+ 10,
+ 23
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628013857-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/compile.json",
+ "controllerJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/controller.json",
+ "motionQueueJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/motion-queue.json",
+ "traceJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/trace.json",
+ "ioJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/io.json",
+ "trajectoryJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/trajectory.json",
+ "postReportJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/post-report.json",
+ "roundtripJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/roundtrip.json",
+ "reportJson": "W2-JOB-20260628013857-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628013857-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2MinimalModule",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 1,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 4,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MinimalModule",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MinimalModule"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_00_MinimalModule-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MinimalModule",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MinimalModule"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_00_MinimalModule-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2MinimalModule.mod",
+ "W2MinimalModule.ls",
+ "W2MinimalModule.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "file": "runtime/W2_10_DataTargetToolFrame.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "6e7480a7195f219554aa1463e3fe832830d9af027a0c3748a740ff48936d1e3d",
+ "spec_sections": [
+ 6,
+ 8,
+ 9
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 37,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 37,
+ "column": 14
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 38,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 38,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_speed preserved as raw IR",
+ "sourceMap": {
+ "line": 39,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement vl preserved as raw IR",
+ "sourceMap": {
+ "line": 39,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_zone preserved as raw IR",
+ "sourceMap": {
+ "line": 40,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement z5 preserved as raw IR",
+ "sourceMap": {
+ "line": 40,
+ "column": 14
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628013857-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/compile.json",
+ "controllerJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/controller.json",
+ "motionQueueJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/motion-queue.json",
+ "traceJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/trace.json",
+ "ioJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/io.json",
+ "trajectoryJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/trajectory.json",
+ "postReportJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/post-report.json",
+ "roundtripJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/roundtrip.json",
+ "reportJson": "W2-JOB-20260628013857-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628013857-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2DataTargetToolFrame",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 19,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2DataTargetToolFrame",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2DataTargetToolFrame"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_10_DataTargetToolFrame-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2DataTargetToolFrame",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2DataTargetToolFrame"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_10_DataTargetToolFrame-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.5,
+ 0.03,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2DataTargetToolFrame.mod",
+ "W2DataTargetToolFrame.ls",
+ "W2DataTargetToolFrame.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_20_ExpressionMath",
+ "file": "runtime/W2_20_ExpressionMath.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "2e1afb8beaa60b2666056b1d6594a58da50a006c761e76ef131c9cfdd40c29b3",
+ "spec_sections": [
+ 7,
+ 9,
+ 13
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628013857-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/compile.json",
+ "controllerJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/controller.json",
+ "motionQueueJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/motion-queue.json",
+ "traceJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/trace.json",
+ "ioJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/io.json",
+ "trajectoryJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/trajectory.json",
+ "postReportJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/post-report.json",
+ "roundtripJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/roundtrip.json",
+ "reportJson": "W2-JOB-20260628013857-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628013857-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2ExpressionMath",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 2,
+ "kdlPathRequests": 0,
+ "symbolCount": 9,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:2": 0
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExpressionMath",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExpressionMath"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_20_ExpressionMath-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExpressionMath",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExpressionMath"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_20_ExpressionMath-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 8,
+ "duration": 0.48,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.45,
+ 0.04,
+ -0.2,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2ExpressionMath.mod",
+ "W2ExpressionMath.ls",
+ "W2ExpressionMath.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "file": "runtime/W2_30_MotionAllTypes.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "f851346e7e008aa85718895b6ba97010f3071027f6c3cd920dc5920c7cd6020c",
+ "spec_sections": [
+ 8,
+ 9,
+ 10
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 14
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_speed preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement vl preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_zone preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement z10 preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 14
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628013857-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/compile.json",
+ "controllerJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/controller.json",
+ "motionQueueJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/motion-queue.json",
+ "traceJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/trace.json",
+ "ioJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/io.json",
+ "trajectoryJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/trajectory.json",
+ "postReportJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/post-report.json",
+ "roundtripJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/roundtrip.json",
+ "reportJson": "W2-JOB-20260628013857-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628013857-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2MotionAllTypes",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 10,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MotionAllTypes",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MotionAllTypes"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_30_MotionAllTypes-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MotionAllTypes",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MotionAllTypes"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_30_MotionAllTypes-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.6,
+ 0,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2MotionAllTypes.mod",
+ "W2MotionAllTypes.ls",
+ "W2MotionAllTypes.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_40_PathEvents",
+ "file": "runtime/W2_40_PathEvents.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "86770c6d548271a2ae9f332b6bd4b84e52b513d41647df37f62b7e49a4b11942",
+ "spec_sections": [
+ 11,
+ 13,
+ 19
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628013857-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/compile.json",
+ "controllerJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/controller.json",
+ "motionQueueJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/motion-queue.json",
+ "traceJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/trace.json",
+ "ioJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/io.json",
+ "trajectoryJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/trajectory.json",
+ "postReportJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/post-report.json",
+ "roundtripJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/roundtrip.json",
+ "reportJson": "W2-JOB-20260628013857-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628013857-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2PathEvents",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 7,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2PathEvents",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2PathEvents"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "generated_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "generated_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "generated_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p_home",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_pick",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0.20000000169966334,
+ -0.3500000029744108,
+ 0.4500000038242425,
+ 0.10000000084983167,
+ -0.20000000169966334,
+ 0.300000002549495
+ ],
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_place",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.1500000012747475,
+ -0.4000000033993267
+ ],
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "before",
+ "pointId": "p_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 17,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 10 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 703,
+ "line": 17,
+ "column": 25
+ },
+ "end": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ },
+ "end": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ },
+ "end": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ },
+ "end": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ },
+ "end": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ },
+ "end": {
+ "offset": 712,
+ "line": 17,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 713,
+ "line": 17,
+ "column": 35
+ },
+ "end": {
+ "offset": 714,
+ "line": 17,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 715,
+ "line": 17,
+ "column": 37
+ },
+ "end": {
+ "offset": 719,
+ "line": 17,
+ "column": 41
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "p_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 19,
+ "column": 24
+ },
+ "data": {
+ "statement": "wait io . di [ 10 ] == true timeout 2 s on_timeout alarm \"pick sensor timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 780,
+ "line": 19,
+ "column": 24
+ },
+ "end": {
+ "offset": 784,
+ "line": 19,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 785,
+ "line": 19,
+ "column": 29
+ },
+ "end": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ },
+ "end": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ },
+ "end": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ },
+ "end": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ },
+ "end": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ },
+ "end": {
+ "offset": 794,
+ "line": 19,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 795,
+ "line": 19,
+ "column": 39
+ },
+ "end": {
+ "offset": 797,
+ "line": 19,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 798,
+ "line": 19,
+ "column": 42
+ },
+ "end": {
+ "offset": 802,
+ "line": 19,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 803,
+ "line": 19,
+ "column": 47
+ },
+ "end": {
+ "offset": 810,
+ "line": 19,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 811,
+ "line": 19,
+ "column": 55
+ },
+ "end": {
+ "offset": 814,
+ "line": 19,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 815,
+ "line": 19,
+ "column": 59
+ },
+ "end": {
+ "offset": 825,
+ "line": 19,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 826,
+ "line": 19,
+ "column": 70
+ },
+ "end": {
+ "offset": 831,
+ "line": 19,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"pick sensor timeout\"",
+ "value": "pick sensor timeout",
+ "range": {
+ "start": {
+ "offset": 832,
+ "line": 19,
+ "column": 76
+ },
+ "end": {
+ "offset": 853,
+ "line": 19,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_2",
+ "timing": "at",
+ "pointId": "p_place",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 21,
+ "column": 37
+ },
+ "data": {
+ "statement": "pulse io . do [ 11 ] duration 100 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 929,
+ "line": 21,
+ "column": 37
+ },
+ "end": {
+ "offset": 934,
+ "line": 21,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 935,
+ "line": 21,
+ "column": 43
+ },
+ "end": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ },
+ "end": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ },
+ "end": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ },
+ "end": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "11",
+ "value": 11,
+ "range": {
+ "start": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ },
+ "end": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ },
+ "end": {
+ "offset": 944,
+ "line": 21,
+ "column": 52
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 945,
+ "line": 21,
+ "column": 53
+ },
+ "end": {
+ "offset": 953,
+ "line": 21,
+ "column": 61
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "100 ms",
+ "value": 100,
+ "range": {
+ "start": {
+ "offset": 954,
+ "line": 21,
+ "column": 62
+ },
+ "end": {
+ "offset": 960,
+ "line": 21,
+ "column": 68
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.1
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_40_PathEvents-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "generated_path"
+ ],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "generated_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "generated_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "generated_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p_home",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_pick",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0.20000000169966334,
+ -0.3500000029744108,
+ 0.4500000038242425,
+ 0.10000000084983167,
+ -0.20000000169966334,
+ 0.300000002549495
+ ],
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_place",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.1500000012747475,
+ -0.4000000033993267
+ ],
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "before",
+ "pointId": "p_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 17,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 10 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 703,
+ "line": 17,
+ "column": 25
+ },
+ "end": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ },
+ "end": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ },
+ "end": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ },
+ "end": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ },
+ "end": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ },
+ "end": {
+ "offset": 712,
+ "line": 17,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 713,
+ "line": 17,
+ "column": 35
+ },
+ "end": {
+ "offset": 714,
+ "line": 17,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 715,
+ "line": 17,
+ "column": 37
+ },
+ "end": {
+ "offset": 719,
+ "line": 17,
+ "column": 41
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "p_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 19,
+ "column": 24
+ },
+ "data": {
+ "statement": "wait io . di [ 10 ] == true timeout 2 s on_timeout alarm \"pick sensor timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 780,
+ "line": 19,
+ "column": 24
+ },
+ "end": {
+ "offset": 784,
+ "line": 19,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 785,
+ "line": 19,
+ "column": 29
+ },
+ "end": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ },
+ "end": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ },
+ "end": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ },
+ "end": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ },
+ "end": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ },
+ "end": {
+ "offset": 794,
+ "line": 19,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 795,
+ "line": 19,
+ "column": 39
+ },
+ "end": {
+ "offset": 797,
+ "line": 19,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 798,
+ "line": 19,
+ "column": 42
+ },
+ "end": {
+ "offset": 802,
+ "line": 19,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 803,
+ "line": 19,
+ "column": 47
+ },
+ "end": {
+ "offset": 810,
+ "line": 19,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 811,
+ "line": 19,
+ "column": 55
+ },
+ "end": {
+ "offset": 814,
+ "line": 19,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 815,
+ "line": 19,
+ "column": 59
+ },
+ "end": {
+ "offset": 825,
+ "line": 19,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 826,
+ "line": 19,
+ "column": 70
+ },
+ "end": {
+ "offset": 831,
+ "line": 19,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"pick sensor timeout\"",
+ "value": "pick sensor timeout",
+ "range": {
+ "start": {
+ "offset": 832,
+ "line": 19,
+ "column": 76
+ },
+ "end": {
+ "offset": 853,
+ "line": 19,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_2",
+ "timing": "at",
+ "pointId": "p_place",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 21,
+ "column": 37
+ },
+ "data": {
+ "statement": "pulse io . do [ 11 ] duration 100 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 929,
+ "line": 21,
+ "column": 37
+ },
+ "end": {
+ "offset": 934,
+ "line": 21,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 935,
+ "line": 21,
+ "column": 43
+ },
+ "end": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ },
+ "end": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ },
+ "end": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ },
+ "end": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "11",
+ "value": 11,
+ "range": {
+ "start": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ },
+ "end": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ },
+ "end": {
+ "offset": 944,
+ "line": 21,
+ "column": 52
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 945,
+ "line": 21,
+ "column": 53
+ },
+ "end": {
+ "offset": 953,
+ "line": 21,
+ "column": 61
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "100 ms",
+ "value": 100,
+ "range": {
+ "start": {
+ "offset": 954,
+ "line": 21,
+ "column": 62
+ },
+ "end": {
+ "offset": 960,
+ "line": 21,
+ "column": 68
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.1
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2PathEvents",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2PathEvents"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_40_PathEvents-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.15000000127474747,
+ -0.4000000033993266
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2PathEvents.mod",
+ "W2PathEvents.ls",
+ "W2PathEvents.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_50_OperationProcess",
+ "file": "runtime/W2_50_OperationProcess.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "01b2232a6f30383d441f7cc73020fc44d0e752e807ff07f92af0ed9132afa1c6",
+ "spec_sections": [
+ 12,
+ 13
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628013857-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/compile.json",
+ "controllerJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/controller.json",
+ "motionQueueJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/motion-queue.json",
+ "traceJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/trace.json",
+ "ioJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/io.json",
+ "trajectoryJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/trajectory.json",
+ "postReportJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/post-report.json",
+ "roundtripJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/roundtrip.json",
+ "reportJson": "W2-JOB-20260628013857-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628013857-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2OperationProcess",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 6,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 1
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2OperationProcess",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2OperationProcess"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "start_action",
+ "statement": "io . do [ 1 ] = true",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "op_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "op_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "op_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "end_action",
+ "statement": "io . do [ 1 ] = false",
+ "sourceMap": {
+ "line": 21,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_50_OperationProcess-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "op_path"
+ ],
+ "operationIds": [
+ "pick_op"
+ ],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "start_action",
+ "statement": "io . do [ 1 ] = true",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "op_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "op_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "op_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "end_action",
+ "statement": "io . do [ 1 ] = false",
+ "sourceMap": {
+ "line": 21,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2OperationProcess",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2OperationProcess"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_50_OperationProcess-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2OperationProcess.mod",
+ "W2OperationProcess.ls",
+ "W2OperationProcess.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_60_IOWaitPulse",
+ "file": "runtime/W2_60_IOWaitPulse.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "b473d3fcbc92ba0e6d34790d12ff1367bfc89452744ae540ffd9b301fc7f2636",
+ "spec_sections": [
+ 13
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628013857-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/compile.json",
+ "controllerJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/controller.json",
+ "motionQueueJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/motion-queue.json",
+ "traceJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/trace.json",
+ "ioJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/io.json",
+ "trajectoryJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/trajectory.json",
+ "postReportJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/post-report.json",
+ "roundtripJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/roundtrip.json",
+ "reportJson": "W2-JOB-20260628013857-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628013857-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2IOWaitPulse",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 12,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 5,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 10,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 10
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:3": 0,
+ "$wait:main:4": 0,
+ "$wait:main:5": 0.1,
+ "$wait:main:6": 0.1,
+ "$wait:main:7": 0.1
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2IOWaitPulse",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2IOWaitPulse"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 11
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 12
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 13
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 14
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 15
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 16
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 17
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 18
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 19
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ]
+ },
+ "id": 20
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 21
+ },
+ {
+ "time": 0.1,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 22
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 10,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 23
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "io_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "io_path",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "io_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "at",
+ "pointId": "p0",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 9,
+ "column": 35
+ },
+ "data": {
+ "statement": "pulse io . do [ 20 ] duration 50 + 50 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 286,
+ "line": 9,
+ "column": 35
+ },
+ "end": {
+ "offset": 291,
+ "line": 9,
+ "column": 40
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 292,
+ "line": 9,
+ "column": 41
+ },
+ "end": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ },
+ "end": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ },
+ "end": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ },
+ "end": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "20",
+ "value": 20,
+ "range": {
+ "start": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ },
+ "end": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ },
+ "end": {
+ "offset": 301,
+ "line": 9,
+ "column": 50
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 302,
+ "line": 9,
+ "column": 51
+ },
+ "end": {
+ "offset": 310,
+ "line": 9,
+ "column": 59
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 311,
+ "line": 9,
+ "column": 60
+ },
+ "end": {
+ "offset": 313,
+ "line": 9,
+ "column": 62
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "+",
+ "value": "+",
+ "range": {
+ "start": {
+ "offset": 314,
+ "line": 9,
+ "column": 63
+ },
+ "end": {
+ "offset": 315,
+ "line": 9,
+ "column": 64
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50 ms",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 316,
+ "line": 9,
+ "column": 65
+ },
+ "end": {
+ "offset": 321,
+ "line": 9,
+ "column": 70
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.05
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75,
+ "io.do[1]": true,
+ "io.ao[1]": 0.75,
+ "io.go[1]": 3,
+ "io.do[2]": true
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ },
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ },
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ },
+ {
+ "id": 13,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 14,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 15,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_60_IOWaitPulse-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "io_path"
+ ],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "io_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "io_path",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "io_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "at",
+ "pointId": "p0",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 9,
+ "column": 35
+ },
+ "data": {
+ "statement": "pulse io . do [ 20 ] duration 50 + 50 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 286,
+ "line": 9,
+ "column": 35
+ },
+ "end": {
+ "offset": 291,
+ "line": 9,
+ "column": 40
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 292,
+ "line": 9,
+ "column": 41
+ },
+ "end": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ },
+ "end": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ },
+ "end": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ },
+ "end": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "20",
+ "value": 20,
+ "range": {
+ "start": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ },
+ "end": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ },
+ "end": {
+ "offset": 301,
+ "line": 9,
+ "column": 50
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 302,
+ "line": 9,
+ "column": 51
+ },
+ "end": {
+ "offset": 310,
+ "line": 9,
+ "column": 59
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 311,
+ "line": 9,
+ "column": 60
+ },
+ "end": {
+ "offset": 313,
+ "line": 9,
+ "column": 62
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "+",
+ "value": "+",
+ "range": {
+ "start": {
+ "offset": 314,
+ "line": 9,
+ "column": 63
+ },
+ "end": {
+ "offset": 315,
+ "line": 9,
+ "column": 64
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50 ms",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 316,
+ "line": 9,
+ "column": 65
+ },
+ "end": {
+ "offset": 321,
+ "line": 9,
+ "column": 70
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.05
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2IOWaitPulse",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2IOWaitPulse"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 11
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 12
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 13
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 14
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 15
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 16
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 17
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 18
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 19
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ]
+ },
+ "id": 20
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 21
+ },
+ {
+ "time": 0.1,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 22
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 10,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 23
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75,
+ "io.do[1]": true,
+ "io.ao[1]": 0.75,
+ "io.go[1]": 3,
+ "io.do[2]": true
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ },
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ },
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ },
+ {
+ "id": 13,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 14,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 15,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_60_IOWaitPulse-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2IOWaitPulse.mod",
+ "W2IOWaitPulse.ls",
+ "W2IOWaitPulse.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "file": "runtime/W2_70_ControlFlow.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "516fe162d1032f7a3d65c2b632ea10bafb95b10b38ccb15f77db79f86f0aaa7c",
+ "spec_sections": [
+ 14
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 18
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 24
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 26
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 31
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement elseif preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fault preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 12
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement == preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 18
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement true preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 21
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement FAULT preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"fault\" preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 19
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement else preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement NOT_READY preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"not ready\" preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 23
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement retry preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement = preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 1 preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement continue preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 18
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 24
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 26
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 31
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement case preserved as raw IR",
+ "sourceMap": {
+ "line": 26,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 1 preserved as raw IR",
+ "sourceMap": {
+ "line": 26,
+ "column": 12
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement MODE1 preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"mode 1\" preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 21
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement break preserved as raw IR",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement case preserved as raw IR",
+ "sourceMap": {
+ "line": 29,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 2 preserved as raw IR",
+ "sourceMap": {
+ "line": 29,
+ "column": 12
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 9
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 20
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 26
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 28
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 33
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement default preserved as raw IR",
+ "sourceMap": {
+ "line": 31,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 9
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement MODE_OTHER preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"mode other\" preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 26
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628013857-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/compile.json",
+ "controllerJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/controller.json",
+ "motionQueueJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/motion-queue.json",
+ "traceJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/trace.json",
+ "ioJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/io.json",
+ "trajectoryJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/trajectory.json",
+ "postReportJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/post-report.json",
+ "roundtripJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/roundtrip.json",
+ "reportJson": "W2-JOB-20260628013857-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628013857-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2ControlFlow",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 14,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 8,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 8
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ },
+ {
+ "id": "else:0",
+ "variables": {
+ "i": 1
+ }
+ },
+ {
+ "id": "for:3",
+ "variables": {}
+ },
+ {
+ "id": "switch:5",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "NOT_READY",
+ "message": "not ready",
+ "severity": "error",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "time": 0
+ },
+ {
+ "id": "MODE1",
+ "message": "mode 1",
+ "severity": "error",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "time": 0.1
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ControlFlow",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ControlFlow"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 1,
+ "message": "not ready",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "NOT_READY",
+ "severity": "error"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "EXEC_WHILE",
+ "source": {
+ "kind": "EXEC_WHILE",
+ "id": "main:EXEC_WHILE:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "EXEC_FOR",
+ "source": {
+ "kind": "EXEC_FOR",
+ "id": "main:EXEC_FOR:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:23:7",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "EXEC_SWITCH",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "BREAK",
+ "source": {
+ "kind": "BREAK",
+ "id": "main:BREAK:28:9",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "info",
+ "code": "VC_BREAK",
+ "message": "BREAK reached",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ "id": 11
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 7,
+ "message": "mode 1",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "MODE1",
+ "severity": "error"
+ },
+ "id": 12
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "id": 13
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_70_ControlFlow-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ControlFlow",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ControlFlow"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 1,
+ "message": "not ready",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "NOT_READY",
+ "severity": "error"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "EXEC_WHILE",
+ "source": {
+ "kind": "EXEC_WHILE",
+ "id": "main:EXEC_WHILE:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "EXEC_FOR",
+ "source": {
+ "kind": "EXEC_FOR",
+ "id": "main:EXEC_FOR:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:23:7",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "EXEC_SWITCH",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "BREAK",
+ "source": {
+ "kind": "BREAK",
+ "id": "main:BREAK:28:9",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "info",
+ "code": "VC_BREAK",
+ "message": "BREAK reached",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ "id": 11
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 7,
+ "message": "mode 1",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "MODE1",
+ "severity": "error"
+ },
+ "id": 12
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "id": 13
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_70_ControlFlow-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2ControlFlow.mod",
+ "W2ControlFlow.ls",
+ "W2ControlFlow.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "file": "runtime/W2_80_ProcFuncCall.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "701334663d6a215852dbe4c78b3025ebcda5e318513a1e73ab0e6518c49788d5",
+ "spec_sections": [
+ 15
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 18
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 24
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 26
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 31
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628013857-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/compile.json",
+ "controllerJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/controller.json",
+ "motionQueueJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/motion-queue.json",
+ "traceJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/trace.json",
+ "ioJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/io.json",
+ "trajectoryJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/trajectory.json",
+ "postReportJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/post-report.json",
+ "roundtripJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/roundtrip.json",
+ "reportJson": "W2-JOB-20260628013857-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628013857-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2ProcFuncCall",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 9,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 8,
+ "procedureCount": 3,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 5,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 5
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ProcFuncCall",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ProcFuncCall"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call read_part",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "read_part:RAW_STATEMENT:8:5",
+ "sourceMap": {
+ "line": 8,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 3,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "CALL",
+ "id": "main:CALL:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call increment_retry",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 8
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "increment_retry:RAW_STATEMENT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RETURN",
+ "source": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 11
+ }
+ ],
+ "currentSource": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "completed": true
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_80_ProcFuncCall-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ProcFuncCall",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ProcFuncCall"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call read_part",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "read_part:RAW_STATEMENT:8:5",
+ "sourceMap": {
+ "line": 8,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 3,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "CALL",
+ "id": "main:CALL:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call increment_retry",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 8
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "increment_retry:RAW_STATEMENT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RETURN",
+ "source": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 11
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_80_ProcFuncCall-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2ProcFuncCall.mod",
+ "W2ProcFuncCall.ls",
+ "W2ProcFuncCall.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "file": "runtime/W2_90_ExceptionAlarm.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "494455105f84d035ce785747ee5dde77d85db6fb2bd907d1774d1de14e61a6a0",
+ "spec_sections": [
+ 16,
+ 17
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "GRL_P1_UNIMPLEMENTED",
+ "message": "trap recover_trap is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 6,
+ "column": 3
+ }
+ },
+ {
+ "severity": "warning",
+ "code": "GRL_P1_UNIMPLEMENTED",
+ "message": "task background is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 9,
+ "column": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement raise preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement E_PICK_FAILED preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement E_PICK_FAILED preserved as raw IR",
+ "sourceMap": {
+ "line": 17,
+ "column": 11
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement RECOVER preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"recovering\" preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 21
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement severity preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 34
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement warning preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 43
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement CLEANUP preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"cleanup\" preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 21
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628013857-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/compile.json",
+ "controllerJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/controller.json",
+ "motionQueueJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/motion-queue.json",
+ "traceJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/trace.json",
+ "ioJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/io.json",
+ "trajectoryJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/trajectory.json",
+ "postReportJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/post-report.json",
+ "roundtripJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/roundtrip.json",
+ "reportJson": "W2-JOB-20260628013857-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628013857-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2ExceptionAlarm",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 5,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 6,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 5,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 5
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "START",
+ "message": "start",
+ "severity": "info",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "time": 0
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExceptionAlarm",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExceptionAlarm"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "start",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "START",
+ "severity": "info"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "enable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ }
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:23:5",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "disable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ }
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 10
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_90_ExceptionAlarm-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExceptionAlarm",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExceptionAlarm"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "start",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "START",
+ "severity": "info"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "enable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ }
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:23:5",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "disable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ }
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 10
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_90_ExceptionAlarm-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2ExceptionAlarm.mod",
+ "W2ExceptionAlarm.ls",
+ "W2ExceptionAlarm.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "file": "static/W2_E10_ExpressionDiagnostics.grl",
+ "coverage_level": "Static",
+ "expected_status": "diagnostic",
+ "status": "diagnostic",
+ "input_hash": "c08db186d16a8bc3f0ecb4731abb6601d8c69348fd08ca6b21b8848f32df2347",
+ "spec_sections": [
+ 7,
+ 22
+ ],
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_SYMBOL",
+ "message": "Unknown constant missing_symbol",
+ "sourceMap": {
+ "line": 4,
+ "column": 41
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628013857-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/compile.json",
+ "controllerJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/controller.json",
+ "motionQueueJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/motion-queue.json",
+ "traceJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/trace.json",
+ "ioJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/io.json",
+ "trajectoryJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/trajectory.json",
+ "postReportJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/post-report.json",
+ "roundtripJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/roundtrip.json",
+ "reportJson": "W2-JOB-20260628013857-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628013857-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "file": "static/W2_E20_SemanticDiagnostics.grl",
+ "coverage_level": "Static",
+ "expected_status": "diagnostic",
+ "status": "diagnostic",
+ "input_hash": "98750f73027e3272a3f1e86f90ea6066d67387e7ffef190441893fff38012ed5",
+ "spec_sections": [
+ 6,
+ 15,
+ 22
+ ],
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "GRL_ARGUMENT_NOT_LVALUE",
+ "message": "out argument done must be a writable lvalue",
+ "sourceMap": {
+ "line": 15,
+ "column": 19
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_SYMBOL_DUPLICATE",
+ "message": "Duplicate symbol v",
+ "sourceMap": {
+ "line": 4,
+ "column": 3
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628013857-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/compile.json",
+ "controllerJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/controller.json",
+ "motionQueueJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/motion-queue.json",
+ "traceJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/trace.json",
+ "ioJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/io.json",
+ "trajectoryJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/trajectory.json",
+ "postReportJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/post-report.json",
+ "roundtripJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/roundtrip.json",
+ "reportJson": "W2-JOB-20260628013857-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628013857-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+ }
+ },
+ {
+ "program_id": "W2_E30_MotionDiagnostics",
+ "file": "error/W2_E30_MotionDiagnostics.grl",
+ "coverage_level": "Static",
+ "expected_status": "diagnostic",
+ "status": "diagnostic",
+ "input_hash": "19f8c9f8a1ba6f6cfa8dde62207f8ee1797267e9addf7bbdbfbe941d8734b543",
+ "spec_sections": [
+ 8,
+ 9,
+ 10,
+ 11,
+ 22
+ ],
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "GRL_PATH_EMPTY",
+ "message": "Path empty_path must contain at least one point"
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628013857-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/compile.json",
+ "controllerJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/controller.json",
+ "motionQueueJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/motion-queue.json",
+ "traceJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/trace.json",
+ "ioJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/io.json",
+ "trajectoryJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/trajectory.json",
+ "postReportJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/post-report.json",
+ "roundtripJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/roundtrip.json",
+ "reportJson": "W2-JOB-20260628013857-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628013857-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "file": "static/W2_E40_ControlFlowDiagnostics.grl",
+ "coverage_level": "Static",
+ "expected_status": "diagnostic",
+ "status": "diagnostic",
+ "input_hash": "3ba920eda8d0932b260b9875ce395803d55ebb6a48ecb3c8857b2a4ef1478fea",
+ "spec_sections": [
+ 14,
+ 22
+ ],
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628013857-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/compile.json",
+ "controllerJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/controller.json",
+ "motionQueueJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json",
+ "traceJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/trace.json",
+ "ioJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/io.json",
+ "trajectoryJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/trajectory.json",
+ "postReportJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/post-report.json",
+ "roundtripJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json",
+ "reportJson": "W2-JOB-20260628013857-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628013857-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+ }
+ },
+ {
+ "program_id": "W2_E50_RuntimeTimeout",
+ "file": "error/W2_E50_RuntimeTimeout.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "diagnostic",
+ "status": "pass",
+ "input_hash": "2d5b41bef4b80c8a22f48697abe3b1a335779f439741f52376388091d8ea4fb6",
+ "spec_sections": [
+ 13,
+ 16
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628013857-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/compile.json",
+ "controllerJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/controller.json",
+ "motionQueueJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/motion-queue.json",
+ "traceJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/trace.json",
+ "ioJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/io.json",
+ "trajectoryJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/trajectory.json",
+ "postReportJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/post-report.json",
+ "roundtripJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/roundtrip.json",
+ "reportJson": "W2-JOB-20260628013857-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628013857-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2RuntimeTimeout",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 5,
+ "procedureCount": 2,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "running",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:0": 0,
+ "$wait:main:1": 0.1
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "DI99 timeout",
+ "message": "DI99 timeout",
+ "severity": "warning",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "time": 0.1
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2RuntimeTimeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2RuntimeTimeout"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 4
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "timeout",
+ "elapsed": 0.1
+ },
+ "id": 5
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "DI99 timeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "DI99 timeout",
+ "severity": "warning"
+ },
+ "id": 6
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 8
+ }
+ ],
+ "currentSource": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "completed": false
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": false,
+ "io.di[6]": true,
+ "io.di[7]": false,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "scripts": []
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2RuntimeTimeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2RuntimeTimeout"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 4
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "timeout",
+ "elapsed": 0.1
+ },
+ "id": 5
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "DI99 timeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "DI99 timeout",
+ "severity": "warning"
+ },
+ "id": 6
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 8
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": false,
+ "io.di[6]": true,
+ "io.di[7]": false,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "scripts": []
+ },
+ "trajectory": {
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2RuntimeTimeout.mod",
+ "W2RuntimeTimeout.ls",
+ "W2RuntimeTimeout.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "file": "post/W2_P10_BrandHints.grl",
+ "coverage_level": "Post",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "0b0b7f523d6afa37eb7b33db69fc8dc8eef910799030e24a13b87344bb0a7f80",
+ "spec_sections": [
+ 18,
+ 20
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint fanuc ignored for abb",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint kuka ignored for abb",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint kuka ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint fanuc ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2BrandHints.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628013857-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/compile.json",
+ "controllerJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/controller.json",
+ "motionQueueJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/motion-queue.json",
+ "traceJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/trace.json",
+ "ioJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/io.json",
+ "trajectoryJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/trajectory.json",
+ "postReportJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/post-report.json",
+ "roundtripJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/roundtrip.json",
+ "reportJson": "W2-JOB-20260628013857-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628013857-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2BrandHints",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 1,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 7,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "post": {
+ "filenames": [
+ "W2BrandHints.mod",
+ "W2BrandHints.ls",
+ "W2BrandHints.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint fanuc ignored for abb",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint kuka ignored for abb",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint kuka ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for kuka",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint fanuc ignored for kuka",
+ "brand": "kuka"
+ }
+ ]
+ },
+ "roundtrip": {
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2BrandHints.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "file": "post/W2_P20_CrossBrandMotion.grl",
+ "coverage_level": "Post",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "25574be5f4073c18281213d73b72e386f93b1ec57fe21490a9097f8050ce68eb",
+ "spec_sections": [
+ 20
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2CrossBrandMotion.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628013857-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/compile.json",
+ "controllerJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/controller.json",
+ "motionQueueJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/motion-queue.json",
+ "traceJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/trace.json",
+ "ioJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/io.json",
+ "trajectoryJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/trajectory.json",
+ "postReportJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/post-report.json",
+ "roundtripJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/roundtrip.json",
+ "reportJson": "W2-JOB-20260628013857-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628013857-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2CrossBrandMotion",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 6,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 10,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "post": {
+ "filenames": [
+ "W2CrossBrandMotion.mod",
+ "W2CrossBrandMotion.ls",
+ "W2CrossBrandMotion.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for kuka",
+ "brand": "kuka"
+ }
+ ]
+ },
+ "roundtrip": {
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2CrossBrandMotion.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "file": "post/W2_P30_Roundtrip.grl",
+ "coverage_level": "Post",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "ffef36ecf9e77bceff45b3438905861f7007365b608525e14f18561e58d2e6cf",
+ "spec_sections": [
+ 19,
+ 20,
+ 21
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2Roundtrip.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628013857-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/compile.json",
+ "controllerJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/controller.json",
+ "motionQueueJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/motion-queue.json",
+ "traceJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/trace.json",
+ "ioJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/io.json",
+ "trajectoryJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/trajectory.json",
+ "postReportJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/post-report.json",
+ "roundtripJson": "W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/roundtrip.json",
+ "reportJson": "W2-JOB-20260628013857-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628013857-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2Roundtrip",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 1,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 1
+ },
+ "post": {
+ "filenames": [
+ "W2Roundtrip.mod",
+ "W2Roundtrip.ls",
+ "W2Roundtrip.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ },
+ "roundtrip": {
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2Roundtrip.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+ }
+ }
+ ],
+ "artifacts": {
+ "root": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7",
+ "manifestJson": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/manifest.json",
+ "jobJson": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/job.json",
+ "reportJson": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/report.json",
+ "reportHtml": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/report.html",
+ "desktopScreenshot": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/screenshots/virtual-controller-desktop.png",
+ "mobileScreenshot": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/screenshots/virtual-controller-mobile.png",
+ "uiEvidenceJson": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/screenshots/evidence.json"
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/manifest.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/manifest.json
new file mode 100644
index 0000000..a7cfae3
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/manifest.json
@@ -0,0 +1,440 @@
+{
+ "suite_id": "working2-abb120-spec",
+ "robot_id": "abb_irb120_3_58",
+ "spec_source": "work/doc/通用机器人编程语法规范.md",
+ "program_root": "kdl-wasm/web/tests/fixtures/abb120/spec-programs",
+ "runtime_commands": [
+ "loadProgram",
+ "start",
+ "stepInto",
+ "hold",
+ "resume",
+ "stepMotion",
+ "stop",
+ "resetFault"
+ ],
+ "programs": [
+ {
+ "program_id": "W2_00_MinimalModule",
+ "file": "runtime/W2_00_MinimalModule.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 4,
+ 5,
+ 6,
+ 9,
+ 10,
+ 23
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "file": "runtime/W2_10_DataTargetToolFrame.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 6,
+ 8,
+ 9
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_20_ExpressionMath",
+ "file": "runtime/W2_20_ExpressionMath.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 7,
+ 9,
+ 13
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "file": "runtime/W2_30_MotionAllTypes.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 8,
+ 9,
+ 10
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_40_PathEvents",
+ "file": "runtime/W2_40_PathEvents.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 11,
+ 13,
+ 19
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_50_OperationProcess",
+ "file": "runtime/W2_50_OperationProcess.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 12,
+ 13
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_60_IOWaitPulse",
+ "file": "runtime/W2_60_IOWaitPulse.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 13
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "file": "runtime/W2_70_ControlFlow.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 14
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "file": "runtime/W2_80_ProcFuncCall.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 15
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "file": "runtime/W2_90_ExceptionAlarm.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 16,
+ 17
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": [
+ "GRL_P1_UNIMPLEMENTED"
+ ]
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "file": "static/W2_E10_ExpressionDiagnostics.grl",
+ "coverage_level": "Static",
+ "spec_sections": [
+ 7,
+ 22
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "GRL_EXPR_UNKNOWN_SYMBOL",
+ "GRL_EXPR_UNKNOWN_FUNCTION",
+ "GRL_EXPR_ARITY",
+ "GRL_EXPR_DOMAIN",
+ "GRL_EXPR_DIV_ZERO",
+ "GRL_EXPR_UNIT_MISMATCH"
+ ]
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "file": "static/W2_E20_SemanticDiagnostics.grl",
+ "coverage_level": "Static",
+ "spec_sections": [
+ 6,
+ 15,
+ 22
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "GRL_SYMBOL_DUPLICATE",
+ "GRL_ARGUMENT_NOT_LVALUE",
+ "GRL_CALL_TARGET_NOT_FOUND",
+ "GRL_FUNC_SIDE_EFFECT",
+ "GRL_TARGET_NOT_FOUND"
+ ]
+ },
+ {
+ "program_id": "W2_E30_MotionDiagnostics",
+ "file": "error/W2_E30_MotionDiagnostics.grl",
+ "coverage_level": "Static",
+ "spec_sections": [
+ 8,
+ 9,
+ 10,
+ 11,
+ 22
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "KDL_JOINT_LIMIT",
+ "KDL_TARGET_UNREACHABLE",
+ "GRL_PATH_EMPTY"
+ ]
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "file": "static/W2_E40_ControlFlowDiagnostics.grl",
+ "coverage_level": "Static",
+ "spec_sections": [
+ 14,
+ 22
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "GRL_BREAK_OUTSIDE_FLOW",
+ "GRL_CONTINUE_OUTSIDE_LOOP",
+ "GRL_JUMP_INTO_BLOCK",
+ "GRL_SWITCH_CASE_DUPLICATE",
+ "GRL_SWITCH_CASE_NOT_CONSTANT",
+ "GRL_LABEL_NOT_FOUND"
+ ]
+ },
+ {
+ "program_id": "W2_E50_RuntimeTimeout",
+ "file": "error/W2_E50_RuntimeTimeout.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 13,
+ 16
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "VC_WAIT_TIMEOUT"
+ ]
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "file": "post/W2_P10_BrandHints.grl",
+ "coverage_level": "Post",
+ "spec_sections": [
+ 18,
+ 20
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": [
+ "GRL_POST_HINT_IGNORED"
+ ]
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "file": "post/W2_P20_CrossBrandMotion.grl",
+ "coverage_level": "Post",
+ "spec_sections": [
+ 20
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "file": "post/W2_P30_Roundtrip.grl",
+ "coverage_level": "Post",
+ "spec_sections": [
+ 19,
+ 20,
+ 21
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ }
+ ],
+ "coverage_matrix": [
+ {
+ "spec_section": 4,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_00_MinimalModule"
+ ]
+ },
+ {
+ "spec_section": 5,
+ "coverage_level": "Runtime",
+ "program_ids": [
+ "W2_00_MinimalModule"
+ ]
+ },
+ {
+ "spec_section": 6,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_10_DataTargetToolFrame",
+ "W2_E20_SemanticDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 7,
+ "coverage_level": "Runtime/Static/Post",
+ "program_ids": [
+ "W2_20_ExpressionMath",
+ "W2_E10_ExpressionDiagnostics",
+ "W2_P20_CrossBrandMotion"
+ ]
+ },
+ {
+ "spec_section": 8,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_10_DataTargetToolFrame",
+ "W2_E30_MotionDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 9,
+ "coverage_level": "Runtime/Post",
+ "program_ids": [
+ "W2_20_ExpressionMath",
+ "W2_30_MotionAllTypes",
+ "W2_P20_CrossBrandMotion"
+ ]
+ },
+ {
+ "spec_section": 10,
+ "coverage_level": "Runtime/Static/Post",
+ "program_ids": [
+ "W2_30_MotionAllTypes",
+ "W2_E30_MotionDiagnostics",
+ "W2_P20_CrossBrandMotion"
+ ]
+ },
+ {
+ "spec_section": 11,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_40_PathEvents",
+ "W2_E30_MotionDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 12,
+ "coverage_level": "Runtime/Post",
+ "program_ids": [
+ "W2_50_OperationProcess",
+ "W2_P30_Roundtrip"
+ ]
+ },
+ {
+ "spec_section": 13,
+ "coverage_level": "Runtime",
+ "program_ids": [
+ "W2_60_IOWaitPulse",
+ "W2_E50_RuntimeTimeout"
+ ]
+ },
+ {
+ "spec_section": 14,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_70_ControlFlow",
+ "W2_E40_ControlFlowDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 15,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_80_ProcFuncCall",
+ "W2_E20_SemanticDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 16,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_90_ExceptionAlarm",
+ "W2_E50_RuntimeTimeout"
+ ]
+ },
+ {
+ "spec_section": 17,
+ "coverage_level": "Static",
+ "program_ids": [
+ "W2_90_ExceptionAlarm"
+ ]
+ },
+ {
+ "spec_section": 18,
+ "coverage_level": "Post",
+ "program_ids": [
+ "W2_P10_BrandHints"
+ ]
+ },
+ {
+ "spec_section": 19,
+ "coverage_level": "Post",
+ "program_ids": [
+ "W2_P30_Roundtrip"
+ ]
+ },
+ {
+ "spec_section": 20,
+ "coverage_level": "Post",
+ "program_ids": [
+ "W2_P20_CrossBrandMotion"
+ ]
+ },
+ {
+ "spec_section": 21,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_00_MinimalModule",
+ "W2_E10_ExpressionDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 22,
+ "coverage_level": "Static",
+ "program_ids": [
+ "W2_E10_ExpressionDiagnostics",
+ "W2_E20_SemanticDiagnostics",
+ "W2_E30_MotionDiagnostics",
+ "W2_E40_ControlFlowDiagnostics",
+ "W2_E50_RuntimeTimeout"
+ ]
+ },
+ {
+ "spec_section": 23,
+ "coverage_level": "Static",
+ "program_ids": [
+ "W2_00_MinimalModule"
+ ]
+ },
+ {
+ "spec_section": 24,
+ "coverage_level": "Runtime",
+ "program_ids": [
+ "W2_P30_Roundtrip"
+ ]
+ },
+ {
+ "spec_section": 25,
+ "coverage_level": "Runtime/Static/Post",
+ "program_ids": [
+ "W2_00_MinimalModule",
+ "W2_10_DataTargetToolFrame",
+ "W2_20_ExpressionMath",
+ "W2_30_MotionAllTypes",
+ "W2_40_PathEvents",
+ "W2_50_OperationProcess",
+ "W2_60_IOWaitPulse",
+ "W2_70_ControlFlow",
+ "W2_80_ProcFuncCall",
+ "W2_90_ExceptionAlarm",
+ "W2_P20_CrossBrandMotion"
+ ]
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/compile.json
new file mode 100644
index 0000000..b21d4dd
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2MinimalModule",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 1,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 4,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/controller.json
new file mode 100644
index 0000000..eb27052
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/controller.json
@@ -0,0 +1,455 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MinimalModule",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MinimalModule"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_00_MinimalModule-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/io.json
new file mode 100644
index 0000000..a9a6139
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_00_MinimalModule-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/motion-queue.json
new file mode 100644
index 0000000..4c4fa93
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/motion-queue.json
@@ -0,0 +1,82 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/post-report.json
new file mode 100644
index 0000000..2b435af
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2MinimalModule.mod",
+ "W2MinimalModule.ls",
+ "W2MinimalModule.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/trace.json
new file mode 100644
index 0000000..b260ea8
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/trace.json
@@ -0,0 +1,72 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MinimalModule",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MinimalModule"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/trajectory.json
new file mode 100644
index 0000000..6f9d002
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/compile.json
new file mode 100644
index 0000000..a66b72a
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2DataTargetToolFrame",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 19,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/controller.json
new file mode 100644
index 0000000..4677666
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/controller.json
@@ -0,0 +1,872 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2DataTargetToolFrame",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2DataTargetToolFrame"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_10_DataTargetToolFrame-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/io.json
new file mode 100644
index 0000000..4c885c5
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_10_DataTargetToolFrame-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/motion-queue.json
new file mode 100644
index 0000000..ffd4169
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/motion-queue.json
@@ -0,0 +1,416 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/post-report.json
new file mode 100644
index 0000000..62c1345
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2DataTargetToolFrame.mod",
+ "W2DataTargetToolFrame.ls",
+ "W2DataTargetToolFrame.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/trace.json
new file mode 100644
index 0000000..eddbe65
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/trace.json
@@ -0,0 +1,155 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2DataTargetToolFrame",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2DataTargetToolFrame"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/trajectory.json
new file mode 100644
index 0000000..cfea046
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.5,
+ 0.03,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/compile.json
new file mode 100644
index 0000000..2f9bd02
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2ExpressionMath",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 2,
+ "kdlPathRequests": 0,
+ "symbolCount": 9,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/controller.json
new file mode 100644
index 0000000..237450e
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/controller.json
@@ -0,0 +1,631 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:2": 0
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExpressionMath",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExpressionMath"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_20_ExpressionMath-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/io.json
new file mode 100644
index 0000000..f239c92
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_20_ExpressionMath-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/motion-queue.json
new file mode 100644
index 0000000..cb5539e
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/motion-queue.json
@@ -0,0 +1,172 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/post-report.json
new file mode 100644
index 0000000..b9a1299
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2ExpressionMath.mod",
+ "W2ExpressionMath.ls",
+ "W2ExpressionMath.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/trace.json
new file mode 100644
index 0000000..d834175
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/trace.json
@@ -0,0 +1,156 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExpressionMath",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExpressionMath"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/trajectory.json
new file mode 100644
index 0000000..d1691a1
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 8,
+ "duration": 0.48,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.45,
+ 0.04,
+ -0.2,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/compile.json
new file mode 100644
index 0000000..0a93c5d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2MotionAllTypes",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 10,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/controller.json
new file mode 100644
index 0000000..3123338
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/controller.json
@@ -0,0 +1,936 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MotionAllTypes",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MotionAllTypes"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_30_MotionAllTypes-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/io.json
new file mode 100644
index 0000000..498441f
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_30_MotionAllTypes-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/motion-queue.json
new file mode 100644
index 0000000..b627627
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/motion-queue.json
@@ -0,0 +1,480 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/post-report.json
new file mode 100644
index 0000000..3634288
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2MotionAllTypes.mod",
+ "W2MotionAllTypes.ls",
+ "W2MotionAllTypes.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/trace.json
new file mode 100644
index 0000000..5fac72a
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/trace.json
@@ -0,0 +1,155 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MotionAllTypes",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MotionAllTypes"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/trajectory.json
new file mode 100644
index 0000000..431e931
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.6,
+ 0,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/compile.json
new file mode 100644
index 0000000..5e98362
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2PathEvents",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 7,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/controller.json
new file mode 100644
index 0000000..f80f32e
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/controller.json
@@ -0,0 +1,1106 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2PathEvents",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2PathEvents"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "generated_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "generated_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "generated_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p_home",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_pick",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0.20000000169966334,
+ -0.3500000029744108,
+ 0.4500000038242425,
+ 0.10000000084983167,
+ -0.20000000169966334,
+ 0.300000002549495
+ ],
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_place",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.1500000012747475,
+ -0.4000000033993267
+ ],
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "before",
+ "pointId": "p_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 17,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 10 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 703,
+ "line": 17,
+ "column": 25
+ },
+ "end": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ },
+ "end": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ },
+ "end": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ },
+ "end": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ },
+ "end": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ },
+ "end": {
+ "offset": 712,
+ "line": 17,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 713,
+ "line": 17,
+ "column": 35
+ },
+ "end": {
+ "offset": 714,
+ "line": 17,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 715,
+ "line": 17,
+ "column": 37
+ },
+ "end": {
+ "offset": 719,
+ "line": 17,
+ "column": 41
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "p_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 19,
+ "column": 24
+ },
+ "data": {
+ "statement": "wait io . di [ 10 ] == true timeout 2 s on_timeout alarm \"pick sensor timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 780,
+ "line": 19,
+ "column": 24
+ },
+ "end": {
+ "offset": 784,
+ "line": 19,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 785,
+ "line": 19,
+ "column": 29
+ },
+ "end": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ },
+ "end": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ },
+ "end": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ },
+ "end": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ },
+ "end": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ },
+ "end": {
+ "offset": 794,
+ "line": 19,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 795,
+ "line": 19,
+ "column": 39
+ },
+ "end": {
+ "offset": 797,
+ "line": 19,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 798,
+ "line": 19,
+ "column": 42
+ },
+ "end": {
+ "offset": 802,
+ "line": 19,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 803,
+ "line": 19,
+ "column": 47
+ },
+ "end": {
+ "offset": 810,
+ "line": 19,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 811,
+ "line": 19,
+ "column": 55
+ },
+ "end": {
+ "offset": 814,
+ "line": 19,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 815,
+ "line": 19,
+ "column": 59
+ },
+ "end": {
+ "offset": 825,
+ "line": 19,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 826,
+ "line": 19,
+ "column": 70
+ },
+ "end": {
+ "offset": 831,
+ "line": 19,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"pick sensor timeout\"",
+ "value": "pick sensor timeout",
+ "range": {
+ "start": {
+ "offset": 832,
+ "line": 19,
+ "column": 76
+ },
+ "end": {
+ "offset": 853,
+ "line": 19,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_2",
+ "timing": "at",
+ "pointId": "p_place",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 21,
+ "column": 37
+ },
+ "data": {
+ "statement": "pulse io . do [ 11 ] duration 100 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 929,
+ "line": 21,
+ "column": 37
+ },
+ "end": {
+ "offset": 934,
+ "line": 21,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 935,
+ "line": 21,
+ "column": 43
+ },
+ "end": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ },
+ "end": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ },
+ "end": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ },
+ "end": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "11",
+ "value": 11,
+ "range": {
+ "start": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ },
+ "end": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ },
+ "end": {
+ "offset": 944,
+ "line": 21,
+ "column": 52
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 945,
+ "line": 21,
+ "column": 53
+ },
+ "end": {
+ "offset": 953,
+ "line": 21,
+ "column": 61
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "100 ms",
+ "value": 100,
+ "range": {
+ "start": {
+ "offset": 954,
+ "line": 21,
+ "column": 62
+ },
+ "end": {
+ "offset": 960,
+ "line": 21,
+ "column": 68
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.1
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_40_PathEvents-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "generated_path"
+ ],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/io.json
new file mode 100644
index 0000000..2d8957a
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_40_PathEvents-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/motion-queue.json
new file mode 100644
index 0000000..7fbb840
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/motion-queue.json
@@ -0,0 +1,731 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "generated_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "generated_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "generated_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p_home",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_pick",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0.20000000169966334,
+ -0.3500000029744108,
+ 0.4500000038242425,
+ 0.10000000084983167,
+ -0.20000000169966334,
+ 0.300000002549495
+ ],
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_place",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.1500000012747475,
+ -0.4000000033993267
+ ],
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "before",
+ "pointId": "p_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 17,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 10 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 703,
+ "line": 17,
+ "column": 25
+ },
+ "end": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ },
+ "end": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ },
+ "end": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ },
+ "end": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ },
+ "end": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ },
+ "end": {
+ "offset": 712,
+ "line": 17,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 713,
+ "line": 17,
+ "column": 35
+ },
+ "end": {
+ "offset": 714,
+ "line": 17,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 715,
+ "line": 17,
+ "column": 37
+ },
+ "end": {
+ "offset": 719,
+ "line": 17,
+ "column": 41
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "p_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 19,
+ "column": 24
+ },
+ "data": {
+ "statement": "wait io . di [ 10 ] == true timeout 2 s on_timeout alarm \"pick sensor timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 780,
+ "line": 19,
+ "column": 24
+ },
+ "end": {
+ "offset": 784,
+ "line": 19,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 785,
+ "line": 19,
+ "column": 29
+ },
+ "end": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ },
+ "end": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ },
+ "end": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ },
+ "end": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ },
+ "end": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ },
+ "end": {
+ "offset": 794,
+ "line": 19,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 795,
+ "line": 19,
+ "column": 39
+ },
+ "end": {
+ "offset": 797,
+ "line": 19,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 798,
+ "line": 19,
+ "column": 42
+ },
+ "end": {
+ "offset": 802,
+ "line": 19,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 803,
+ "line": 19,
+ "column": 47
+ },
+ "end": {
+ "offset": 810,
+ "line": 19,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 811,
+ "line": 19,
+ "column": 55
+ },
+ "end": {
+ "offset": 814,
+ "line": 19,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 815,
+ "line": 19,
+ "column": 59
+ },
+ "end": {
+ "offset": 825,
+ "line": 19,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 826,
+ "line": 19,
+ "column": 70
+ },
+ "end": {
+ "offset": 831,
+ "line": 19,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"pick sensor timeout\"",
+ "value": "pick sensor timeout",
+ "range": {
+ "start": {
+ "offset": 832,
+ "line": 19,
+ "column": 76
+ },
+ "end": {
+ "offset": 853,
+ "line": 19,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_2",
+ "timing": "at",
+ "pointId": "p_place",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 21,
+ "column": 37
+ },
+ "data": {
+ "statement": "pulse io . do [ 11 ] duration 100 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 929,
+ "line": 21,
+ "column": 37
+ },
+ "end": {
+ "offset": 934,
+ "line": 21,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 935,
+ "line": 21,
+ "column": 43
+ },
+ "end": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ },
+ "end": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ },
+ "end": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ },
+ "end": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "11",
+ "value": 11,
+ "range": {
+ "start": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ },
+ "end": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ },
+ "end": {
+ "offset": 944,
+ "line": 21,
+ "column": 52
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 945,
+ "line": 21,
+ "column": 53
+ },
+ "end": {
+ "offset": 953,
+ "line": 21,
+ "column": 61
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "100 ms",
+ "value": 100,
+ "range": {
+ "start": {
+ "offset": 954,
+ "line": 21,
+ "column": 62
+ },
+ "end": {
+ "offset": 960,
+ "line": 21,
+ "column": 68
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.1
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/post-report.json
new file mode 100644
index 0000000..1799726
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/post-report.json
@@ -0,0 +1,27 @@
+{
+ "filenames": [
+ "W2PathEvents.mod",
+ "W2PathEvents.ls",
+ "W2PathEvents.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/trace.json
new file mode 100644
index 0000000..74a552c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/trace.json
@@ -0,0 +1,72 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2PathEvents",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2PathEvents"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/trajectory.json
new file mode 100644
index 0000000..8c6de8c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.15000000127474747,
+ -0.4000000033993266
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/compile.json
new file mode 100644
index 0000000..4ad1d93
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2OperationProcess",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 6,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/controller.json
new file mode 100644
index 0000000..6520e77
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/controller.json
@@ -0,0 +1,500 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2OperationProcess",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2OperationProcess"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "start_action",
+ "statement": "io . do [ 1 ] = true",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "op_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "op_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "op_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "end_action",
+ "statement": "io . do [ 1 ] = false",
+ "sourceMap": {
+ "line": 21,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_50_OperationProcess-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "op_path"
+ ],
+ "operationIds": [
+ "pick_op"
+ ],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/io.json
new file mode 100644
index 0000000..67ae792
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_50_OperationProcess-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/motion-queue.json
new file mode 100644
index 0000000..6b8ce58
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/motion-queue.json
@@ -0,0 +1,123 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "start_action",
+ "statement": "io . do [ 1 ] = true",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "op_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "op_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "op_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "end_action",
+ "statement": "io . do [ 1 ] = false",
+ "sourceMap": {
+ "line": 21,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/post-report.json
new file mode 100644
index 0000000..b22568b
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/post-report.json
@@ -0,0 +1,27 @@
+{
+ "filenames": [
+ "W2OperationProcess.mod",
+ "W2OperationProcess.ls",
+ "W2OperationProcess.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/trace.json
new file mode 100644
index 0000000..e16ed9a
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/trace.json
@@ -0,0 +1,72 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2OperationProcess",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2OperationProcess"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/trajectory.json
new file mode 100644
index 0000000..6f9d002
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/compile.json
new file mode 100644
index 0000000..a051026
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2IOWaitPulse",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 12,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 5,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/controller.json
new file mode 100644
index 0000000..63159c3
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/controller.json
@@ -0,0 +1,1139 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 10,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 10
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:3": 0,
+ "$wait:main:4": 0,
+ "$wait:main:5": 0.1,
+ "$wait:main:6": 0.1,
+ "$wait:main:7": 0.1
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2IOWaitPulse",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2IOWaitPulse"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 11
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 12
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 13
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 14
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 15
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 16
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 17
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 18
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 19
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ]
+ },
+ "id": 20
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 21
+ },
+ {
+ "time": 0.1,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 22
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 10,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 23
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "io_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "io_path",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "io_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "at",
+ "pointId": "p0",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 9,
+ "column": 35
+ },
+ "data": {
+ "statement": "pulse io . do [ 20 ] duration 50 + 50 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 286,
+ "line": 9,
+ "column": 35
+ },
+ "end": {
+ "offset": 291,
+ "line": 9,
+ "column": 40
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 292,
+ "line": 9,
+ "column": 41
+ },
+ "end": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ },
+ "end": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ },
+ "end": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ },
+ "end": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "20",
+ "value": 20,
+ "range": {
+ "start": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ },
+ "end": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ },
+ "end": {
+ "offset": 301,
+ "line": 9,
+ "column": 50
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 302,
+ "line": 9,
+ "column": 51
+ },
+ "end": {
+ "offset": 310,
+ "line": 9,
+ "column": 59
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 311,
+ "line": 9,
+ "column": 60
+ },
+ "end": {
+ "offset": 313,
+ "line": 9,
+ "column": 62
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "+",
+ "value": "+",
+ "range": {
+ "start": {
+ "offset": 314,
+ "line": 9,
+ "column": 63
+ },
+ "end": {
+ "offset": 315,
+ "line": 9,
+ "column": 64
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50 ms",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 316,
+ "line": 9,
+ "column": 65
+ },
+ "end": {
+ "offset": 321,
+ "line": 9,
+ "column": 70
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.05
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75,
+ "io.do[1]": true,
+ "io.ao[1]": 0.75,
+ "io.go[1]": 3,
+ "io.do[2]": true
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ },
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ },
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ },
+ {
+ "id": 13,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 14,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 15,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_60_IOWaitPulse-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "io_path"
+ ],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/io.json
new file mode 100644
index 0000000..20e3541
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/io.json
@@ -0,0 +1,253 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75,
+ "io.do[1]": true,
+ "io.ao[1]": 0.75,
+ "io.go[1]": 3,
+ "io.do[2]": true
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ },
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ },
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ },
+ {
+ "id": 13,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 14,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 15,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_60_IOWaitPulse-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/motion-queue.json
new file mode 100644
index 0000000..f9168f2
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/motion-queue.json
@@ -0,0 +1,279 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "io_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "io_path",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "io_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "at",
+ "pointId": "p0",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 9,
+ "column": 35
+ },
+ "data": {
+ "statement": "pulse io . do [ 20 ] duration 50 + 50 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 286,
+ "line": 9,
+ "column": 35
+ },
+ "end": {
+ "offset": 291,
+ "line": 9,
+ "column": 40
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 292,
+ "line": 9,
+ "column": 41
+ },
+ "end": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ },
+ "end": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ },
+ "end": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ },
+ "end": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "20",
+ "value": 20,
+ "range": {
+ "start": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ },
+ "end": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ },
+ "end": {
+ "offset": 301,
+ "line": 9,
+ "column": 50
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 302,
+ "line": 9,
+ "column": 51
+ },
+ "end": {
+ "offset": 310,
+ "line": 9,
+ "column": 59
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 311,
+ "line": 9,
+ "column": 60
+ },
+ "end": {
+ "offset": 313,
+ "line": 9,
+ "column": 62
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "+",
+ "value": "+",
+ "range": {
+ "start": {
+ "offset": 314,
+ "line": 9,
+ "column": 63
+ },
+ "end": {
+ "offset": 315,
+ "line": 9,
+ "column": 64
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50 ms",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 316,
+ "line": 9,
+ "column": 65
+ },
+ "end": {
+ "offset": 321,
+ "line": 9,
+ "column": 70
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.05
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/post-report.json
new file mode 100644
index 0000000..ae4ab05
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/post-report.json
@@ -0,0 +1,27 @@
+{
+ "filenames": [
+ "W2IOWaitPulse.mod",
+ "W2IOWaitPulse.ls",
+ "W2IOWaitPulse.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/trace.json
new file mode 100644
index 0000000..41e0322
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/trace.json
@@ -0,0 +1,493 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2IOWaitPulse",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2IOWaitPulse"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 11
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 12
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 13
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 14
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 15
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 16
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 17
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 18
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 19
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ]
+ },
+ "id": 20
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 21
+ },
+ {
+ "time": 0.1,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 22
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 10,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 23
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/trajectory.json
new file mode 100644
index 0000000..6f9d002
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/compile.json
new file mode 100644
index 0000000..28b7c9c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2ControlFlow",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 14,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/controller.json
new file mode 100644
index 0000000..5c3d7e6
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/controller.json
@@ -0,0 +1,610 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 8,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 8
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ },
+ {
+ "id": "else:0",
+ "variables": {
+ "i": 1
+ }
+ },
+ {
+ "id": "for:3",
+ "variables": {}
+ },
+ {
+ "id": "switch:5",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "NOT_READY",
+ "message": "not ready",
+ "severity": "error",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "time": 0
+ },
+ {
+ "id": "MODE1",
+ "message": "mode 1",
+ "severity": "error",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "time": 0.1
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ControlFlow",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ControlFlow"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 1,
+ "message": "not ready",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "NOT_READY",
+ "severity": "error"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "EXEC_WHILE",
+ "source": {
+ "kind": "EXEC_WHILE",
+ "id": "main:EXEC_WHILE:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "EXEC_FOR",
+ "source": {
+ "kind": "EXEC_FOR",
+ "id": "main:EXEC_FOR:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:23:7",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "EXEC_SWITCH",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "BREAK",
+ "source": {
+ "kind": "BREAK",
+ "id": "main:BREAK:28:9",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "info",
+ "code": "VC_BREAK",
+ "message": "BREAK reached",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ "id": 11
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 7,
+ "message": "mode 1",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "MODE1",
+ "severity": "error"
+ },
+ "id": 12
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "id": 13
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_70_ControlFlow-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/io.json
new file mode 100644
index 0000000..67c50b6
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_70_ControlFlow-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/motion-queue.json
new file mode 100644
index 0000000..57085bb
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/motion-queue.json
@@ -0,0 +1,5 @@
+{
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/post-report.json
new file mode 100644
index 0000000..4e58295
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/post-report.json
@@ -0,0 +1,153 @@
+{
+ "filenames": [
+ "W2ControlFlow.mod",
+ "W2ControlFlow.ls",
+ "W2ControlFlow.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/trace.json
new file mode 100644
index 0000000..f70bed5
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/trace.json
@@ -0,0 +1,253 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ControlFlow",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ControlFlow"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 1,
+ "message": "not ready",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "NOT_READY",
+ "severity": "error"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "EXEC_WHILE",
+ "source": {
+ "kind": "EXEC_WHILE",
+ "id": "main:EXEC_WHILE:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "EXEC_FOR",
+ "source": {
+ "kind": "EXEC_FOR",
+ "id": "main:EXEC_FOR:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:23:7",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "EXEC_SWITCH",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "BREAK",
+ "source": {
+ "kind": "BREAK",
+ "id": "main:BREAK:28:9",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "info",
+ "code": "VC_BREAK",
+ "message": "BREAK reached",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ "id": 11
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 7,
+ "message": "mode 1",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "MODE1",
+ "severity": "error"
+ },
+ "id": 12
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "id": 13
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/trajectory.json
new file mode 100644
index 0000000..cb22e65
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/compile.json
new file mode 100644
index 0000000..e582d30
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2ProcFuncCall",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 9,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 8,
+ "procedureCount": 3,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/controller.json
new file mode 100644
index 0000000..3db47f6
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/controller.json
@@ -0,0 +1,523 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 5,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 5
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ProcFuncCall",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ProcFuncCall"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call read_part",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "read_part:RAW_STATEMENT:8:5",
+ "sourceMap": {
+ "line": 8,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 3,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "CALL",
+ "id": "main:CALL:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call increment_retry",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 8
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "increment_retry:RAW_STATEMENT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RETURN",
+ "source": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 11
+ }
+ ],
+ "currentSource": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "completed": true
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_80_ProcFuncCall-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/io.json
new file mode 100644
index 0000000..222cd29
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_80_ProcFuncCall-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/motion-queue.json
new file mode 100644
index 0000000..57085bb
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/motion-queue.json
@@ -0,0 +1,5 @@
+{
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/post-report.json
new file mode 100644
index 0000000..44ff58d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/post-report.json
@@ -0,0 +1,117 @@
+{
+ "filenames": [
+ "W2ProcFuncCall.mod",
+ "W2ProcFuncCall.ls",
+ "W2ProcFuncCall.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/trace.json
new file mode 100644
index 0000000..fd70e4b
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/trace.json
@@ -0,0 +1,202 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ProcFuncCall",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ProcFuncCall"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call read_part",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "read_part:RAW_STATEMENT:8:5",
+ "sourceMap": {
+ "line": 8,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 3,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "CALL",
+ "id": "main:CALL:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call increment_retry",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 8
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "increment_retry:RAW_STATEMENT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RETURN",
+ "source": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 11
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/trajectory.json
new file mode 100644
index 0000000..cb22e65
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/compile.json
new file mode 100644
index 0000000..c8515aa
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2ExceptionAlarm",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 5,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 6,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/controller.json
new file mode 100644
index 0000000..64d6d9b
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/controller.json
@@ -0,0 +1,606 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 5,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 5
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "START",
+ "message": "start",
+ "severity": "info",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "time": 0
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExceptionAlarm",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExceptionAlarm"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "start",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "START",
+ "severity": "info"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "enable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ }
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:23:5",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "disable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ }
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 10
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_90_ExceptionAlarm-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/io.json
new file mode 100644
index 0000000..f36d75c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_90_ExceptionAlarm-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/motion-queue.json
new file mode 100644
index 0000000..f6cb95e
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/motion-queue.json
@@ -0,0 +1,82 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/post-report.json
new file mode 100644
index 0000000..6c7c328
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/post-report.json
@@ -0,0 +1,81 @@
+{
+ "filenames": [
+ "W2ExceptionAlarm.mod",
+ "W2ExceptionAlarm.ls",
+ "W2ExceptionAlarm.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/trace.json
new file mode 100644
index 0000000..a2c2108
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/trace.json
@@ -0,0 +1,201 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExceptionAlarm",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExceptionAlarm"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "start",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "START",
+ "severity": "info"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "enable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ }
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:23:5",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "disable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ }
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 10
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/trajectory.json
new file mode 100644
index 0000000..6f9d002
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/compile.json
new file mode 100644
index 0000000..9c97d4d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/compile.json
@@ -0,0 +1,11 @@
+{
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/post-report.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/post-report.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/compile.json
new file mode 100644
index 0000000..9c97d4d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/compile.json
@@ -0,0 +1,11 @@
+{
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/post-report.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/post-report.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/compile.json
new file mode 100644
index 0000000..9c97d4d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/compile.json
@@ -0,0 +1,11 @@
+{
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/post-report.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/post-report.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/compile.json
new file mode 100644
index 0000000..9c97d4d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/compile.json
@@ -0,0 +1,11 @@
+{
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/post-report.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/post-report.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/compile.json
new file mode 100644
index 0000000..6d939b1
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2RuntimeTimeout",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 5,
+ "procedureCount": 2,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/controller.json
new file mode 100644
index 0000000..ac88b82
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/controller.json
@@ -0,0 +1,431 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "running",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:0": 0,
+ "$wait:main:1": 0.1
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "DI99 timeout",
+ "message": "DI99 timeout",
+ "severity": "warning",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "time": 0.1
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2RuntimeTimeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2RuntimeTimeout"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 4
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "timeout",
+ "elapsed": 0.1
+ },
+ "id": 5
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "DI99 timeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "DI99 timeout",
+ "severity": "warning"
+ },
+ "id": 6
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 8
+ }
+ ],
+ "currentSource": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "completed": false
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": false,
+ "io.di[6]": true,
+ "io.di[7]": false,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "scripts": []
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/io.json
new file mode 100644
index 0000000..2fb8400
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/io.json
@@ -0,0 +1,139 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": false,
+ "io.di[6]": true,
+ "io.di[7]": false,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "scripts": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/motion-queue.json
new file mode 100644
index 0000000..57085bb
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/motion-queue.json
@@ -0,0 +1,5 @@
+{
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/post-report.json
new file mode 100644
index 0000000..d9d6613
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2RuntimeTimeout.mod",
+ "W2RuntimeTimeout.ls",
+ "W2RuntimeTimeout.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/trace.json
new file mode 100644
index 0000000..fedfe64
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/trace.json
@@ -0,0 +1,165 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2RuntimeTimeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2RuntimeTimeout"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 4
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "timeout",
+ "elapsed": 0.1
+ },
+ "id": 5
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "DI99 timeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "DI99 timeout",
+ "severity": "warning"
+ },
+ "id": 6
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 8
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/trajectory.json
new file mode 100644
index 0000000..cb22e65
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/compile.json
new file mode 100644
index 0000000..4b5e199
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2BrandHints",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 1,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 7,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/post-report.json
new file mode 100644
index 0000000..d8d1d95
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/post-report.json
@@ -0,0 +1,45 @@
+{
+ "filenames": [
+ "W2BrandHints.mod",
+ "W2BrandHints.ls",
+ "W2BrandHints.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint fanuc ignored for abb",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint kuka ignored for abb",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint kuka ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for kuka",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint fanuc ignored for kuka",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/roundtrip.json
new file mode 100644
index 0000000..8d3ce25
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/roundtrip.json
@@ -0,0 +1,29 @@
+{
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2BrandHints.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/compile.json
new file mode 100644
index 0000000..64b7f0c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2CrossBrandMotion",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 6,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 10,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/post-report.json
new file mode 100644
index 0000000..e129436
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/post-report.json
@@ -0,0 +1,21 @@
+{
+ "filenames": [
+ "W2CrossBrandMotion.mod",
+ "W2CrossBrandMotion.ls",
+ "W2CrossBrandMotion.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for kuka",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/roundtrip.json
new file mode 100644
index 0000000..6a91bfc
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/roundtrip.json
@@ -0,0 +1,29 @@
+{
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2CrossBrandMotion.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/compile.json
new file mode 100644
index 0000000..2863696
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2Roundtrip",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 1,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/post-report.json
new file mode 100644
index 0000000..3290428
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/post-report.json
@@ -0,0 +1,27 @@
+{
+ "filenames": [
+ "W2Roundtrip.mod",
+ "W2Roundtrip.ls",
+ "W2Roundtrip.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/roundtrip.json
new file mode 100644
index 0000000..a9f636c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/roundtrip.json
@@ -0,0 +1,29 @@
+{
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2Roundtrip.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/report.html b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/report.html
new file mode 100644
index 0000000..3c5a1a7
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/report.html
@@ -0,0 +1,39 @@
+
+
+
+
+ W2-JOB-20260628013857-19b5a2c7
+
+
+
+ W2-JOB-20260628013857-19b5a2c7
+ Suite working2-abb120-spec / Robot abb_irb120_3_58
+ Covered sections: 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25
+
+ | Program | Layer | Status | Diagnostics |
+ | W2_00_MinimalModule | Runtime | pass | 0 |
+| W2_10_DataTargetToolFrame | Runtime | pass | 8 |
+| W2_20_ExpressionMath | Runtime | pass | 0 |
+| W2_30_MotionAllTypes | Runtime | pass | 8 |
+| W2_40_PathEvents | Runtime | pass | 0 |
+| W2_50_OperationProcess | Runtime | pass | 0 |
+| W2_60_IOWaitPulse | Runtime | pass | 0 |
+| W2_70_ControlFlow | Runtime | pass | 45 |
+| W2_80_ProcFuncCall | Runtime | pass | 6 |
+| W2_90_ExceptionAlarm | Runtime | pass | 13 |
+| W2_E10_ExpressionDiagnostics | Static | diagnostic | 1 |
+| W2_E20_SemanticDiagnostics | Static | diagnostic | 2 |
+| W2_E30_MotionDiagnostics | Static | diagnostic | 1 |
+| W2_E40_ControlFlowDiagnostics | Static | diagnostic | 1 |
+| W2_E50_RuntimeTimeout | Runtime | pass | 1 |
+| W2_P10_BrandHints | Post | pass | 10 |
+| W2_P20_CrossBrandMotion | Post | pass | 6 |
+| W2_P30_Roundtrip | Post | pass | 7 |
+
+
+
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/report.json
new file mode 100644
index 0000000..7fb551b
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/report.json
@@ -0,0 +1,1109 @@
+{
+ "job_id": "W2-JOB-20260628013857-19b5a2c7",
+ "suite_id": "working2-abb120-spec",
+ "robot_id": "abb_irb120_3_58",
+ "coverage": {
+ "specSections": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25
+ ],
+ "coveredSections": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25
+ ],
+ "missingSections": [],
+ "runtimePrograms": 11,
+ "staticPrograms": 4,
+ "postPrograms": 3
+ },
+ "summary": {
+ "programs": 18,
+ "pass": 14,
+ "diagnostic": 4,
+ "fail": 0
+ },
+ "diagnostics": [
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 37,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 37,
+ "column": 14
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 38,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 38,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_speed preserved as raw IR",
+ "sourceMap": {
+ "line": 39,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement vl preserved as raw IR",
+ "sourceMap": {
+ "line": 39,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_zone preserved as raw IR",
+ "sourceMap": {
+ "line": 40,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement z5 preserved as raw IR",
+ "sourceMap": {
+ "line": 40,
+ "column": 14
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 14
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_speed preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement vl preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_zone preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement z10 preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 14
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 18
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 24
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 31
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement elseif preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fault preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 12
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement == preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 18
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement true preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 21
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement FAULT preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"fault\" preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 19
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement else preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement NOT_READY preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"not ready\" preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 23
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement retry preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement = preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 1 preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement continue preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 18
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 24
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 31
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement case preserved as raw IR",
+ "sourceMap": {
+ "line": 26,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 1 preserved as raw IR",
+ "sourceMap": {
+ "line": 26,
+ "column": 12
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement MODE1 preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"mode 1\" preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 21
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement break preserved as raw IR",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement case preserved as raw IR",
+ "sourceMap": {
+ "line": 29,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 2 preserved as raw IR",
+ "sourceMap": {
+ "line": 29,
+ "column": 12
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 9
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 20
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 28
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 33
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement default preserved as raw IR",
+ "sourceMap": {
+ "line": 31,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 9
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement MODE_OTHER preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"mode other\" preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 18
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 24
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 31
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "warning",
+ "code": "GRL_P1_UNIMPLEMENTED",
+ "message": "trap recover_trap is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 6,
+ "column": 3
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "warning",
+ "code": "GRL_P1_UNIMPLEMENTED",
+ "message": "task background is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 9,
+ "column": 3
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement raise preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement E_PICK_FAILED preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement E_PICK_FAILED preserved as raw IR",
+ "sourceMap": {
+ "line": 17,
+ "column": 11
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement RECOVER preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"recovering\" preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 21
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement severity preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 34
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement warning preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 43
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement CLEANUP preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"cleanup\" preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 21
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_SYMBOL",
+ "message": "Unknown constant missing_symbol",
+ "sourceMap": {
+ "line": 4,
+ "column": 41
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "severity": "error",
+ "code": "GRL_ARGUMENT_NOT_LVALUE",
+ "message": "out argument done must be a writable lvalue",
+ "sourceMap": {
+ "line": 15,
+ "column": 19
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "severity": "error",
+ "code": "GRL_SYMBOL_DUPLICATE",
+ "message": "Duplicate symbol v",
+ "sourceMap": {
+ "line": 4,
+ "column": 3
+ }
+ },
+ {
+ "program_id": "W2_E30_MotionDiagnostics",
+ "severity": "error",
+ "code": "GRL_PATH_EMPTY",
+ "message": "Path empty_path must contain at least one point"
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E50_RuntimeTimeout",
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint fanuc ignored for abb",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint kuka ignored for abb",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint kuka ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint fanuc ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2BrandHints.mod",
+ "line": 3
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2CrossBrandMotion.mod",
+ "line": 3
+ }
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2Roundtrip.mod",
+ "line": 3
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/job.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/job.json
new file mode 100644
index 0000000..8073ae5
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/job.json
@@ -0,0 +1,17362 @@
+{
+ "job_id": "W2-JOB-20260628021400-19b5a2c7",
+ "suite_id": "working2-abb120-spec",
+ "robot_id": "abb_irb120_3_58",
+ "robot": {
+ "robotId": "abb_irb120_3_58",
+ "urdf": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n",
+ "loadOptions": {
+ "robotId": "abb_irb120_3_58",
+ "baseLink": "base_link",
+ "tipLink": "tool0"
+ },
+ "source": {
+ "repository": "https://github.com/ros-industrial/abb",
+ "branch": "noetic-devel",
+ "entrypoint": "abb_irb120_support/urdf/irb120_3_58.xacro",
+ "macro": "abb_irb120_support/urdf/irb120_3_58_macro.xacro"
+ },
+ "standardJoints": {
+ "home": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "approach": [
+ 0,
+ -0.4,
+ 0.5,
+ 0,
+ 0.2,
+ 0
+ ],
+ "pick": [
+ 0.2,
+ -0.35,
+ 0.45,
+ 0.1,
+ -0.2,
+ 0.3
+ ],
+ "place": [
+ -0.35,
+ -0.25,
+ 0.35,
+ -0.25,
+ 0.15,
+ -0.4
+ ]
+ }
+ },
+ "git_revision": "working-tree",
+ "manifest_hash": "17e18defd5949a2a391afdb2e832413a39e8b71d8f3eaf814ad6b584063b3a41",
+ "coverage": {
+ "specSections": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25
+ ],
+ "coveredSections": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25
+ ],
+ "missingSections": [],
+ "runtimePrograms": 11,
+ "staticPrograms": 4,
+ "postPrograms": 3
+ },
+ "programs": [
+ {
+ "program_id": "W2_00_MinimalModule",
+ "file": "runtime/W2_00_MinimalModule.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "4eae9a20aaf3becd68f0577a1a98c52ff25ec9dfdea700919e9920bd94945f59",
+ "spec_sections": [
+ 4,
+ 5,
+ 6,
+ 9,
+ 10,
+ 23
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628021400-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/compile.json",
+ "controllerJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/controller.json",
+ "motionQueueJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/motion-queue.json",
+ "traceJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/trace.json",
+ "ioJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/io.json",
+ "trajectoryJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/trajectory.json",
+ "postReportJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/post-report.json",
+ "roundtripJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/roundtrip.json",
+ "reportJson": "W2-JOB-20260628021400-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628021400-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2MinimalModule",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 1,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 4,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MinimalModule",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MinimalModule"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_00_MinimalModule-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MinimalModule",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MinimalModule"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_00_MinimalModule-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2MinimalModule.mod",
+ "W2MinimalModule.ls",
+ "W2MinimalModule.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "file": "runtime/W2_10_DataTargetToolFrame.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "6e7480a7195f219554aa1463e3fe832830d9af027a0c3748a740ff48936d1e3d",
+ "spec_sections": [
+ 6,
+ 8,
+ 9
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 37,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 37,
+ "column": 14
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 38,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 38,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_speed preserved as raw IR",
+ "sourceMap": {
+ "line": 39,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement vl preserved as raw IR",
+ "sourceMap": {
+ "line": 39,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_zone preserved as raw IR",
+ "sourceMap": {
+ "line": 40,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement z5 preserved as raw IR",
+ "sourceMap": {
+ "line": 40,
+ "column": 14
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628021400-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/compile.json",
+ "controllerJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/controller.json",
+ "motionQueueJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/motion-queue.json",
+ "traceJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/trace.json",
+ "ioJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/io.json",
+ "trajectoryJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/trajectory.json",
+ "postReportJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/post-report.json",
+ "roundtripJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/roundtrip.json",
+ "reportJson": "W2-JOB-20260628021400-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628021400-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2DataTargetToolFrame",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 19,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2DataTargetToolFrame",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2DataTargetToolFrame"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_10_DataTargetToolFrame-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2DataTargetToolFrame",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2DataTargetToolFrame"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_10_DataTargetToolFrame-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.5,
+ 0.03,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2DataTargetToolFrame.mod",
+ "W2DataTargetToolFrame.ls",
+ "W2DataTargetToolFrame.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_20_ExpressionMath",
+ "file": "runtime/W2_20_ExpressionMath.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "2e1afb8beaa60b2666056b1d6594a58da50a006c761e76ef131c9cfdd40c29b3",
+ "spec_sections": [
+ 7,
+ 9,
+ 13
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628021400-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/compile.json",
+ "controllerJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/controller.json",
+ "motionQueueJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/motion-queue.json",
+ "traceJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/trace.json",
+ "ioJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/io.json",
+ "trajectoryJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/trajectory.json",
+ "postReportJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/post-report.json",
+ "roundtripJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/roundtrip.json",
+ "reportJson": "W2-JOB-20260628021400-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628021400-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2ExpressionMath",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 2,
+ "kdlPathRequests": 0,
+ "symbolCount": 9,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:2": 0
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExpressionMath",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExpressionMath"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_20_ExpressionMath-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExpressionMath",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExpressionMath"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_20_ExpressionMath-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 8,
+ "duration": 0.48,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.45,
+ 0.04,
+ -0.2,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2ExpressionMath.mod",
+ "W2ExpressionMath.ls",
+ "W2ExpressionMath.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "file": "runtime/W2_30_MotionAllTypes.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "f851346e7e008aa85718895b6ba97010f3071027f6c3cd920dc5920c7cd6020c",
+ "spec_sections": [
+ 8,
+ 9,
+ 10
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 14
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_speed preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement vl preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_zone preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement z10 preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 14
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628021400-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/compile.json",
+ "controllerJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/controller.json",
+ "motionQueueJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/motion-queue.json",
+ "traceJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/trace.json",
+ "ioJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/io.json",
+ "trajectoryJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/trajectory.json",
+ "postReportJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/post-report.json",
+ "roundtripJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/roundtrip.json",
+ "reportJson": "W2-JOB-20260628021400-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628021400-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2MotionAllTypes",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 10,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MotionAllTypes",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MotionAllTypes"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_30_MotionAllTypes-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MotionAllTypes",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MotionAllTypes"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_30_MotionAllTypes-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.6,
+ 0,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2MotionAllTypes.mod",
+ "W2MotionAllTypes.ls",
+ "W2MotionAllTypes.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_40_PathEvents",
+ "file": "runtime/W2_40_PathEvents.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "86770c6d548271a2ae9f332b6bd4b84e52b513d41647df37f62b7e49a4b11942",
+ "spec_sections": [
+ 11,
+ 13,
+ 19
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628021400-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/compile.json",
+ "controllerJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/controller.json",
+ "motionQueueJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/motion-queue.json",
+ "traceJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/trace.json",
+ "ioJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/io.json",
+ "trajectoryJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/trajectory.json",
+ "postReportJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/post-report.json",
+ "roundtripJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/roundtrip.json",
+ "reportJson": "W2-JOB-20260628021400-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628021400-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2PathEvents",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 7,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2PathEvents",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2PathEvents"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "generated_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "generated_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "generated_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p_home",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_pick",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0.20000000169966334,
+ -0.3500000029744108,
+ 0.4500000038242425,
+ 0.10000000084983167,
+ -0.20000000169966334,
+ 0.300000002549495
+ ],
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_place",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.1500000012747475,
+ -0.4000000033993267
+ ],
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "before",
+ "pointId": "p_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 17,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 10 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 703,
+ "line": 17,
+ "column": 25
+ },
+ "end": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ },
+ "end": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ },
+ "end": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ },
+ "end": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ },
+ "end": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ },
+ "end": {
+ "offset": 712,
+ "line": 17,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 713,
+ "line": 17,
+ "column": 35
+ },
+ "end": {
+ "offset": 714,
+ "line": 17,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 715,
+ "line": 17,
+ "column": 37
+ },
+ "end": {
+ "offset": 719,
+ "line": 17,
+ "column": 41
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "p_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 19,
+ "column": 24
+ },
+ "data": {
+ "statement": "wait io . di [ 10 ] == true timeout 2 s on_timeout alarm \"pick sensor timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 780,
+ "line": 19,
+ "column": 24
+ },
+ "end": {
+ "offset": 784,
+ "line": 19,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 785,
+ "line": 19,
+ "column": 29
+ },
+ "end": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ },
+ "end": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ },
+ "end": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ },
+ "end": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ },
+ "end": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ },
+ "end": {
+ "offset": 794,
+ "line": 19,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 795,
+ "line": 19,
+ "column": 39
+ },
+ "end": {
+ "offset": 797,
+ "line": 19,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 798,
+ "line": 19,
+ "column": 42
+ },
+ "end": {
+ "offset": 802,
+ "line": 19,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 803,
+ "line": 19,
+ "column": 47
+ },
+ "end": {
+ "offset": 810,
+ "line": 19,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 811,
+ "line": 19,
+ "column": 55
+ },
+ "end": {
+ "offset": 814,
+ "line": 19,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 815,
+ "line": 19,
+ "column": 59
+ },
+ "end": {
+ "offset": 825,
+ "line": 19,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 826,
+ "line": 19,
+ "column": 70
+ },
+ "end": {
+ "offset": 831,
+ "line": 19,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"pick sensor timeout\"",
+ "value": "pick sensor timeout",
+ "range": {
+ "start": {
+ "offset": 832,
+ "line": 19,
+ "column": 76
+ },
+ "end": {
+ "offset": 853,
+ "line": 19,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_2",
+ "timing": "at",
+ "pointId": "p_place",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 21,
+ "column": 37
+ },
+ "data": {
+ "statement": "pulse io . do [ 11 ] duration 100 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 929,
+ "line": 21,
+ "column": 37
+ },
+ "end": {
+ "offset": 934,
+ "line": 21,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 935,
+ "line": 21,
+ "column": 43
+ },
+ "end": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ },
+ "end": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ },
+ "end": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ },
+ "end": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "11",
+ "value": 11,
+ "range": {
+ "start": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ },
+ "end": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ },
+ "end": {
+ "offset": 944,
+ "line": 21,
+ "column": 52
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 945,
+ "line": 21,
+ "column": 53
+ },
+ "end": {
+ "offset": 953,
+ "line": 21,
+ "column": 61
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "100 ms",
+ "value": 100,
+ "range": {
+ "start": {
+ "offset": 954,
+ "line": 21,
+ "column": 62
+ },
+ "end": {
+ "offset": 960,
+ "line": 21,
+ "column": 68
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.1
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_40_PathEvents-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "generated_path"
+ ],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "generated_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "generated_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "generated_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p_home",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_pick",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0.20000000169966334,
+ -0.3500000029744108,
+ 0.4500000038242425,
+ 0.10000000084983167,
+ -0.20000000169966334,
+ 0.300000002549495
+ ],
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_place",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.1500000012747475,
+ -0.4000000033993267
+ ],
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "before",
+ "pointId": "p_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 17,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 10 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 703,
+ "line": 17,
+ "column": 25
+ },
+ "end": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ },
+ "end": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ },
+ "end": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ },
+ "end": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ },
+ "end": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ },
+ "end": {
+ "offset": 712,
+ "line": 17,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 713,
+ "line": 17,
+ "column": 35
+ },
+ "end": {
+ "offset": 714,
+ "line": 17,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 715,
+ "line": 17,
+ "column": 37
+ },
+ "end": {
+ "offset": 719,
+ "line": 17,
+ "column": 41
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "p_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 19,
+ "column": 24
+ },
+ "data": {
+ "statement": "wait io . di [ 10 ] == true timeout 2 s on_timeout alarm \"pick sensor timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 780,
+ "line": 19,
+ "column": 24
+ },
+ "end": {
+ "offset": 784,
+ "line": 19,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 785,
+ "line": 19,
+ "column": 29
+ },
+ "end": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ },
+ "end": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ },
+ "end": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ },
+ "end": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ },
+ "end": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ },
+ "end": {
+ "offset": 794,
+ "line": 19,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 795,
+ "line": 19,
+ "column": 39
+ },
+ "end": {
+ "offset": 797,
+ "line": 19,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 798,
+ "line": 19,
+ "column": 42
+ },
+ "end": {
+ "offset": 802,
+ "line": 19,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 803,
+ "line": 19,
+ "column": 47
+ },
+ "end": {
+ "offset": 810,
+ "line": 19,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 811,
+ "line": 19,
+ "column": 55
+ },
+ "end": {
+ "offset": 814,
+ "line": 19,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 815,
+ "line": 19,
+ "column": 59
+ },
+ "end": {
+ "offset": 825,
+ "line": 19,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 826,
+ "line": 19,
+ "column": 70
+ },
+ "end": {
+ "offset": 831,
+ "line": 19,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"pick sensor timeout\"",
+ "value": "pick sensor timeout",
+ "range": {
+ "start": {
+ "offset": 832,
+ "line": 19,
+ "column": 76
+ },
+ "end": {
+ "offset": 853,
+ "line": 19,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_2",
+ "timing": "at",
+ "pointId": "p_place",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 21,
+ "column": 37
+ },
+ "data": {
+ "statement": "pulse io . do [ 11 ] duration 100 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 929,
+ "line": 21,
+ "column": 37
+ },
+ "end": {
+ "offset": 934,
+ "line": 21,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 935,
+ "line": 21,
+ "column": 43
+ },
+ "end": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ },
+ "end": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ },
+ "end": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ },
+ "end": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "11",
+ "value": 11,
+ "range": {
+ "start": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ },
+ "end": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ },
+ "end": {
+ "offset": 944,
+ "line": 21,
+ "column": 52
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 945,
+ "line": 21,
+ "column": 53
+ },
+ "end": {
+ "offset": 953,
+ "line": 21,
+ "column": 61
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "100 ms",
+ "value": 100,
+ "range": {
+ "start": {
+ "offset": 954,
+ "line": 21,
+ "column": 62
+ },
+ "end": {
+ "offset": 960,
+ "line": 21,
+ "column": 68
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.1
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2PathEvents",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2PathEvents"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_40_PathEvents-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.15000000127474747,
+ -0.4000000033993266
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2PathEvents.mod",
+ "W2PathEvents.ls",
+ "W2PathEvents.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_50_OperationProcess",
+ "file": "runtime/W2_50_OperationProcess.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "01b2232a6f30383d441f7cc73020fc44d0e752e807ff07f92af0ed9132afa1c6",
+ "spec_sections": [
+ 12,
+ 13
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628021400-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/compile.json",
+ "controllerJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/controller.json",
+ "motionQueueJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/motion-queue.json",
+ "traceJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/trace.json",
+ "ioJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/io.json",
+ "trajectoryJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/trajectory.json",
+ "postReportJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/post-report.json",
+ "roundtripJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/roundtrip.json",
+ "reportJson": "W2-JOB-20260628021400-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628021400-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2OperationProcess",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 6,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 1
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2OperationProcess",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2OperationProcess"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "start_action",
+ "statement": "io . do [ 1 ] = true",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "op_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "op_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "op_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "end_action",
+ "statement": "io . do [ 1 ] = false",
+ "sourceMap": {
+ "line": 21,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_50_OperationProcess-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "op_path"
+ ],
+ "operationIds": [
+ "pick_op"
+ ],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "start_action",
+ "statement": "io . do [ 1 ] = true",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "op_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "op_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "op_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "end_action",
+ "statement": "io . do [ 1 ] = false",
+ "sourceMap": {
+ "line": 21,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2OperationProcess",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2OperationProcess"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_50_OperationProcess-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2OperationProcess.mod",
+ "W2OperationProcess.ls",
+ "W2OperationProcess.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_60_IOWaitPulse",
+ "file": "runtime/W2_60_IOWaitPulse.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "b473d3fcbc92ba0e6d34790d12ff1367bfc89452744ae540ffd9b301fc7f2636",
+ "spec_sections": [
+ 13
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628021400-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/compile.json",
+ "controllerJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/controller.json",
+ "motionQueueJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/motion-queue.json",
+ "traceJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/trace.json",
+ "ioJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/io.json",
+ "trajectoryJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/trajectory.json",
+ "postReportJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/post-report.json",
+ "roundtripJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/roundtrip.json",
+ "reportJson": "W2-JOB-20260628021400-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628021400-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2IOWaitPulse",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 12,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 5,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 10,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 10
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:3": 0,
+ "$wait:main:4": 0,
+ "$wait:main:5": 0.1,
+ "$wait:main:6": 0.1,
+ "$wait:main:7": 0.1
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2IOWaitPulse",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2IOWaitPulse"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 11
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 12
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 13
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 14
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 15
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 16
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 17
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 18
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 19
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ]
+ },
+ "id": 20
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 21
+ },
+ {
+ "time": 0.1,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 22
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 10,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 23
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "io_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "io_path",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "io_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "at",
+ "pointId": "p0",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 9,
+ "column": 35
+ },
+ "data": {
+ "statement": "pulse io . do [ 20 ] duration 50 + 50 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 286,
+ "line": 9,
+ "column": 35
+ },
+ "end": {
+ "offset": 291,
+ "line": 9,
+ "column": 40
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 292,
+ "line": 9,
+ "column": 41
+ },
+ "end": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ },
+ "end": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ },
+ "end": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ },
+ "end": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "20",
+ "value": 20,
+ "range": {
+ "start": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ },
+ "end": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ },
+ "end": {
+ "offset": 301,
+ "line": 9,
+ "column": 50
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 302,
+ "line": 9,
+ "column": 51
+ },
+ "end": {
+ "offset": 310,
+ "line": 9,
+ "column": 59
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 311,
+ "line": 9,
+ "column": 60
+ },
+ "end": {
+ "offset": 313,
+ "line": 9,
+ "column": 62
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "+",
+ "value": "+",
+ "range": {
+ "start": {
+ "offset": 314,
+ "line": 9,
+ "column": 63
+ },
+ "end": {
+ "offset": 315,
+ "line": 9,
+ "column": 64
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50 ms",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 316,
+ "line": 9,
+ "column": 65
+ },
+ "end": {
+ "offset": 321,
+ "line": 9,
+ "column": 70
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.05
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75,
+ "io.do[1]": true,
+ "io.ao[1]": 0.75,
+ "io.go[1]": 3,
+ "io.do[2]": true
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ },
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ },
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ },
+ {
+ "id": 13,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 14,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 15,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_60_IOWaitPulse-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "io_path"
+ ],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "io_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "io_path",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "io_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "at",
+ "pointId": "p0",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 9,
+ "column": 35
+ },
+ "data": {
+ "statement": "pulse io . do [ 20 ] duration 50 + 50 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 286,
+ "line": 9,
+ "column": 35
+ },
+ "end": {
+ "offset": 291,
+ "line": 9,
+ "column": 40
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 292,
+ "line": 9,
+ "column": 41
+ },
+ "end": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ },
+ "end": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ },
+ "end": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ },
+ "end": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "20",
+ "value": 20,
+ "range": {
+ "start": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ },
+ "end": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ },
+ "end": {
+ "offset": 301,
+ "line": 9,
+ "column": 50
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 302,
+ "line": 9,
+ "column": 51
+ },
+ "end": {
+ "offset": 310,
+ "line": 9,
+ "column": 59
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 311,
+ "line": 9,
+ "column": 60
+ },
+ "end": {
+ "offset": 313,
+ "line": 9,
+ "column": 62
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "+",
+ "value": "+",
+ "range": {
+ "start": {
+ "offset": 314,
+ "line": 9,
+ "column": 63
+ },
+ "end": {
+ "offset": 315,
+ "line": 9,
+ "column": 64
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50 ms",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 316,
+ "line": 9,
+ "column": 65
+ },
+ "end": {
+ "offset": 321,
+ "line": 9,
+ "column": 70
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.05
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2IOWaitPulse",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2IOWaitPulse"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 11
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 12
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 13
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 14
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 15
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 16
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 17
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 18
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 19
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ]
+ },
+ "id": 20
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 21
+ },
+ {
+ "time": 0.1,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 22
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 10,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 23
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75,
+ "io.do[1]": true,
+ "io.ao[1]": 0.75,
+ "io.go[1]": 3,
+ "io.do[2]": true
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ },
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ },
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ },
+ {
+ "id": 13,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 14,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 15,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_60_IOWaitPulse-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2IOWaitPulse.mod",
+ "W2IOWaitPulse.ls",
+ "W2IOWaitPulse.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "file": "runtime/W2_70_ControlFlow.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "516fe162d1032f7a3d65c2b632ea10bafb95b10b38ccb15f77db79f86f0aaa7c",
+ "spec_sections": [
+ 14
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 18
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 24
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 26
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 31
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement elseif preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fault preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 12
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement == preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 18
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement true preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 21
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement FAULT preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"fault\" preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 19
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement else preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement NOT_READY preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"not ready\" preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 23
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement retry preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement = preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 1 preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement continue preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 18
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 24
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 26
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 31
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement case preserved as raw IR",
+ "sourceMap": {
+ "line": 26,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 1 preserved as raw IR",
+ "sourceMap": {
+ "line": 26,
+ "column": 12
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement MODE1 preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"mode 1\" preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 21
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement break preserved as raw IR",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement case preserved as raw IR",
+ "sourceMap": {
+ "line": 29,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 2 preserved as raw IR",
+ "sourceMap": {
+ "line": 29,
+ "column": 12
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 9
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 20
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 26
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 28
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 33
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement default preserved as raw IR",
+ "sourceMap": {
+ "line": 31,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 9
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement MODE_OTHER preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"mode other\" preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 26
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628021400-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/compile.json",
+ "controllerJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/controller.json",
+ "motionQueueJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/motion-queue.json",
+ "traceJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/trace.json",
+ "ioJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/io.json",
+ "trajectoryJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/trajectory.json",
+ "postReportJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/post-report.json",
+ "roundtripJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/roundtrip.json",
+ "reportJson": "W2-JOB-20260628021400-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628021400-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2ControlFlow",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 14,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 8,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 8
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ },
+ {
+ "id": "else:0",
+ "variables": {
+ "i": 1
+ }
+ },
+ {
+ "id": "for:3",
+ "variables": {}
+ },
+ {
+ "id": "switch:5",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "NOT_READY",
+ "message": "not ready",
+ "severity": "error",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "time": 0
+ },
+ {
+ "id": "MODE1",
+ "message": "mode 1",
+ "severity": "error",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "time": 0.1
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ControlFlow",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ControlFlow"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 1,
+ "message": "not ready",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "NOT_READY",
+ "severity": "error"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "EXEC_WHILE",
+ "source": {
+ "kind": "EXEC_WHILE",
+ "id": "main:EXEC_WHILE:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "EXEC_FOR",
+ "source": {
+ "kind": "EXEC_FOR",
+ "id": "main:EXEC_FOR:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:23:7",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "EXEC_SWITCH",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "BREAK",
+ "source": {
+ "kind": "BREAK",
+ "id": "main:BREAK:28:9",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "info",
+ "code": "VC_BREAK",
+ "message": "BREAK reached",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ "id": 11
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 7,
+ "message": "mode 1",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "MODE1",
+ "severity": "error"
+ },
+ "id": 12
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "id": 13
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_70_ControlFlow-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ControlFlow",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ControlFlow"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 1,
+ "message": "not ready",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "NOT_READY",
+ "severity": "error"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "EXEC_WHILE",
+ "source": {
+ "kind": "EXEC_WHILE",
+ "id": "main:EXEC_WHILE:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "EXEC_FOR",
+ "source": {
+ "kind": "EXEC_FOR",
+ "id": "main:EXEC_FOR:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:23:7",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "EXEC_SWITCH",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "BREAK",
+ "source": {
+ "kind": "BREAK",
+ "id": "main:BREAK:28:9",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "info",
+ "code": "VC_BREAK",
+ "message": "BREAK reached",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ "id": 11
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 7,
+ "message": "mode 1",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "MODE1",
+ "severity": "error"
+ },
+ "id": 12
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "id": 13
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_70_ControlFlow-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2ControlFlow.mod",
+ "W2ControlFlow.ls",
+ "W2ControlFlow.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "file": "runtime/W2_80_ProcFuncCall.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "701334663d6a215852dbe4c78b3025ebcda5e318513a1e73ab0e6518c49788d5",
+ "spec_sections": [
+ 15
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 18
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 24
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 26
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 31
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628021400-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/compile.json",
+ "controllerJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/controller.json",
+ "motionQueueJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/motion-queue.json",
+ "traceJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/trace.json",
+ "ioJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/io.json",
+ "trajectoryJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/trajectory.json",
+ "postReportJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/post-report.json",
+ "roundtripJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/roundtrip.json",
+ "reportJson": "W2-JOB-20260628021400-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628021400-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2ProcFuncCall",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 9,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 8,
+ "procedureCount": 3,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 5,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 5
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ProcFuncCall",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ProcFuncCall"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call read_part",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "read_part:RAW_STATEMENT:8:5",
+ "sourceMap": {
+ "line": 8,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 3,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "CALL",
+ "id": "main:CALL:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call increment_retry",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 8
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "increment_retry:RAW_STATEMENT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RETURN",
+ "source": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 11
+ }
+ ],
+ "currentSource": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "completed": true
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_80_ProcFuncCall-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ProcFuncCall",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ProcFuncCall"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call read_part",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "read_part:RAW_STATEMENT:8:5",
+ "sourceMap": {
+ "line": 8,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 3,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "CALL",
+ "id": "main:CALL:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call increment_retry",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 8
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "increment_retry:RAW_STATEMENT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RETURN",
+ "source": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 11
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_80_ProcFuncCall-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2ProcFuncCall.mod",
+ "W2ProcFuncCall.ls",
+ "W2ProcFuncCall.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "file": "runtime/W2_90_ExceptionAlarm.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "494455105f84d035ce785747ee5dde77d85db6fb2bd907d1774d1de14e61a6a0",
+ "spec_sections": [
+ 16,
+ 17
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "GRL_P1_UNIMPLEMENTED",
+ "message": "trap recover_trap is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 6,
+ "column": 3
+ }
+ },
+ {
+ "severity": "warning",
+ "code": "GRL_P1_UNIMPLEMENTED",
+ "message": "task background is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 9,
+ "column": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement raise preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement E_PICK_FAILED preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement E_PICK_FAILED preserved as raw IR",
+ "sourceMap": {
+ "line": 17,
+ "column": 11
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement RECOVER preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"recovering\" preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 21
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement severity preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 34
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement warning preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 43
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement CLEANUP preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"cleanup\" preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 21
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628021400-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/compile.json",
+ "controllerJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/controller.json",
+ "motionQueueJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/motion-queue.json",
+ "traceJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/trace.json",
+ "ioJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/io.json",
+ "trajectoryJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/trajectory.json",
+ "postReportJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/post-report.json",
+ "roundtripJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/roundtrip.json",
+ "reportJson": "W2-JOB-20260628021400-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628021400-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2ExceptionAlarm",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 5,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 6,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 5,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 5
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "START",
+ "message": "start",
+ "severity": "info",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "time": 0
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExceptionAlarm",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExceptionAlarm"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "start",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "START",
+ "severity": "info"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "enable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ }
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:23:5",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "disable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ }
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 10
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_90_ExceptionAlarm-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExceptionAlarm",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExceptionAlarm"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "start",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "START",
+ "severity": "info"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "enable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ }
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:23:5",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "disable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ }
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 10
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_90_ExceptionAlarm-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2ExceptionAlarm.mod",
+ "W2ExceptionAlarm.ls",
+ "W2ExceptionAlarm.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "file": "static/W2_E10_ExpressionDiagnostics.grl",
+ "coverage_level": "Static",
+ "expected_status": "diagnostic",
+ "status": "diagnostic",
+ "input_hash": "c08db186d16a8bc3f0ecb4731abb6601d8c69348fd08ca6b21b8848f32df2347",
+ "spec_sections": [
+ 7,
+ 22
+ ],
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_SYMBOL",
+ "message": "Unknown constant missing_symbol",
+ "sourceMap": {
+ "line": 4,
+ "column": 41
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628021400-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/compile.json",
+ "controllerJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/controller.json",
+ "motionQueueJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/motion-queue.json",
+ "traceJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/trace.json",
+ "ioJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/io.json",
+ "trajectoryJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/trajectory.json",
+ "postReportJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/post-report.json",
+ "roundtripJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/roundtrip.json",
+ "reportJson": "W2-JOB-20260628021400-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628021400-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "file": "static/W2_E20_SemanticDiagnostics.grl",
+ "coverage_level": "Static",
+ "expected_status": "diagnostic",
+ "status": "diagnostic",
+ "input_hash": "98750f73027e3272a3f1e86f90ea6066d67387e7ffef190441893fff38012ed5",
+ "spec_sections": [
+ 6,
+ 15,
+ 22
+ ],
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "GRL_ARGUMENT_NOT_LVALUE",
+ "message": "out argument done must be a writable lvalue",
+ "sourceMap": {
+ "line": 15,
+ "column": 19
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_SYMBOL_DUPLICATE",
+ "message": "Duplicate symbol v",
+ "sourceMap": {
+ "line": 4,
+ "column": 3
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628021400-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/compile.json",
+ "controllerJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/controller.json",
+ "motionQueueJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/motion-queue.json",
+ "traceJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/trace.json",
+ "ioJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/io.json",
+ "trajectoryJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/trajectory.json",
+ "postReportJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/post-report.json",
+ "roundtripJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/roundtrip.json",
+ "reportJson": "W2-JOB-20260628021400-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628021400-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+ }
+ },
+ {
+ "program_id": "W2_E30_MotionDiagnostics",
+ "file": "error/W2_E30_MotionDiagnostics.grl",
+ "coverage_level": "Static",
+ "expected_status": "diagnostic",
+ "status": "diagnostic",
+ "input_hash": "19f8c9f8a1ba6f6cfa8dde62207f8ee1797267e9addf7bbdbfbe941d8734b543",
+ "spec_sections": [
+ 8,
+ 9,
+ 10,
+ 11,
+ 22
+ ],
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "GRL_PATH_EMPTY",
+ "message": "Path empty_path must contain at least one point"
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628021400-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/compile.json",
+ "controllerJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/controller.json",
+ "motionQueueJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/motion-queue.json",
+ "traceJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/trace.json",
+ "ioJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/io.json",
+ "trajectoryJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/trajectory.json",
+ "postReportJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/post-report.json",
+ "roundtripJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/roundtrip.json",
+ "reportJson": "W2-JOB-20260628021400-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628021400-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "file": "static/W2_E40_ControlFlowDiagnostics.grl",
+ "coverage_level": "Static",
+ "expected_status": "diagnostic",
+ "status": "diagnostic",
+ "input_hash": "3ba920eda8d0932b260b9875ce395803d55ebb6a48ecb3c8857b2a4ef1478fea",
+ "spec_sections": [
+ 14,
+ 22
+ ],
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628021400-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/compile.json",
+ "controllerJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/controller.json",
+ "motionQueueJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json",
+ "traceJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/trace.json",
+ "ioJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/io.json",
+ "trajectoryJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/trajectory.json",
+ "postReportJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/post-report.json",
+ "roundtripJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json",
+ "reportJson": "W2-JOB-20260628021400-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628021400-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+ }
+ },
+ {
+ "program_id": "W2_E50_RuntimeTimeout",
+ "file": "error/W2_E50_RuntimeTimeout.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "diagnostic",
+ "status": "pass",
+ "input_hash": "2d5b41bef4b80c8a22f48697abe3b1a335779f439741f52376388091d8ea4fb6",
+ "spec_sections": [
+ 13,
+ 16
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628021400-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/compile.json",
+ "controllerJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/controller.json",
+ "motionQueueJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/motion-queue.json",
+ "traceJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/trace.json",
+ "ioJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/io.json",
+ "trajectoryJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/trajectory.json",
+ "postReportJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/post-report.json",
+ "roundtripJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/roundtrip.json",
+ "reportJson": "W2-JOB-20260628021400-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628021400-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2RuntimeTimeout",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 5,
+ "procedureCount": 2,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "running",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:0": 0,
+ "$wait:main:1": 0.1
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "DI99 timeout",
+ "message": "DI99 timeout",
+ "severity": "warning",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "time": 0.1
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2RuntimeTimeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2RuntimeTimeout"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 4
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "timeout",
+ "elapsed": 0.1
+ },
+ "id": 5
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "DI99 timeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "DI99 timeout",
+ "severity": "warning"
+ },
+ "id": 6
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 8
+ }
+ ],
+ "currentSource": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "completed": false
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": false,
+ "io.di[6]": true,
+ "io.di[7]": false,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "scripts": []
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2RuntimeTimeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2RuntimeTimeout"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 4
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "timeout",
+ "elapsed": 0.1
+ },
+ "id": 5
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "DI99 timeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "DI99 timeout",
+ "severity": "warning"
+ },
+ "id": 6
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 8
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": false,
+ "io.di[6]": true,
+ "io.di[7]": false,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "scripts": []
+ },
+ "trajectory": {
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2RuntimeTimeout.mod",
+ "W2RuntimeTimeout.ls",
+ "W2RuntimeTimeout.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "file": "post/W2_P10_BrandHints.grl",
+ "coverage_level": "Post",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "0b0b7f523d6afa37eb7b33db69fc8dc8eef910799030e24a13b87344bb0a7f80",
+ "spec_sections": [
+ 18,
+ 20
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint fanuc ignored for abb",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint kuka ignored for abb",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint kuka ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint fanuc ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2BrandHints.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628021400-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/compile.json",
+ "controllerJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/controller.json",
+ "motionQueueJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/motion-queue.json",
+ "traceJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/trace.json",
+ "ioJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/io.json",
+ "trajectoryJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/trajectory.json",
+ "postReportJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/post-report.json",
+ "roundtripJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/roundtrip.json",
+ "reportJson": "W2-JOB-20260628021400-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628021400-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2BrandHints",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 1,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 7,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "post": {
+ "filenames": [
+ "W2BrandHints.mod",
+ "W2BrandHints.ls",
+ "W2BrandHints.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint fanuc ignored for abb",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint kuka ignored for abb",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint kuka ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for kuka",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint fanuc ignored for kuka",
+ "brand": "kuka"
+ }
+ ]
+ },
+ "roundtrip": {
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2BrandHints.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "file": "post/W2_P20_CrossBrandMotion.grl",
+ "coverage_level": "Post",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "25574be5f4073c18281213d73b72e386f93b1ec57fe21490a9097f8050ce68eb",
+ "spec_sections": [
+ 20
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2CrossBrandMotion.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628021400-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/compile.json",
+ "controllerJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/controller.json",
+ "motionQueueJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/motion-queue.json",
+ "traceJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/trace.json",
+ "ioJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/io.json",
+ "trajectoryJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/trajectory.json",
+ "postReportJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/post-report.json",
+ "roundtripJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/roundtrip.json",
+ "reportJson": "W2-JOB-20260628021400-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628021400-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2CrossBrandMotion",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 6,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 10,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "post": {
+ "filenames": [
+ "W2CrossBrandMotion.mod",
+ "W2CrossBrandMotion.ls",
+ "W2CrossBrandMotion.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for kuka",
+ "brand": "kuka"
+ }
+ ]
+ },
+ "roundtrip": {
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2CrossBrandMotion.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "file": "post/W2_P30_Roundtrip.grl",
+ "coverage_level": "Post",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "ffef36ecf9e77bceff45b3438905861f7007365b608525e14f18561e58d2e6cf",
+ "spec_sections": [
+ 19,
+ 20,
+ 21
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2Roundtrip.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628021400-19b5a2c7/job.json",
+ "compileJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/compile.json",
+ "controllerJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/controller.json",
+ "motionQueueJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/motion-queue.json",
+ "traceJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/trace.json",
+ "ioJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/io.json",
+ "trajectoryJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/trajectory.json",
+ "postReportJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/post-report.json",
+ "roundtripJson": "W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/roundtrip.json",
+ "reportJson": "W2-JOB-20260628021400-19b5a2c7/report.json",
+ "reportHtml": "W2-JOB-20260628021400-19b5a2c7/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2Roundtrip",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 1,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 1
+ },
+ "post": {
+ "filenames": [
+ "W2Roundtrip.mod",
+ "W2Roundtrip.ls",
+ "W2Roundtrip.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ },
+ "roundtrip": {
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2Roundtrip.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+ }
+ }
+ ],
+ "artifacts": {
+ "root": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7",
+ "manifestJson": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/manifest.json",
+ "jobJson": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/job.json",
+ "reportJson": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/report.json",
+ "reportHtml": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/report.html",
+ "desktopScreenshot": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/screenshots/virtual-controller-desktop.png",
+ "mobileScreenshot": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/screenshots/virtual-controller-mobile.png",
+ "uiEvidenceJson": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/screenshots/evidence.json"
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/manifest.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/manifest.json
new file mode 100644
index 0000000..a7cfae3
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/manifest.json
@@ -0,0 +1,440 @@
+{
+ "suite_id": "working2-abb120-spec",
+ "robot_id": "abb_irb120_3_58",
+ "spec_source": "work/doc/通用机器人编程语法规范.md",
+ "program_root": "kdl-wasm/web/tests/fixtures/abb120/spec-programs",
+ "runtime_commands": [
+ "loadProgram",
+ "start",
+ "stepInto",
+ "hold",
+ "resume",
+ "stepMotion",
+ "stop",
+ "resetFault"
+ ],
+ "programs": [
+ {
+ "program_id": "W2_00_MinimalModule",
+ "file": "runtime/W2_00_MinimalModule.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 4,
+ 5,
+ 6,
+ 9,
+ 10,
+ 23
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "file": "runtime/W2_10_DataTargetToolFrame.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 6,
+ 8,
+ 9
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_20_ExpressionMath",
+ "file": "runtime/W2_20_ExpressionMath.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 7,
+ 9,
+ 13
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "file": "runtime/W2_30_MotionAllTypes.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 8,
+ 9,
+ 10
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_40_PathEvents",
+ "file": "runtime/W2_40_PathEvents.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 11,
+ 13,
+ 19
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_50_OperationProcess",
+ "file": "runtime/W2_50_OperationProcess.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 12,
+ 13
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_60_IOWaitPulse",
+ "file": "runtime/W2_60_IOWaitPulse.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 13
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "file": "runtime/W2_70_ControlFlow.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 14
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "file": "runtime/W2_80_ProcFuncCall.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 15
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "file": "runtime/W2_90_ExceptionAlarm.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 16,
+ 17
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": [
+ "GRL_P1_UNIMPLEMENTED"
+ ]
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "file": "static/W2_E10_ExpressionDiagnostics.grl",
+ "coverage_level": "Static",
+ "spec_sections": [
+ 7,
+ 22
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "GRL_EXPR_UNKNOWN_SYMBOL",
+ "GRL_EXPR_UNKNOWN_FUNCTION",
+ "GRL_EXPR_ARITY",
+ "GRL_EXPR_DOMAIN",
+ "GRL_EXPR_DIV_ZERO",
+ "GRL_EXPR_UNIT_MISMATCH"
+ ]
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "file": "static/W2_E20_SemanticDiagnostics.grl",
+ "coverage_level": "Static",
+ "spec_sections": [
+ 6,
+ 15,
+ 22
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "GRL_SYMBOL_DUPLICATE",
+ "GRL_ARGUMENT_NOT_LVALUE",
+ "GRL_CALL_TARGET_NOT_FOUND",
+ "GRL_FUNC_SIDE_EFFECT",
+ "GRL_TARGET_NOT_FOUND"
+ ]
+ },
+ {
+ "program_id": "W2_E30_MotionDiagnostics",
+ "file": "error/W2_E30_MotionDiagnostics.grl",
+ "coverage_level": "Static",
+ "spec_sections": [
+ 8,
+ 9,
+ 10,
+ 11,
+ 22
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "KDL_JOINT_LIMIT",
+ "KDL_TARGET_UNREACHABLE",
+ "GRL_PATH_EMPTY"
+ ]
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "file": "static/W2_E40_ControlFlowDiagnostics.grl",
+ "coverage_level": "Static",
+ "spec_sections": [
+ 14,
+ 22
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "GRL_BREAK_OUTSIDE_FLOW",
+ "GRL_CONTINUE_OUTSIDE_LOOP",
+ "GRL_JUMP_INTO_BLOCK",
+ "GRL_SWITCH_CASE_DUPLICATE",
+ "GRL_SWITCH_CASE_NOT_CONSTANT",
+ "GRL_LABEL_NOT_FOUND"
+ ]
+ },
+ {
+ "program_id": "W2_E50_RuntimeTimeout",
+ "file": "error/W2_E50_RuntimeTimeout.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 13,
+ 16
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "VC_WAIT_TIMEOUT"
+ ]
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "file": "post/W2_P10_BrandHints.grl",
+ "coverage_level": "Post",
+ "spec_sections": [
+ 18,
+ 20
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": [
+ "GRL_POST_HINT_IGNORED"
+ ]
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "file": "post/W2_P20_CrossBrandMotion.grl",
+ "coverage_level": "Post",
+ "spec_sections": [
+ 20
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "file": "post/W2_P30_Roundtrip.grl",
+ "coverage_level": "Post",
+ "spec_sections": [
+ 19,
+ 20,
+ 21
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ }
+ ],
+ "coverage_matrix": [
+ {
+ "spec_section": 4,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_00_MinimalModule"
+ ]
+ },
+ {
+ "spec_section": 5,
+ "coverage_level": "Runtime",
+ "program_ids": [
+ "W2_00_MinimalModule"
+ ]
+ },
+ {
+ "spec_section": 6,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_10_DataTargetToolFrame",
+ "W2_E20_SemanticDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 7,
+ "coverage_level": "Runtime/Static/Post",
+ "program_ids": [
+ "W2_20_ExpressionMath",
+ "W2_E10_ExpressionDiagnostics",
+ "W2_P20_CrossBrandMotion"
+ ]
+ },
+ {
+ "spec_section": 8,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_10_DataTargetToolFrame",
+ "W2_E30_MotionDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 9,
+ "coverage_level": "Runtime/Post",
+ "program_ids": [
+ "W2_20_ExpressionMath",
+ "W2_30_MotionAllTypes",
+ "W2_P20_CrossBrandMotion"
+ ]
+ },
+ {
+ "spec_section": 10,
+ "coverage_level": "Runtime/Static/Post",
+ "program_ids": [
+ "W2_30_MotionAllTypes",
+ "W2_E30_MotionDiagnostics",
+ "W2_P20_CrossBrandMotion"
+ ]
+ },
+ {
+ "spec_section": 11,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_40_PathEvents",
+ "W2_E30_MotionDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 12,
+ "coverage_level": "Runtime/Post",
+ "program_ids": [
+ "W2_50_OperationProcess",
+ "W2_P30_Roundtrip"
+ ]
+ },
+ {
+ "spec_section": 13,
+ "coverage_level": "Runtime",
+ "program_ids": [
+ "W2_60_IOWaitPulse",
+ "W2_E50_RuntimeTimeout"
+ ]
+ },
+ {
+ "spec_section": 14,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_70_ControlFlow",
+ "W2_E40_ControlFlowDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 15,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_80_ProcFuncCall",
+ "W2_E20_SemanticDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 16,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_90_ExceptionAlarm",
+ "W2_E50_RuntimeTimeout"
+ ]
+ },
+ {
+ "spec_section": 17,
+ "coverage_level": "Static",
+ "program_ids": [
+ "W2_90_ExceptionAlarm"
+ ]
+ },
+ {
+ "spec_section": 18,
+ "coverage_level": "Post",
+ "program_ids": [
+ "W2_P10_BrandHints"
+ ]
+ },
+ {
+ "spec_section": 19,
+ "coverage_level": "Post",
+ "program_ids": [
+ "W2_P30_Roundtrip"
+ ]
+ },
+ {
+ "spec_section": 20,
+ "coverage_level": "Post",
+ "program_ids": [
+ "W2_P20_CrossBrandMotion"
+ ]
+ },
+ {
+ "spec_section": 21,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_00_MinimalModule",
+ "W2_E10_ExpressionDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 22,
+ "coverage_level": "Static",
+ "program_ids": [
+ "W2_E10_ExpressionDiagnostics",
+ "W2_E20_SemanticDiagnostics",
+ "W2_E30_MotionDiagnostics",
+ "W2_E40_ControlFlowDiagnostics",
+ "W2_E50_RuntimeTimeout"
+ ]
+ },
+ {
+ "spec_section": 23,
+ "coverage_level": "Static",
+ "program_ids": [
+ "W2_00_MinimalModule"
+ ]
+ },
+ {
+ "spec_section": 24,
+ "coverage_level": "Runtime",
+ "program_ids": [
+ "W2_P30_Roundtrip"
+ ]
+ },
+ {
+ "spec_section": 25,
+ "coverage_level": "Runtime/Static/Post",
+ "program_ids": [
+ "W2_00_MinimalModule",
+ "W2_10_DataTargetToolFrame",
+ "W2_20_ExpressionMath",
+ "W2_30_MotionAllTypes",
+ "W2_40_PathEvents",
+ "W2_50_OperationProcess",
+ "W2_60_IOWaitPulse",
+ "W2_70_ControlFlow",
+ "W2_80_ProcFuncCall",
+ "W2_90_ExceptionAlarm",
+ "W2_P20_CrossBrandMotion"
+ ]
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/compile.json
new file mode 100644
index 0000000..b21d4dd
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2MinimalModule",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 1,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 4,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/controller.json
new file mode 100644
index 0000000..eb27052
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/controller.json
@@ -0,0 +1,455 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MinimalModule",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MinimalModule"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_00_MinimalModule-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/io.json
new file mode 100644
index 0000000..a9a6139
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_00_MinimalModule-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/motion-queue.json
new file mode 100644
index 0000000..4c4fa93
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/motion-queue.json
@@ -0,0 +1,82 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/post-report.json
new file mode 100644
index 0000000..2b435af
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2MinimalModule.mod",
+ "W2MinimalModule.ls",
+ "W2MinimalModule.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/trace.json
new file mode 100644
index 0000000..b260ea8
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/trace.json
@@ -0,0 +1,72 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MinimalModule",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MinimalModule"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/trajectory.json
new file mode 100644
index 0000000..6f9d002
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/compile.json
new file mode 100644
index 0000000..a66b72a
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2DataTargetToolFrame",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 19,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/controller.json
new file mode 100644
index 0000000..4677666
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/controller.json
@@ -0,0 +1,872 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2DataTargetToolFrame",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2DataTargetToolFrame"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_10_DataTargetToolFrame-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/io.json
new file mode 100644
index 0000000..4c885c5
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_10_DataTargetToolFrame-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/motion-queue.json
new file mode 100644
index 0000000..ffd4169
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/motion-queue.json
@@ -0,0 +1,416 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/post-report.json
new file mode 100644
index 0000000..62c1345
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2DataTargetToolFrame.mod",
+ "W2DataTargetToolFrame.ls",
+ "W2DataTargetToolFrame.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/trace.json
new file mode 100644
index 0000000..eddbe65
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/trace.json
@@ -0,0 +1,155 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2DataTargetToolFrame",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2DataTargetToolFrame"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/trajectory.json
new file mode 100644
index 0000000..cfea046
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.5,
+ 0.03,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/compile.json
new file mode 100644
index 0000000..2f9bd02
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2ExpressionMath",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 2,
+ "kdlPathRequests": 0,
+ "symbolCount": 9,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/controller.json
new file mode 100644
index 0000000..237450e
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/controller.json
@@ -0,0 +1,631 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:2": 0
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExpressionMath",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExpressionMath"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_20_ExpressionMath-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/io.json
new file mode 100644
index 0000000..f239c92
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_20_ExpressionMath-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/motion-queue.json
new file mode 100644
index 0000000..cb5539e
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/motion-queue.json
@@ -0,0 +1,172 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/post-report.json
new file mode 100644
index 0000000..b9a1299
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2ExpressionMath.mod",
+ "W2ExpressionMath.ls",
+ "W2ExpressionMath.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/trace.json
new file mode 100644
index 0000000..d834175
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/trace.json
@@ -0,0 +1,156 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExpressionMath",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExpressionMath"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/trajectory.json
new file mode 100644
index 0000000..d1691a1
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 8,
+ "duration": 0.48,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.45,
+ 0.04,
+ -0.2,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/compile.json
new file mode 100644
index 0000000..0a93c5d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2MotionAllTypes",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 10,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/controller.json
new file mode 100644
index 0000000..3123338
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/controller.json
@@ -0,0 +1,936 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MotionAllTypes",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MotionAllTypes"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_30_MotionAllTypes-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/io.json
new file mode 100644
index 0000000..498441f
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_30_MotionAllTypes-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/motion-queue.json
new file mode 100644
index 0000000..b627627
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/motion-queue.json
@@ -0,0 +1,480 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/post-report.json
new file mode 100644
index 0000000..3634288
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2MotionAllTypes.mod",
+ "W2MotionAllTypes.ls",
+ "W2MotionAllTypes.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/trace.json
new file mode 100644
index 0000000..5fac72a
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/trace.json
@@ -0,0 +1,155 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MotionAllTypes",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MotionAllTypes"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/trajectory.json
new file mode 100644
index 0000000..431e931
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.6,
+ 0,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/compile.json
new file mode 100644
index 0000000..5e98362
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2PathEvents",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 7,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/controller.json
new file mode 100644
index 0000000..f80f32e
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/controller.json
@@ -0,0 +1,1106 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2PathEvents",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2PathEvents"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "generated_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "generated_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "generated_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p_home",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_pick",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0.20000000169966334,
+ -0.3500000029744108,
+ 0.4500000038242425,
+ 0.10000000084983167,
+ -0.20000000169966334,
+ 0.300000002549495
+ ],
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_place",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.1500000012747475,
+ -0.4000000033993267
+ ],
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "before",
+ "pointId": "p_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 17,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 10 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 703,
+ "line": 17,
+ "column": 25
+ },
+ "end": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ },
+ "end": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ },
+ "end": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ },
+ "end": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ },
+ "end": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ },
+ "end": {
+ "offset": 712,
+ "line": 17,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 713,
+ "line": 17,
+ "column": 35
+ },
+ "end": {
+ "offset": 714,
+ "line": 17,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 715,
+ "line": 17,
+ "column": 37
+ },
+ "end": {
+ "offset": 719,
+ "line": 17,
+ "column": 41
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "p_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 19,
+ "column": 24
+ },
+ "data": {
+ "statement": "wait io . di [ 10 ] == true timeout 2 s on_timeout alarm \"pick sensor timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 780,
+ "line": 19,
+ "column": 24
+ },
+ "end": {
+ "offset": 784,
+ "line": 19,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 785,
+ "line": 19,
+ "column": 29
+ },
+ "end": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ },
+ "end": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ },
+ "end": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ },
+ "end": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ },
+ "end": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ },
+ "end": {
+ "offset": 794,
+ "line": 19,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 795,
+ "line": 19,
+ "column": 39
+ },
+ "end": {
+ "offset": 797,
+ "line": 19,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 798,
+ "line": 19,
+ "column": 42
+ },
+ "end": {
+ "offset": 802,
+ "line": 19,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 803,
+ "line": 19,
+ "column": 47
+ },
+ "end": {
+ "offset": 810,
+ "line": 19,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 811,
+ "line": 19,
+ "column": 55
+ },
+ "end": {
+ "offset": 814,
+ "line": 19,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 815,
+ "line": 19,
+ "column": 59
+ },
+ "end": {
+ "offset": 825,
+ "line": 19,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 826,
+ "line": 19,
+ "column": 70
+ },
+ "end": {
+ "offset": 831,
+ "line": 19,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"pick sensor timeout\"",
+ "value": "pick sensor timeout",
+ "range": {
+ "start": {
+ "offset": 832,
+ "line": 19,
+ "column": 76
+ },
+ "end": {
+ "offset": 853,
+ "line": 19,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_2",
+ "timing": "at",
+ "pointId": "p_place",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 21,
+ "column": 37
+ },
+ "data": {
+ "statement": "pulse io . do [ 11 ] duration 100 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 929,
+ "line": 21,
+ "column": 37
+ },
+ "end": {
+ "offset": 934,
+ "line": 21,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 935,
+ "line": 21,
+ "column": 43
+ },
+ "end": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ },
+ "end": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ },
+ "end": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ },
+ "end": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "11",
+ "value": 11,
+ "range": {
+ "start": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ },
+ "end": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ },
+ "end": {
+ "offset": 944,
+ "line": 21,
+ "column": 52
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 945,
+ "line": 21,
+ "column": 53
+ },
+ "end": {
+ "offset": 953,
+ "line": 21,
+ "column": 61
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "100 ms",
+ "value": 100,
+ "range": {
+ "start": {
+ "offset": 954,
+ "line": 21,
+ "column": 62
+ },
+ "end": {
+ "offset": 960,
+ "line": 21,
+ "column": 68
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.1
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_40_PathEvents-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "generated_path"
+ ],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/io.json
new file mode 100644
index 0000000..2d8957a
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_40_PathEvents-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/motion-queue.json
new file mode 100644
index 0000000..7fbb840
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/motion-queue.json
@@ -0,0 +1,731 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "generated_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "generated_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "generated_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p_home",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_pick",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0.20000000169966334,
+ -0.3500000029744108,
+ 0.4500000038242425,
+ 0.10000000084983167,
+ -0.20000000169966334,
+ 0.300000002549495
+ ],
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_place",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.1500000012747475,
+ -0.4000000033993267
+ ],
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "before",
+ "pointId": "p_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 17,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 10 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 703,
+ "line": 17,
+ "column": 25
+ },
+ "end": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ },
+ "end": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ },
+ "end": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ },
+ "end": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ },
+ "end": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ },
+ "end": {
+ "offset": 712,
+ "line": 17,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 713,
+ "line": 17,
+ "column": 35
+ },
+ "end": {
+ "offset": 714,
+ "line": 17,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 715,
+ "line": 17,
+ "column": 37
+ },
+ "end": {
+ "offset": 719,
+ "line": 17,
+ "column": 41
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "p_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 19,
+ "column": 24
+ },
+ "data": {
+ "statement": "wait io . di [ 10 ] == true timeout 2 s on_timeout alarm \"pick sensor timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 780,
+ "line": 19,
+ "column": 24
+ },
+ "end": {
+ "offset": 784,
+ "line": 19,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 785,
+ "line": 19,
+ "column": 29
+ },
+ "end": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ },
+ "end": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ },
+ "end": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ },
+ "end": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ },
+ "end": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ },
+ "end": {
+ "offset": 794,
+ "line": 19,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 795,
+ "line": 19,
+ "column": 39
+ },
+ "end": {
+ "offset": 797,
+ "line": 19,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 798,
+ "line": 19,
+ "column": 42
+ },
+ "end": {
+ "offset": 802,
+ "line": 19,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 803,
+ "line": 19,
+ "column": 47
+ },
+ "end": {
+ "offset": 810,
+ "line": 19,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 811,
+ "line": 19,
+ "column": 55
+ },
+ "end": {
+ "offset": 814,
+ "line": 19,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 815,
+ "line": 19,
+ "column": 59
+ },
+ "end": {
+ "offset": 825,
+ "line": 19,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 826,
+ "line": 19,
+ "column": 70
+ },
+ "end": {
+ "offset": 831,
+ "line": 19,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"pick sensor timeout\"",
+ "value": "pick sensor timeout",
+ "range": {
+ "start": {
+ "offset": 832,
+ "line": 19,
+ "column": 76
+ },
+ "end": {
+ "offset": 853,
+ "line": 19,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_2",
+ "timing": "at",
+ "pointId": "p_place",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 21,
+ "column": 37
+ },
+ "data": {
+ "statement": "pulse io . do [ 11 ] duration 100 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 929,
+ "line": 21,
+ "column": 37
+ },
+ "end": {
+ "offset": 934,
+ "line": 21,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 935,
+ "line": 21,
+ "column": 43
+ },
+ "end": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ },
+ "end": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ },
+ "end": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ },
+ "end": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "11",
+ "value": 11,
+ "range": {
+ "start": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ },
+ "end": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ },
+ "end": {
+ "offset": 944,
+ "line": 21,
+ "column": 52
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 945,
+ "line": 21,
+ "column": 53
+ },
+ "end": {
+ "offset": 953,
+ "line": 21,
+ "column": 61
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "100 ms",
+ "value": 100,
+ "range": {
+ "start": {
+ "offset": 954,
+ "line": 21,
+ "column": 62
+ },
+ "end": {
+ "offset": 960,
+ "line": 21,
+ "column": 68
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.1
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/post-report.json
new file mode 100644
index 0000000..1799726
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/post-report.json
@@ -0,0 +1,27 @@
+{
+ "filenames": [
+ "W2PathEvents.mod",
+ "W2PathEvents.ls",
+ "W2PathEvents.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/trace.json
new file mode 100644
index 0000000..74a552c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/trace.json
@@ -0,0 +1,72 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2PathEvents",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2PathEvents"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/trajectory.json
new file mode 100644
index 0000000..8c6de8c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.15000000127474747,
+ -0.4000000033993266
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/compile.json
new file mode 100644
index 0000000..4ad1d93
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2OperationProcess",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 6,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/controller.json
new file mode 100644
index 0000000..6520e77
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/controller.json
@@ -0,0 +1,500 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2OperationProcess",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2OperationProcess"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "start_action",
+ "statement": "io . do [ 1 ] = true",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "op_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "op_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "op_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "end_action",
+ "statement": "io . do [ 1 ] = false",
+ "sourceMap": {
+ "line": 21,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_50_OperationProcess-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "op_path"
+ ],
+ "operationIds": [
+ "pick_op"
+ ],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/io.json
new file mode 100644
index 0000000..67ae792
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_50_OperationProcess-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/motion-queue.json
new file mode 100644
index 0000000..6b8ce58
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/motion-queue.json
@@ -0,0 +1,123 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "start_action",
+ "statement": "io . do [ 1 ] = true",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "op_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "op_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "op_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "end_action",
+ "statement": "io . do [ 1 ] = false",
+ "sourceMap": {
+ "line": 21,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/post-report.json
new file mode 100644
index 0000000..b22568b
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/post-report.json
@@ -0,0 +1,27 @@
+{
+ "filenames": [
+ "W2OperationProcess.mod",
+ "W2OperationProcess.ls",
+ "W2OperationProcess.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/trace.json
new file mode 100644
index 0000000..e16ed9a
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/trace.json
@@ -0,0 +1,72 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2OperationProcess",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2OperationProcess"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/trajectory.json
new file mode 100644
index 0000000..6f9d002
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/compile.json
new file mode 100644
index 0000000..a051026
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2IOWaitPulse",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 12,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 5,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/controller.json
new file mode 100644
index 0000000..63159c3
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/controller.json
@@ -0,0 +1,1139 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 10,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 10
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:3": 0,
+ "$wait:main:4": 0,
+ "$wait:main:5": 0.1,
+ "$wait:main:6": 0.1,
+ "$wait:main:7": 0.1
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2IOWaitPulse",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2IOWaitPulse"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 11
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 12
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 13
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 14
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 15
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 16
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 17
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 18
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 19
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ]
+ },
+ "id": 20
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 21
+ },
+ {
+ "time": 0.1,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 22
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 10,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 23
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "io_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "io_path",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "io_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "at",
+ "pointId": "p0",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 9,
+ "column": 35
+ },
+ "data": {
+ "statement": "pulse io . do [ 20 ] duration 50 + 50 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 286,
+ "line": 9,
+ "column": 35
+ },
+ "end": {
+ "offset": 291,
+ "line": 9,
+ "column": 40
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 292,
+ "line": 9,
+ "column": 41
+ },
+ "end": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ },
+ "end": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ },
+ "end": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ },
+ "end": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "20",
+ "value": 20,
+ "range": {
+ "start": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ },
+ "end": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ },
+ "end": {
+ "offset": 301,
+ "line": 9,
+ "column": 50
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 302,
+ "line": 9,
+ "column": 51
+ },
+ "end": {
+ "offset": 310,
+ "line": 9,
+ "column": 59
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 311,
+ "line": 9,
+ "column": 60
+ },
+ "end": {
+ "offset": 313,
+ "line": 9,
+ "column": 62
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "+",
+ "value": "+",
+ "range": {
+ "start": {
+ "offset": 314,
+ "line": 9,
+ "column": 63
+ },
+ "end": {
+ "offset": 315,
+ "line": 9,
+ "column": 64
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50 ms",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 316,
+ "line": 9,
+ "column": 65
+ },
+ "end": {
+ "offset": 321,
+ "line": 9,
+ "column": 70
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.05
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75,
+ "io.do[1]": true,
+ "io.ao[1]": 0.75,
+ "io.go[1]": 3,
+ "io.do[2]": true
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ },
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ },
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ },
+ {
+ "id": 13,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 14,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 15,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_60_IOWaitPulse-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "io_path"
+ ],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/io.json
new file mode 100644
index 0000000..20e3541
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/io.json
@@ -0,0 +1,253 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75,
+ "io.do[1]": true,
+ "io.ao[1]": 0.75,
+ "io.go[1]": 3,
+ "io.do[2]": true
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ },
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ },
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ },
+ {
+ "id": 13,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 14,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 15,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_60_IOWaitPulse-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/motion-queue.json
new file mode 100644
index 0000000..f9168f2
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/motion-queue.json
@@ -0,0 +1,279 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "io_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "io_path",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "io_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "at",
+ "pointId": "p0",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 9,
+ "column": 35
+ },
+ "data": {
+ "statement": "pulse io . do [ 20 ] duration 50 + 50 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 286,
+ "line": 9,
+ "column": 35
+ },
+ "end": {
+ "offset": 291,
+ "line": 9,
+ "column": 40
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 292,
+ "line": 9,
+ "column": 41
+ },
+ "end": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ },
+ "end": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ },
+ "end": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ },
+ "end": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "20",
+ "value": 20,
+ "range": {
+ "start": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ },
+ "end": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ },
+ "end": {
+ "offset": 301,
+ "line": 9,
+ "column": 50
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 302,
+ "line": 9,
+ "column": 51
+ },
+ "end": {
+ "offset": 310,
+ "line": 9,
+ "column": 59
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 311,
+ "line": 9,
+ "column": 60
+ },
+ "end": {
+ "offset": 313,
+ "line": 9,
+ "column": 62
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "+",
+ "value": "+",
+ "range": {
+ "start": {
+ "offset": 314,
+ "line": 9,
+ "column": 63
+ },
+ "end": {
+ "offset": 315,
+ "line": 9,
+ "column": 64
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50 ms",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 316,
+ "line": 9,
+ "column": 65
+ },
+ "end": {
+ "offset": 321,
+ "line": 9,
+ "column": 70
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.05
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/post-report.json
new file mode 100644
index 0000000..ae4ab05
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/post-report.json
@@ -0,0 +1,27 @@
+{
+ "filenames": [
+ "W2IOWaitPulse.mod",
+ "W2IOWaitPulse.ls",
+ "W2IOWaitPulse.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/trace.json
new file mode 100644
index 0000000..41e0322
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/trace.json
@@ -0,0 +1,493 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2IOWaitPulse",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2IOWaitPulse"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 11
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 12
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 13
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 14
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 15
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 16
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 17
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 18
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 19
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ]
+ },
+ "id": 20
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 21
+ },
+ {
+ "time": 0.1,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 22
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 10,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 23
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/trajectory.json
new file mode 100644
index 0000000..6f9d002
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/compile.json
new file mode 100644
index 0000000..28b7c9c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2ControlFlow",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 14,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/controller.json
new file mode 100644
index 0000000..5c3d7e6
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/controller.json
@@ -0,0 +1,610 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 8,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 8
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ },
+ {
+ "id": "else:0",
+ "variables": {
+ "i": 1
+ }
+ },
+ {
+ "id": "for:3",
+ "variables": {}
+ },
+ {
+ "id": "switch:5",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "NOT_READY",
+ "message": "not ready",
+ "severity": "error",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "time": 0
+ },
+ {
+ "id": "MODE1",
+ "message": "mode 1",
+ "severity": "error",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "time": 0.1
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ControlFlow",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ControlFlow"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 1,
+ "message": "not ready",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "NOT_READY",
+ "severity": "error"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "EXEC_WHILE",
+ "source": {
+ "kind": "EXEC_WHILE",
+ "id": "main:EXEC_WHILE:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "EXEC_FOR",
+ "source": {
+ "kind": "EXEC_FOR",
+ "id": "main:EXEC_FOR:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:23:7",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "EXEC_SWITCH",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "BREAK",
+ "source": {
+ "kind": "BREAK",
+ "id": "main:BREAK:28:9",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "info",
+ "code": "VC_BREAK",
+ "message": "BREAK reached",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ "id": 11
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 7,
+ "message": "mode 1",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "MODE1",
+ "severity": "error"
+ },
+ "id": 12
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "id": 13
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_70_ControlFlow-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/io.json
new file mode 100644
index 0000000..67c50b6
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_70_ControlFlow-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/motion-queue.json
new file mode 100644
index 0000000..57085bb
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/motion-queue.json
@@ -0,0 +1,5 @@
+{
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/post-report.json
new file mode 100644
index 0000000..4e58295
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/post-report.json
@@ -0,0 +1,153 @@
+{
+ "filenames": [
+ "W2ControlFlow.mod",
+ "W2ControlFlow.ls",
+ "W2ControlFlow.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/trace.json
new file mode 100644
index 0000000..f70bed5
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/trace.json
@@ -0,0 +1,253 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ControlFlow",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ControlFlow"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 1,
+ "message": "not ready",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "NOT_READY",
+ "severity": "error"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "EXEC_WHILE",
+ "source": {
+ "kind": "EXEC_WHILE",
+ "id": "main:EXEC_WHILE:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "EXEC_FOR",
+ "source": {
+ "kind": "EXEC_FOR",
+ "id": "main:EXEC_FOR:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:23:7",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "EXEC_SWITCH",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "BREAK",
+ "source": {
+ "kind": "BREAK",
+ "id": "main:BREAK:28:9",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "info",
+ "code": "VC_BREAK",
+ "message": "BREAK reached",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ "id": 11
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 7,
+ "message": "mode 1",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "MODE1",
+ "severity": "error"
+ },
+ "id": 12
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "id": 13
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/trajectory.json
new file mode 100644
index 0000000..cb22e65
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/compile.json
new file mode 100644
index 0000000..e582d30
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2ProcFuncCall",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 9,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 8,
+ "procedureCount": 3,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/controller.json
new file mode 100644
index 0000000..3db47f6
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/controller.json
@@ -0,0 +1,523 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 5,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 5
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ProcFuncCall",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ProcFuncCall"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call read_part",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "read_part:RAW_STATEMENT:8:5",
+ "sourceMap": {
+ "line": 8,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 3,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "CALL",
+ "id": "main:CALL:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call increment_retry",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 8
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "increment_retry:RAW_STATEMENT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RETURN",
+ "source": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 11
+ }
+ ],
+ "currentSource": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "completed": true
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_80_ProcFuncCall-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/io.json
new file mode 100644
index 0000000..222cd29
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_80_ProcFuncCall-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/motion-queue.json
new file mode 100644
index 0000000..57085bb
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/motion-queue.json
@@ -0,0 +1,5 @@
+{
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/post-report.json
new file mode 100644
index 0000000..44ff58d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/post-report.json
@@ -0,0 +1,117 @@
+{
+ "filenames": [
+ "W2ProcFuncCall.mod",
+ "W2ProcFuncCall.ls",
+ "W2ProcFuncCall.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/trace.json
new file mode 100644
index 0000000..fd70e4b
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/trace.json
@@ -0,0 +1,202 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ProcFuncCall",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ProcFuncCall"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call read_part",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "read_part:RAW_STATEMENT:8:5",
+ "sourceMap": {
+ "line": 8,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 3,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "CALL",
+ "id": "main:CALL:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call increment_retry",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 8
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "increment_retry:RAW_STATEMENT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RETURN",
+ "source": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 11
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/trajectory.json
new file mode 100644
index 0000000..cb22e65
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/compile.json
new file mode 100644
index 0000000..c8515aa
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2ExceptionAlarm",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 5,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 6,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/controller.json
new file mode 100644
index 0000000..64d6d9b
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/controller.json
@@ -0,0 +1,606 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 5,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 5
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "START",
+ "message": "start",
+ "severity": "info",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "time": 0
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExceptionAlarm",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExceptionAlarm"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "start",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "START",
+ "severity": "info"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "enable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ }
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:23:5",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "disable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ }
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 10
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_90_ExceptionAlarm-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/io.json
new file mode 100644
index 0000000..f36d75c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_90_ExceptionAlarm-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/motion-queue.json
new file mode 100644
index 0000000..f6cb95e
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/motion-queue.json
@@ -0,0 +1,82 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/post-report.json
new file mode 100644
index 0000000..6c7c328
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/post-report.json
@@ -0,0 +1,81 @@
+{
+ "filenames": [
+ "W2ExceptionAlarm.mod",
+ "W2ExceptionAlarm.ls",
+ "W2ExceptionAlarm.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/trace.json
new file mode 100644
index 0000000..a2c2108
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/trace.json
@@ -0,0 +1,201 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExceptionAlarm",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExceptionAlarm"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "start",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "START",
+ "severity": "info"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "enable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ }
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:23:5",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "disable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ }
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 10
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/trajectory.json
new file mode 100644
index 0000000..6f9d002
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/compile.json
new file mode 100644
index 0000000..9c97d4d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/compile.json
@@ -0,0 +1,11 @@
+{
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/post-report.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/post-report.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/compile.json
new file mode 100644
index 0000000..9c97d4d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/compile.json
@@ -0,0 +1,11 @@
+{
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/post-report.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/post-report.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/compile.json
new file mode 100644
index 0000000..9c97d4d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/compile.json
@@ -0,0 +1,11 @@
+{
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/post-report.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/post-report.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/compile.json
new file mode 100644
index 0000000..9c97d4d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/compile.json
@@ -0,0 +1,11 @@
+{
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/post-report.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/post-report.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/compile.json
new file mode 100644
index 0000000..6d939b1
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2RuntimeTimeout",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 5,
+ "procedureCount": 2,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/controller.json
new file mode 100644
index 0000000..ac88b82
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/controller.json
@@ -0,0 +1,431 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "running",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:0": 0,
+ "$wait:main:1": 0.1
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "DI99 timeout",
+ "message": "DI99 timeout",
+ "severity": "warning",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "time": 0.1
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2RuntimeTimeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2RuntimeTimeout"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 4
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "timeout",
+ "elapsed": 0.1
+ },
+ "id": 5
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "DI99 timeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "DI99 timeout",
+ "severity": "warning"
+ },
+ "id": 6
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 8
+ }
+ ],
+ "currentSource": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "completed": false
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": false,
+ "io.di[6]": true,
+ "io.di[7]": false,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "scripts": []
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/io.json
new file mode 100644
index 0000000..2fb8400
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/io.json
@@ -0,0 +1,139 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": false,
+ "io.di[6]": true,
+ "io.di[7]": false,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "scripts": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/motion-queue.json
new file mode 100644
index 0000000..57085bb
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/motion-queue.json
@@ -0,0 +1,5 @@
+{
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/post-report.json
new file mode 100644
index 0000000..d9d6613
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2RuntimeTimeout.mod",
+ "W2RuntimeTimeout.ls",
+ "W2RuntimeTimeout.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/trace.json
new file mode 100644
index 0000000..fedfe64
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/trace.json
@@ -0,0 +1,165 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2RuntimeTimeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2RuntimeTimeout"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 4
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "timeout",
+ "elapsed": 0.1
+ },
+ "id": 5
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "DI99 timeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "DI99 timeout",
+ "severity": "warning"
+ },
+ "id": 6
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 8
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/trajectory.json
new file mode 100644
index 0000000..cb22e65
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/compile.json
new file mode 100644
index 0000000..4b5e199
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2BrandHints",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 1,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 7,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/post-report.json
new file mode 100644
index 0000000..d8d1d95
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/post-report.json
@@ -0,0 +1,45 @@
+{
+ "filenames": [
+ "W2BrandHints.mod",
+ "W2BrandHints.ls",
+ "W2BrandHints.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint fanuc ignored for abb",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint kuka ignored for abb",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint kuka ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for kuka",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint fanuc ignored for kuka",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/roundtrip.json
new file mode 100644
index 0000000..8d3ce25
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/roundtrip.json
@@ -0,0 +1,29 @@
+{
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2BrandHints.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/compile.json
new file mode 100644
index 0000000..64b7f0c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2CrossBrandMotion",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 6,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 10,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/post-report.json
new file mode 100644
index 0000000..e129436
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/post-report.json
@@ -0,0 +1,21 @@
+{
+ "filenames": [
+ "W2CrossBrandMotion.mod",
+ "W2CrossBrandMotion.ls",
+ "W2CrossBrandMotion.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for kuka",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/roundtrip.json
new file mode 100644
index 0000000..6a91bfc
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/roundtrip.json
@@ -0,0 +1,29 @@
+{
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2CrossBrandMotion.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/compile.json
new file mode 100644
index 0000000..2863696
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2Roundtrip",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 1,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/post-report.json
new file mode 100644
index 0000000..3290428
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/post-report.json
@@ -0,0 +1,27 @@
+{
+ "filenames": [
+ "W2Roundtrip.mod",
+ "W2Roundtrip.ls",
+ "W2Roundtrip.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/roundtrip.json
new file mode 100644
index 0000000..a9f636c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/roundtrip.json
@@ -0,0 +1,29 @@
+{
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2Roundtrip.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/report.html b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/report.html
new file mode 100644
index 0000000..7e1a92a
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/report.html
@@ -0,0 +1,39 @@
+
+
+
+
+ W2-JOB-20260628021400-19b5a2c7
+
+
+
+ W2-JOB-20260628021400-19b5a2c7
+ Suite working2-abb120-spec / Robot abb_irb120_3_58
+ Covered sections: 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25
+
+ | Program | Layer | Status | Diagnostics |
+ | W2_00_MinimalModule | Runtime | pass | 0 |
+| W2_10_DataTargetToolFrame | Runtime | pass | 8 |
+| W2_20_ExpressionMath | Runtime | pass | 0 |
+| W2_30_MotionAllTypes | Runtime | pass | 8 |
+| W2_40_PathEvents | Runtime | pass | 0 |
+| W2_50_OperationProcess | Runtime | pass | 0 |
+| W2_60_IOWaitPulse | Runtime | pass | 0 |
+| W2_70_ControlFlow | Runtime | pass | 45 |
+| W2_80_ProcFuncCall | Runtime | pass | 6 |
+| W2_90_ExceptionAlarm | Runtime | pass | 13 |
+| W2_E10_ExpressionDiagnostics | Static | diagnostic | 1 |
+| W2_E20_SemanticDiagnostics | Static | diagnostic | 2 |
+| W2_E30_MotionDiagnostics | Static | diagnostic | 1 |
+| W2_E40_ControlFlowDiagnostics | Static | diagnostic | 1 |
+| W2_E50_RuntimeTimeout | Runtime | pass | 1 |
+| W2_P10_BrandHints | Post | pass | 10 |
+| W2_P20_CrossBrandMotion | Post | pass | 6 |
+| W2_P30_Roundtrip | Post | pass | 7 |
+
+
+
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/report.json
new file mode 100644
index 0000000..39824e5
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/report.json
@@ -0,0 +1,1109 @@
+{
+ "job_id": "W2-JOB-20260628021400-19b5a2c7",
+ "suite_id": "working2-abb120-spec",
+ "robot_id": "abb_irb120_3_58",
+ "coverage": {
+ "specSections": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25
+ ],
+ "coveredSections": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25
+ ],
+ "missingSections": [],
+ "runtimePrograms": 11,
+ "staticPrograms": 4,
+ "postPrograms": 3
+ },
+ "summary": {
+ "programs": 18,
+ "pass": 14,
+ "diagnostic": 4,
+ "fail": 0
+ },
+ "diagnostics": [
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 37,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 37,
+ "column": 14
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 38,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 38,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_speed preserved as raw IR",
+ "sourceMap": {
+ "line": 39,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement vl preserved as raw IR",
+ "sourceMap": {
+ "line": 39,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_zone preserved as raw IR",
+ "sourceMap": {
+ "line": 40,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement z5 preserved as raw IR",
+ "sourceMap": {
+ "line": 40,
+ "column": 14
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 14
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_speed preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement vl preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_zone preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement z10 preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 14
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 18
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 24
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 31
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement elseif preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fault preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 12
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement == preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 18
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement true preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 21
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement FAULT preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"fault\" preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 19
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement else preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement NOT_READY preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"not ready\" preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 23
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement retry preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement = preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 1 preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement continue preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 18
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 24
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 31
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement case preserved as raw IR",
+ "sourceMap": {
+ "line": 26,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 1 preserved as raw IR",
+ "sourceMap": {
+ "line": 26,
+ "column": 12
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement MODE1 preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"mode 1\" preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 21
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement break preserved as raw IR",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement case preserved as raw IR",
+ "sourceMap": {
+ "line": 29,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 2 preserved as raw IR",
+ "sourceMap": {
+ "line": 29,
+ "column": 12
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 9
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 20
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 28
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 33
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement default preserved as raw IR",
+ "sourceMap": {
+ "line": 31,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 9
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement MODE_OTHER preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"mode other\" preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 18
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 24
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 31
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "warning",
+ "code": "GRL_P1_UNIMPLEMENTED",
+ "message": "trap recover_trap is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 6,
+ "column": 3
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "warning",
+ "code": "GRL_P1_UNIMPLEMENTED",
+ "message": "task background is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 9,
+ "column": 3
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement raise preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement E_PICK_FAILED preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement E_PICK_FAILED preserved as raw IR",
+ "sourceMap": {
+ "line": 17,
+ "column": 11
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement RECOVER preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"recovering\" preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 21
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement severity preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 34
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement warning preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 43
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement CLEANUP preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"cleanup\" preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 21
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_SYMBOL",
+ "message": "Unknown constant missing_symbol",
+ "sourceMap": {
+ "line": 4,
+ "column": 41
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "severity": "error",
+ "code": "GRL_ARGUMENT_NOT_LVALUE",
+ "message": "out argument done must be a writable lvalue",
+ "sourceMap": {
+ "line": 15,
+ "column": 19
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "severity": "error",
+ "code": "GRL_SYMBOL_DUPLICATE",
+ "message": "Duplicate symbol v",
+ "sourceMap": {
+ "line": 4,
+ "column": 3
+ }
+ },
+ {
+ "program_id": "W2_E30_MotionDiagnostics",
+ "severity": "error",
+ "code": "GRL_PATH_EMPTY",
+ "message": "Path empty_path must contain at least one point"
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E50_RuntimeTimeout",
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint fanuc ignored for abb",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint kuka ignored for abb",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint kuka ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint fanuc ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2BrandHints.mod",
+ "line": 3
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2CrossBrandMotion.mod",
+ "line": 3
+ }
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2Roundtrip.mod",
+ "line": 3
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/job.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/job.json
new file mode 100644
index 0000000..db30728
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/job.json
@@ -0,0 +1,21619 @@
+{
+ "job_id": "W2-JOB-20260628022836-51484d62",
+ "suite_id": "working2-abb120-spec",
+ "robot_id": "abb_irb120_3_58",
+ "robot": {
+ "robotId": "abb_irb120_3_58",
+ "urdf": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n",
+ "loadOptions": {
+ "robotId": "abb_irb120_3_58",
+ "baseLink": "base_link",
+ "tipLink": "tool0"
+ },
+ "source": {
+ "repository": "https://github.com/ros-industrial/abb",
+ "branch": "noetic-devel",
+ "entrypoint": "abb_irb120_support/urdf/irb120_3_58.xacro",
+ "macro": "abb_irb120_support/urdf/irb120_3_58_macro.xacro"
+ },
+ "standardJoints": {
+ "home": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "approach": [
+ 0,
+ -0.4,
+ 0.5,
+ 0,
+ 0.2,
+ 0
+ ],
+ "pick": [
+ 0.2,
+ -0.35,
+ 0.45,
+ 0.1,
+ -0.2,
+ 0.3
+ ],
+ "place": [
+ -0.35,
+ -0.25,
+ 0.35,
+ -0.25,
+ 0.15,
+ -0.4
+ ]
+ }
+ },
+ "git_revision": "working-tree",
+ "manifest_hash": "ead98b6d28dd4ef6718c82ed930805c021547a79c74dd2fe5413d85f8896d67a",
+ "coverage": {
+ "specSections": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25
+ ],
+ "coveredSections": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25
+ ],
+ "missingSections": [],
+ "runtimePrograms": 12,
+ "staticPrograms": 4,
+ "postPrograms": 3
+ },
+ "programs": [
+ {
+ "program_id": "W2_00_MinimalModule",
+ "file": "runtime/W2_00_MinimalModule.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "4eae9a20aaf3becd68f0577a1a98c52ff25ec9dfdea700919e9920bd94945f59",
+ "spec_sections": [
+ 4,
+ 5,
+ 6,
+ 9,
+ 10,
+ 23
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628022836-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/compile.json",
+ "controllerJson": "W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/controller.json",
+ "motionQueueJson": "W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/motion-queue.json",
+ "traceJson": "W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/trace.json",
+ "ioJson": "W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/io.json",
+ "trajectoryJson": "W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/trajectory.json",
+ "postReportJson": "W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/post-report.json",
+ "roundtripJson": "W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/roundtrip.json",
+ "reportJson": "W2-JOB-20260628022836-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628022836-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2MinimalModule",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 1,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 4,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MinimalModule",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MinimalModule"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_00_MinimalModule-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MinimalModule",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MinimalModule"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_00_MinimalModule-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2MinimalModule.mod",
+ "W2MinimalModule.ls",
+ "W2MinimalModule.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "file": "runtime/W2_10_DataTargetToolFrame.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "6e7480a7195f219554aa1463e3fe832830d9af027a0c3748a740ff48936d1e3d",
+ "spec_sections": [
+ 6,
+ 8,
+ 9
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 37,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 37,
+ "column": 14
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 38,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 38,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_speed preserved as raw IR",
+ "sourceMap": {
+ "line": 39,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement vl preserved as raw IR",
+ "sourceMap": {
+ "line": 39,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_zone preserved as raw IR",
+ "sourceMap": {
+ "line": 40,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement z5 preserved as raw IR",
+ "sourceMap": {
+ "line": 40,
+ "column": 14
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628022836-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/compile.json",
+ "controllerJson": "W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/controller.json",
+ "motionQueueJson": "W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/motion-queue.json",
+ "traceJson": "W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/trace.json",
+ "ioJson": "W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/io.json",
+ "trajectoryJson": "W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/trajectory.json",
+ "postReportJson": "W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/post-report.json",
+ "roundtripJson": "W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/roundtrip.json",
+ "reportJson": "W2-JOB-20260628022836-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628022836-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2DataTargetToolFrame",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 19,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2DataTargetToolFrame",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2DataTargetToolFrame"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_10_DataTargetToolFrame-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2DataTargetToolFrame",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2DataTargetToolFrame"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_10_DataTargetToolFrame-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.5,
+ 0.03,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2DataTargetToolFrame.mod",
+ "W2DataTargetToolFrame.ls",
+ "W2DataTargetToolFrame.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_20_ExpressionMath",
+ "file": "runtime/W2_20_ExpressionMath.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "2e1afb8beaa60b2666056b1d6594a58da50a006c761e76ef131c9cfdd40c29b3",
+ "spec_sections": [
+ 7,
+ 9,
+ 13
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628022836-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/compile.json",
+ "controllerJson": "W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/controller.json",
+ "motionQueueJson": "W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/motion-queue.json",
+ "traceJson": "W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/trace.json",
+ "ioJson": "W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/io.json",
+ "trajectoryJson": "W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/trajectory.json",
+ "postReportJson": "W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/post-report.json",
+ "roundtripJson": "W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/roundtrip.json",
+ "reportJson": "W2-JOB-20260628022836-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628022836-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2ExpressionMath",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 2,
+ "kdlPathRequests": 0,
+ "symbolCount": 9,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:2": 0
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExpressionMath",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExpressionMath"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_20_ExpressionMath-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExpressionMath",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExpressionMath"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_20_ExpressionMath-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 8,
+ "duration": 0.48,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.45,
+ 0.04,
+ -0.2,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2ExpressionMath.mod",
+ "W2ExpressionMath.ls",
+ "W2ExpressionMath.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "file": "runtime/W2_30_MotionAllTypes.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "f851346e7e008aa85718895b6ba97010f3071027f6c3cd920dc5920c7cd6020c",
+ "spec_sections": [
+ 8,
+ 9,
+ 10
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 14
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_speed preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement vl preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_zone preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement z10 preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 14
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628022836-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/compile.json",
+ "controllerJson": "W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/controller.json",
+ "motionQueueJson": "W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/motion-queue.json",
+ "traceJson": "W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/trace.json",
+ "ioJson": "W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/io.json",
+ "trajectoryJson": "W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/trajectory.json",
+ "postReportJson": "W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/post-report.json",
+ "roundtripJson": "W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/roundtrip.json",
+ "reportJson": "W2-JOB-20260628022836-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628022836-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2MotionAllTypes",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 10,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MotionAllTypes",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MotionAllTypes"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_30_MotionAllTypes-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MotionAllTypes",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MotionAllTypes"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_30_MotionAllTypes-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.6,
+ 0,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2MotionAllTypes.mod",
+ "W2MotionAllTypes.ls",
+ "W2MotionAllTypes.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_40_PathEvents",
+ "file": "runtime/W2_40_PathEvents.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "86770c6d548271a2ae9f332b6bd4b84e52b513d41647df37f62b7e49a4b11942",
+ "spec_sections": [
+ 11,
+ 13,
+ 19
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628022836-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/compile.json",
+ "controllerJson": "W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/controller.json",
+ "motionQueueJson": "W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/motion-queue.json",
+ "traceJson": "W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/trace.json",
+ "ioJson": "W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/io.json",
+ "trajectoryJson": "W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/trajectory.json",
+ "postReportJson": "W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/post-report.json",
+ "roundtripJson": "W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/roundtrip.json",
+ "reportJson": "W2-JOB-20260628022836-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628022836-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2PathEvents",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 7,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2PathEvents",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2PathEvents"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "generated_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "generated_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "generated_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p_home",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_pick",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0.20000000169966334,
+ -0.3500000029744108,
+ 0.4500000038242425,
+ 0.10000000084983167,
+ -0.20000000169966334,
+ 0.300000002549495
+ ],
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_place",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.1500000012747475,
+ -0.4000000033993267
+ ],
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "before",
+ "pointId": "p_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 17,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 10 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 703,
+ "line": 17,
+ "column": 25
+ },
+ "end": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ },
+ "end": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ },
+ "end": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ },
+ "end": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ },
+ "end": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ },
+ "end": {
+ "offset": 712,
+ "line": 17,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 713,
+ "line": 17,
+ "column": 35
+ },
+ "end": {
+ "offset": 714,
+ "line": 17,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 715,
+ "line": 17,
+ "column": 37
+ },
+ "end": {
+ "offset": 719,
+ "line": 17,
+ "column": 41
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "p_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 19,
+ "column": 24
+ },
+ "data": {
+ "statement": "wait io . di [ 10 ] == true timeout 2 s on_timeout alarm \"pick sensor timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 780,
+ "line": 19,
+ "column": 24
+ },
+ "end": {
+ "offset": 784,
+ "line": 19,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 785,
+ "line": 19,
+ "column": 29
+ },
+ "end": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ },
+ "end": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ },
+ "end": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ },
+ "end": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ },
+ "end": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ },
+ "end": {
+ "offset": 794,
+ "line": 19,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 795,
+ "line": 19,
+ "column": 39
+ },
+ "end": {
+ "offset": 797,
+ "line": 19,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 798,
+ "line": 19,
+ "column": 42
+ },
+ "end": {
+ "offset": 802,
+ "line": 19,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 803,
+ "line": 19,
+ "column": 47
+ },
+ "end": {
+ "offset": 810,
+ "line": 19,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 811,
+ "line": 19,
+ "column": 55
+ },
+ "end": {
+ "offset": 814,
+ "line": 19,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 815,
+ "line": 19,
+ "column": 59
+ },
+ "end": {
+ "offset": 825,
+ "line": 19,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 826,
+ "line": 19,
+ "column": 70
+ },
+ "end": {
+ "offset": 831,
+ "line": 19,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"pick sensor timeout\"",
+ "value": "pick sensor timeout",
+ "range": {
+ "start": {
+ "offset": 832,
+ "line": 19,
+ "column": 76
+ },
+ "end": {
+ "offset": 853,
+ "line": 19,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_2",
+ "timing": "at",
+ "pointId": "p_place",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 21,
+ "column": 37
+ },
+ "data": {
+ "statement": "pulse io . do [ 11 ] duration 100 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 929,
+ "line": 21,
+ "column": 37
+ },
+ "end": {
+ "offset": 934,
+ "line": 21,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 935,
+ "line": 21,
+ "column": 43
+ },
+ "end": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ },
+ "end": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ },
+ "end": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ },
+ "end": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "11",
+ "value": 11,
+ "range": {
+ "start": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ },
+ "end": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ },
+ "end": {
+ "offset": 944,
+ "line": 21,
+ "column": 52
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 945,
+ "line": 21,
+ "column": 53
+ },
+ "end": {
+ "offset": 953,
+ "line": 21,
+ "column": 61
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "100 ms",
+ "value": 100,
+ "range": {
+ "start": {
+ "offset": 954,
+ "line": 21,
+ "column": 62
+ },
+ "end": {
+ "offset": 960,
+ "line": 21,
+ "column": 68
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.1
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_40_PathEvents-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "generated_path"
+ ],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "generated_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "generated_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "generated_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p_home",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_pick",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0.20000000169966334,
+ -0.3500000029744108,
+ 0.4500000038242425,
+ 0.10000000084983167,
+ -0.20000000169966334,
+ 0.300000002549495
+ ],
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_place",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.1500000012747475,
+ -0.4000000033993267
+ ],
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "before",
+ "pointId": "p_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 17,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 10 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 703,
+ "line": 17,
+ "column": 25
+ },
+ "end": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ },
+ "end": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ },
+ "end": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ },
+ "end": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ },
+ "end": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ },
+ "end": {
+ "offset": 712,
+ "line": 17,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 713,
+ "line": 17,
+ "column": 35
+ },
+ "end": {
+ "offset": 714,
+ "line": 17,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 715,
+ "line": 17,
+ "column": 37
+ },
+ "end": {
+ "offset": 719,
+ "line": 17,
+ "column": 41
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "p_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 19,
+ "column": 24
+ },
+ "data": {
+ "statement": "wait io . di [ 10 ] == true timeout 2 s on_timeout alarm \"pick sensor timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 780,
+ "line": 19,
+ "column": 24
+ },
+ "end": {
+ "offset": 784,
+ "line": 19,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 785,
+ "line": 19,
+ "column": 29
+ },
+ "end": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ },
+ "end": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ },
+ "end": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ },
+ "end": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ },
+ "end": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ },
+ "end": {
+ "offset": 794,
+ "line": 19,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 795,
+ "line": 19,
+ "column": 39
+ },
+ "end": {
+ "offset": 797,
+ "line": 19,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 798,
+ "line": 19,
+ "column": 42
+ },
+ "end": {
+ "offset": 802,
+ "line": 19,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 803,
+ "line": 19,
+ "column": 47
+ },
+ "end": {
+ "offset": 810,
+ "line": 19,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 811,
+ "line": 19,
+ "column": 55
+ },
+ "end": {
+ "offset": 814,
+ "line": 19,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 815,
+ "line": 19,
+ "column": 59
+ },
+ "end": {
+ "offset": 825,
+ "line": 19,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 826,
+ "line": 19,
+ "column": 70
+ },
+ "end": {
+ "offset": 831,
+ "line": 19,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"pick sensor timeout\"",
+ "value": "pick sensor timeout",
+ "range": {
+ "start": {
+ "offset": 832,
+ "line": 19,
+ "column": 76
+ },
+ "end": {
+ "offset": 853,
+ "line": 19,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_2",
+ "timing": "at",
+ "pointId": "p_place",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 21,
+ "column": 37
+ },
+ "data": {
+ "statement": "pulse io . do [ 11 ] duration 100 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 929,
+ "line": 21,
+ "column": 37
+ },
+ "end": {
+ "offset": 934,
+ "line": 21,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 935,
+ "line": 21,
+ "column": 43
+ },
+ "end": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ },
+ "end": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ },
+ "end": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ },
+ "end": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "11",
+ "value": 11,
+ "range": {
+ "start": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ },
+ "end": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ },
+ "end": {
+ "offset": 944,
+ "line": 21,
+ "column": 52
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 945,
+ "line": 21,
+ "column": 53
+ },
+ "end": {
+ "offset": 953,
+ "line": 21,
+ "column": 61
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "100 ms",
+ "value": 100,
+ "range": {
+ "start": {
+ "offset": 954,
+ "line": 21,
+ "column": 62
+ },
+ "end": {
+ "offset": 960,
+ "line": 21,
+ "column": 68
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.1
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2PathEvents",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2PathEvents"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_40_PathEvents-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.15000000127474747,
+ -0.4000000033993266
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2PathEvents.mod",
+ "W2PathEvents.ls",
+ "W2PathEvents.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_50_OperationProcess",
+ "file": "runtime/W2_50_OperationProcess.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "01b2232a6f30383d441f7cc73020fc44d0e752e807ff07f92af0ed9132afa1c6",
+ "spec_sections": [
+ 12,
+ 13
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628022836-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/compile.json",
+ "controllerJson": "W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/controller.json",
+ "motionQueueJson": "W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/motion-queue.json",
+ "traceJson": "W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/trace.json",
+ "ioJson": "W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/io.json",
+ "trajectoryJson": "W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/trajectory.json",
+ "postReportJson": "W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/post-report.json",
+ "roundtripJson": "W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/roundtrip.json",
+ "reportJson": "W2-JOB-20260628022836-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628022836-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2OperationProcess",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 6,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 1
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2OperationProcess",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2OperationProcess"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "start_action",
+ "statement": "io . do [ 1 ] = true",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "op_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "op_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "op_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "end_action",
+ "statement": "io . do [ 1 ] = false",
+ "sourceMap": {
+ "line": 21,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_50_OperationProcess-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "op_path"
+ ],
+ "operationIds": [
+ "pick_op"
+ ],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "start_action",
+ "statement": "io . do [ 1 ] = true",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "op_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "op_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "op_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "end_action",
+ "statement": "io . do [ 1 ] = false",
+ "sourceMap": {
+ "line": 21,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2OperationProcess",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2OperationProcess"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_50_OperationProcess-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2OperationProcess.mod",
+ "W2OperationProcess.ls",
+ "W2OperationProcess.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_60_IOWaitPulse",
+ "file": "runtime/W2_60_IOWaitPulse.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "b473d3fcbc92ba0e6d34790d12ff1367bfc89452744ae540ffd9b301fc7f2636",
+ "spec_sections": [
+ 13
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628022836-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/compile.json",
+ "controllerJson": "W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/controller.json",
+ "motionQueueJson": "W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/motion-queue.json",
+ "traceJson": "W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/trace.json",
+ "ioJson": "W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/io.json",
+ "trajectoryJson": "W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/trajectory.json",
+ "postReportJson": "W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/post-report.json",
+ "roundtripJson": "W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/roundtrip.json",
+ "reportJson": "W2-JOB-20260628022836-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628022836-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2IOWaitPulse",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 12,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 5,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 10,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 10
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:3": 0,
+ "$wait:main:4": 0,
+ "$wait:main:5": 0.1,
+ "$wait:main:6": 0.1,
+ "$wait:main:7": 0.1
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2IOWaitPulse",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2IOWaitPulse"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 11
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 12
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 13
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 14
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 15
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 16
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 17
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 18
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 19
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ]
+ },
+ "id": 20
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 21
+ },
+ {
+ "time": 0.1,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 22
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 10,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 23
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "io_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "io_path",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "io_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "at",
+ "pointId": "p0",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 9,
+ "column": 35
+ },
+ "data": {
+ "statement": "pulse io . do [ 20 ] duration 50 + 50 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 286,
+ "line": 9,
+ "column": 35
+ },
+ "end": {
+ "offset": 291,
+ "line": 9,
+ "column": 40
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 292,
+ "line": 9,
+ "column": 41
+ },
+ "end": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ },
+ "end": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ },
+ "end": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ },
+ "end": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "20",
+ "value": 20,
+ "range": {
+ "start": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ },
+ "end": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ },
+ "end": {
+ "offset": 301,
+ "line": 9,
+ "column": 50
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 302,
+ "line": 9,
+ "column": 51
+ },
+ "end": {
+ "offset": 310,
+ "line": 9,
+ "column": 59
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 311,
+ "line": 9,
+ "column": 60
+ },
+ "end": {
+ "offset": 313,
+ "line": 9,
+ "column": 62
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "+",
+ "value": "+",
+ "range": {
+ "start": {
+ "offset": 314,
+ "line": 9,
+ "column": 63
+ },
+ "end": {
+ "offset": 315,
+ "line": 9,
+ "column": 64
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50 ms",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 316,
+ "line": 9,
+ "column": 65
+ },
+ "end": {
+ "offset": 321,
+ "line": 9,
+ "column": 70
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.05
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75,
+ "io.do[1]": true,
+ "io.ao[1]": 0.75,
+ "io.go[1]": 3,
+ "io.do[2]": true
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ },
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ },
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ },
+ {
+ "id": 13,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 14,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 15,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_60_IOWaitPulse-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "io_path"
+ ],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "io_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "io_path",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "io_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "at",
+ "pointId": "p0",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 9,
+ "column": 35
+ },
+ "data": {
+ "statement": "pulse io . do [ 20 ] duration 50 + 50 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 286,
+ "line": 9,
+ "column": 35
+ },
+ "end": {
+ "offset": 291,
+ "line": 9,
+ "column": 40
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 292,
+ "line": 9,
+ "column": 41
+ },
+ "end": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ },
+ "end": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ },
+ "end": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ },
+ "end": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "20",
+ "value": 20,
+ "range": {
+ "start": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ },
+ "end": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ },
+ "end": {
+ "offset": 301,
+ "line": 9,
+ "column": 50
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 302,
+ "line": 9,
+ "column": 51
+ },
+ "end": {
+ "offset": 310,
+ "line": 9,
+ "column": 59
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 311,
+ "line": 9,
+ "column": 60
+ },
+ "end": {
+ "offset": 313,
+ "line": 9,
+ "column": 62
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "+",
+ "value": "+",
+ "range": {
+ "start": {
+ "offset": 314,
+ "line": 9,
+ "column": 63
+ },
+ "end": {
+ "offset": 315,
+ "line": 9,
+ "column": 64
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50 ms",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 316,
+ "line": 9,
+ "column": 65
+ },
+ "end": {
+ "offset": 321,
+ "line": 9,
+ "column": 70
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.05
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2IOWaitPulse",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2IOWaitPulse"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 11
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 12
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 13
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 14
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 15
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 16
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 17
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 18
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 19
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ]
+ },
+ "id": 20
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 21
+ },
+ {
+ "time": 0.1,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 22
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 10,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 23
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75,
+ "io.do[1]": true,
+ "io.ao[1]": 0.75,
+ "io.go[1]": 3,
+ "io.do[2]": true
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ },
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ },
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ },
+ {
+ "id": 13,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 14,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 15,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_60_IOWaitPulse-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2IOWaitPulse.mod",
+ "W2IOWaitPulse.ls",
+ "W2IOWaitPulse.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "file": "runtime/W2_70_ControlFlow.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "516fe162d1032f7a3d65c2b632ea10bafb95b10b38ccb15f77db79f86f0aaa7c",
+ "spec_sections": [
+ 14
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 18
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 24
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 26
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 31
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement elseif preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fault preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 12
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement == preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 18
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement true preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 21
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement FAULT preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"fault\" preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 19
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement else preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement NOT_READY preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"not ready\" preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 23
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement retry preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement = preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 1 preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement continue preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 18
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 24
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 26
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 31
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement case preserved as raw IR",
+ "sourceMap": {
+ "line": 26,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 1 preserved as raw IR",
+ "sourceMap": {
+ "line": 26,
+ "column": 12
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement MODE1 preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"mode 1\" preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 21
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement break preserved as raw IR",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement case preserved as raw IR",
+ "sourceMap": {
+ "line": 29,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 2 preserved as raw IR",
+ "sourceMap": {
+ "line": 29,
+ "column": 12
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 9
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 20
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 26
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 28
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 33
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement default preserved as raw IR",
+ "sourceMap": {
+ "line": 31,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 9
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement MODE_OTHER preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"mode other\" preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 26
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628022836-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/compile.json",
+ "controllerJson": "W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/controller.json",
+ "motionQueueJson": "W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/motion-queue.json",
+ "traceJson": "W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/trace.json",
+ "ioJson": "W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/io.json",
+ "trajectoryJson": "W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/trajectory.json",
+ "postReportJson": "W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/post-report.json",
+ "roundtripJson": "W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/roundtrip.json",
+ "reportJson": "W2-JOB-20260628022836-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628022836-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2ControlFlow",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 14,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 8,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 8
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ },
+ {
+ "id": "else:0",
+ "variables": {
+ "i": 1
+ }
+ },
+ {
+ "id": "for:3",
+ "variables": {}
+ },
+ {
+ "id": "switch:5",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "NOT_READY",
+ "message": "not ready",
+ "severity": "error",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "time": 0
+ },
+ {
+ "id": "MODE1",
+ "message": "mode 1",
+ "severity": "error",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "time": 0.1
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ControlFlow",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ControlFlow"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 1,
+ "message": "not ready",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "NOT_READY",
+ "severity": "error"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "EXEC_WHILE",
+ "source": {
+ "kind": "EXEC_WHILE",
+ "id": "main:EXEC_WHILE:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "EXEC_FOR",
+ "source": {
+ "kind": "EXEC_FOR",
+ "id": "main:EXEC_FOR:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:23:7",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "EXEC_SWITCH",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "BREAK",
+ "source": {
+ "kind": "BREAK",
+ "id": "main:BREAK:28:9",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "info",
+ "code": "VC_BREAK",
+ "message": "BREAK reached",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ "id": 11
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 7,
+ "message": "mode 1",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "MODE1",
+ "severity": "error"
+ },
+ "id": 12
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "id": 13
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_70_ControlFlow-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ControlFlow",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ControlFlow"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 1,
+ "message": "not ready",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "NOT_READY",
+ "severity": "error"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "EXEC_WHILE",
+ "source": {
+ "kind": "EXEC_WHILE",
+ "id": "main:EXEC_WHILE:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "EXEC_FOR",
+ "source": {
+ "kind": "EXEC_FOR",
+ "id": "main:EXEC_FOR:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:23:7",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "EXEC_SWITCH",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "BREAK",
+ "source": {
+ "kind": "BREAK",
+ "id": "main:BREAK:28:9",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "info",
+ "code": "VC_BREAK",
+ "message": "BREAK reached",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ "id": 11
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 7,
+ "message": "mode 1",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "MODE1",
+ "severity": "error"
+ },
+ "id": 12
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "id": 13
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_70_ControlFlow-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2ControlFlow.mod",
+ "W2ControlFlow.ls",
+ "W2ControlFlow.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "file": "runtime/W2_80_ProcFuncCall.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "701334663d6a215852dbe4c78b3025ebcda5e318513a1e73ab0e6518c49788d5",
+ "spec_sections": [
+ 15
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 18
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 24
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 26
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 31
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628022836-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/compile.json",
+ "controllerJson": "W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/controller.json",
+ "motionQueueJson": "W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/motion-queue.json",
+ "traceJson": "W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/trace.json",
+ "ioJson": "W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/io.json",
+ "trajectoryJson": "W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/trajectory.json",
+ "postReportJson": "W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/post-report.json",
+ "roundtripJson": "W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/roundtrip.json",
+ "reportJson": "W2-JOB-20260628022836-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628022836-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2ProcFuncCall",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 9,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 8,
+ "procedureCount": 3,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 5,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 5
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ProcFuncCall",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ProcFuncCall"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call read_part",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "read_part:RAW_STATEMENT:8:5",
+ "sourceMap": {
+ "line": 8,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 3,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "CALL",
+ "id": "main:CALL:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call increment_retry",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 8
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "increment_retry:RAW_STATEMENT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RETURN",
+ "source": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 11
+ }
+ ],
+ "currentSource": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "completed": true
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_80_ProcFuncCall-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ProcFuncCall",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ProcFuncCall"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call read_part",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "read_part:RAW_STATEMENT:8:5",
+ "sourceMap": {
+ "line": 8,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 3,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "CALL",
+ "id": "main:CALL:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call increment_retry",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 8
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "increment_retry:RAW_STATEMENT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RETURN",
+ "source": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 11
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_80_ProcFuncCall-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2ProcFuncCall.mod",
+ "W2ProcFuncCall.ls",
+ "W2ProcFuncCall.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "file": "runtime/W2_90_ExceptionAlarm.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "494455105f84d035ce785747ee5dde77d85db6fb2bd907d1774d1de14e61a6a0",
+ "spec_sections": [
+ 16,
+ 17
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "GRL_P1_UNIMPLEMENTED",
+ "message": "trap recover_trap is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 6,
+ "column": 3
+ }
+ },
+ {
+ "severity": "warning",
+ "code": "GRL_P1_UNIMPLEMENTED",
+ "message": "task background is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 9,
+ "column": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement raise preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement E_PICK_FAILED preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement E_PICK_FAILED preserved as raw IR",
+ "sourceMap": {
+ "line": 17,
+ "column": 11
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement RECOVER preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"recovering\" preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 21
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement severity preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 34
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement warning preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 43
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement CLEANUP preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"cleanup\" preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 21
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628022836-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/compile.json",
+ "controllerJson": "W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/controller.json",
+ "motionQueueJson": "W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/motion-queue.json",
+ "traceJson": "W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/trace.json",
+ "ioJson": "W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/io.json",
+ "trajectoryJson": "W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/trajectory.json",
+ "postReportJson": "W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/post-report.json",
+ "roundtripJson": "W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/roundtrip.json",
+ "reportJson": "W2-JOB-20260628022836-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628022836-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2ExceptionAlarm",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 5,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 6,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 5,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 5
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "START",
+ "message": "start",
+ "severity": "info",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "time": 0
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExceptionAlarm",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExceptionAlarm"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "start",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "START",
+ "severity": "info"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "enable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ }
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:23:5",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "disable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ }
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 10
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_90_ExceptionAlarm-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExceptionAlarm",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExceptionAlarm"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "start",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "START",
+ "severity": "info"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "enable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ }
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:23:5",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "disable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ }
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 10
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_90_ExceptionAlarm-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2ExceptionAlarm.mod",
+ "W2ExceptionAlarm.ls",
+ "W2ExceptionAlarm.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_99_FullSpecExample",
+ "file": "runtime/W2_99_FullSpecExample.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "cd08e3c9c9c522b75f37f404b4fb915b4af8477ccca5d2f5fc1bed61c9c66024",
+ "spec_sections": [
+ 24
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 74,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 74,
+ "column": 14
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 75,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 75,
+ "column": 15
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628022836-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/compile.json",
+ "controllerJson": "W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/controller.json",
+ "motionQueueJson": "W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/motion-queue.json",
+ "traceJson": "W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/trace.json",
+ "ioJson": "W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/io.json",
+ "trajectoryJson": "W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/trajectory.json",
+ "postReportJson": "W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/post-report.json",
+ "roundtripJson": "W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/roundtrip.json",
+ "reportJson": "W2-JOB-20260628022836-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628022836-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2FullSpecExample",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 14,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 2,
+ "symbolCount": 13,
+ "procedureCount": 1,
+ "pathCount": 2,
+ "operationCount": 2
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2FullSpecExample",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2FullSpecExample"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:78:5",
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:78:5",
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "pick_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "pick_path",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "pick_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "approach",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 39,
+ "column": 20
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "above_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.4
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 40,
+ "column": 22
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "at_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.3
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.3297802811774664e-17,
+ 4.3297802811774664e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 19
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "leave_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.4
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 44,
+ "column": 22
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "after",
+ "pointId": "at_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 42,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 1 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1160,
+ "line": 42,
+ "column": 25
+ },
+ "end": {
+ "offset": 1162,
+ "line": 42,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1162,
+ "line": 42,
+ "column": 27
+ },
+ "end": {
+ "offset": 1163,
+ "line": 42,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 1163,
+ "line": 42,
+ "column": 28
+ },
+ "end": {
+ "offset": 1165,
+ "line": 42,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1165,
+ "line": 42,
+ "column": 30
+ },
+ "end": {
+ "offset": 1166,
+ "line": 42,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1166,
+ "line": 42,
+ "column": 31
+ },
+ "end": {
+ "offset": 1167,
+ "line": 42,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1167,
+ "line": 42,
+ "column": 32
+ },
+ "end": {
+ "offset": 1168,
+ "line": 42,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 1169,
+ "line": 42,
+ "column": 34
+ },
+ "end": {
+ "offset": 1170,
+ "line": 42,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1171,
+ "line": 42,
+ "column": 36
+ },
+ "end": {
+ "offset": 1175,
+ "line": 42,
+ "column": 40
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "at_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 43,
+ "column": 25
+ },
+ "data": {
+ "statement": "wait io . di [ 1 ] == true timeout 2 s on_timeout alarm \"Clamp close timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 1200,
+ "line": 43,
+ "column": 25
+ },
+ "end": {
+ "offset": 1204,
+ "line": 43,
+ "column": 29
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1205,
+ "line": 43,
+ "column": 30
+ },
+ "end": {
+ "offset": 1207,
+ "line": 43,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1207,
+ "line": 43,
+ "column": 32
+ },
+ "end": {
+ "offset": 1208,
+ "line": 43,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 1208,
+ "line": 43,
+ "column": 33
+ },
+ "end": {
+ "offset": 1210,
+ "line": 43,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1210,
+ "line": 43,
+ "column": 35
+ },
+ "end": {
+ "offset": 1211,
+ "line": 43,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1211,
+ "line": 43,
+ "column": 36
+ },
+ "end": {
+ "offset": 1212,
+ "line": 43,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1212,
+ "line": 43,
+ "column": 37
+ },
+ "end": {
+ "offset": 1213,
+ "line": 43,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 1214,
+ "line": 43,
+ "column": 39
+ },
+ "end": {
+ "offset": 1216,
+ "line": 43,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1217,
+ "line": 43,
+ "column": 42
+ },
+ "end": {
+ "offset": 1221,
+ "line": 43,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 1222,
+ "line": 43,
+ "column": 47
+ },
+ "end": {
+ "offset": 1229,
+ "line": 43,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1230,
+ "line": 43,
+ "column": 55
+ },
+ "end": {
+ "offset": 1233,
+ "line": 43,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 1234,
+ "line": 43,
+ "column": 59
+ },
+ "end": {
+ "offset": 1244,
+ "line": 43,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 1245,
+ "line": 43,
+ "column": 70
+ },
+ "end": {
+ "offset": 1250,
+ "line": 43,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"Clamp close timeout\"",
+ "value": "Clamp close timeout",
+ "range": {
+ "start": {
+ "offset": 1251,
+ "line": 43,
+ "column": 76
+ },
+ "end": {
+ "offset": 1272,
+ "line": 43,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "place_path",
+ "operationId": "place_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "place_path",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "place_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "above_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.42000000000000004
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 53,
+ "column": 23
+ }
+ },
+ {
+ "id": "at_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.32
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.3297802811774664e-17,
+ 4.3297802811774664e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 54,
+ "column": 20
+ }
+ },
+ {
+ "id": "leave_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.42000000000000004
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 57,
+ "column": 23
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "after",
+ "pointId": "at_place",
+ "kind": "io",
+ "sourceMap": {
+ "line": 55,
+ "column": 26
+ },
+ "data": {
+ "statement": "io . do [ 1 ] = false",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1565,
+ "line": 55,
+ "column": 26
+ },
+ "end": {
+ "offset": 1567,
+ "line": 55,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1567,
+ "line": 55,
+ "column": 28
+ },
+ "end": {
+ "offset": 1568,
+ "line": 55,
+ "column": 29
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 1568,
+ "line": 55,
+ "column": 29
+ },
+ "end": {
+ "offset": 1570,
+ "line": 55,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1570,
+ "line": 55,
+ "column": 31
+ },
+ "end": {
+ "offset": 1571,
+ "line": 55,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1571,
+ "line": 55,
+ "column": 32
+ },
+ "end": {
+ "offset": 1572,
+ "line": 55,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1572,
+ "line": 55,
+ "column": 33
+ },
+ "end": {
+ "offset": 1573,
+ "line": 55,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 1574,
+ "line": 55,
+ "column": 35
+ },
+ "end": {
+ "offset": 1575,
+ "line": 55,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "false",
+ "value": "false",
+ "range": {
+ "start": {
+ "offset": 1576,
+ "line": 55,
+ "column": 37
+ },
+ "end": {
+ "offset": 1581,
+ "line": 55,
+ "column": 42
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "at_place",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 56,
+ "column": 26
+ },
+ "data": {
+ "statement": "wait io . di [ 2 ] == true timeout 2 s on_timeout alarm \"Clamp open timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 1607,
+ "line": 56,
+ "column": 26
+ },
+ "end": {
+ "offset": 1611,
+ "line": 56,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1612,
+ "line": 56,
+ "column": 31
+ },
+ "end": {
+ "offset": 1614,
+ "line": 56,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1614,
+ "line": 56,
+ "column": 33
+ },
+ "end": {
+ "offset": 1615,
+ "line": 56,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 1615,
+ "line": 56,
+ "column": 34
+ },
+ "end": {
+ "offset": 1617,
+ "line": 56,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1617,
+ "line": 56,
+ "column": 36
+ },
+ "end": {
+ "offset": 1618,
+ "line": 56,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1618,
+ "line": 56,
+ "column": 37
+ },
+ "end": {
+ "offset": 1619,
+ "line": 56,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1619,
+ "line": 56,
+ "column": 38
+ },
+ "end": {
+ "offset": 1620,
+ "line": 56,
+ "column": 39
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 1621,
+ "line": 56,
+ "column": 40
+ },
+ "end": {
+ "offset": 1623,
+ "line": 56,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1624,
+ "line": 56,
+ "column": 43
+ },
+ "end": {
+ "offset": 1628,
+ "line": 56,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 1629,
+ "line": 56,
+ "column": 48
+ },
+ "end": {
+ "offset": 1636,
+ "line": 56,
+ "column": 55
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1637,
+ "line": 56,
+ "column": 56
+ },
+ "end": {
+ "offset": 1640,
+ "line": 56,
+ "column": 59
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 1641,
+ "line": 56,
+ "column": 60
+ },
+ "end": {
+ "offset": 1651,
+ "line": 56,
+ "column": 70
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 1652,
+ "line": 56,
+ "column": 71
+ },
+ "end": {
+ "offset": 1657,
+ "line": 56,
+ "column": 76
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"Clamp open timeout\"",
+ "value": "Clamp open timeout",
+ "range": {
+ "start": {
+ "offset": 1658,
+ "line": 56,
+ "column": 77
+ },
+ "end": {
+ "offset": 1678,
+ "line": 56,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_99_FullSpecExample-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "pick_path",
+ "place_path"
+ ],
+ "operationIds": [
+ "pick_op",
+ "place_op"
+ ],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "pick_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "pick_path",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "pick_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "approach",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 39,
+ "column": 20
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "above_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.4
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 40,
+ "column": 22
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "at_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.3
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.3297802811774664e-17,
+ 4.3297802811774664e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 19
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "leave_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.4
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 44,
+ "column": 22
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "after",
+ "pointId": "at_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 42,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 1 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1160,
+ "line": 42,
+ "column": 25
+ },
+ "end": {
+ "offset": 1162,
+ "line": 42,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1162,
+ "line": 42,
+ "column": 27
+ },
+ "end": {
+ "offset": 1163,
+ "line": 42,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 1163,
+ "line": 42,
+ "column": 28
+ },
+ "end": {
+ "offset": 1165,
+ "line": 42,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1165,
+ "line": 42,
+ "column": 30
+ },
+ "end": {
+ "offset": 1166,
+ "line": 42,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1166,
+ "line": 42,
+ "column": 31
+ },
+ "end": {
+ "offset": 1167,
+ "line": 42,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1167,
+ "line": 42,
+ "column": 32
+ },
+ "end": {
+ "offset": 1168,
+ "line": 42,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 1169,
+ "line": 42,
+ "column": 34
+ },
+ "end": {
+ "offset": 1170,
+ "line": 42,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1171,
+ "line": 42,
+ "column": 36
+ },
+ "end": {
+ "offset": 1175,
+ "line": 42,
+ "column": 40
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "at_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 43,
+ "column": 25
+ },
+ "data": {
+ "statement": "wait io . di [ 1 ] == true timeout 2 s on_timeout alarm \"Clamp close timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 1200,
+ "line": 43,
+ "column": 25
+ },
+ "end": {
+ "offset": 1204,
+ "line": 43,
+ "column": 29
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1205,
+ "line": 43,
+ "column": 30
+ },
+ "end": {
+ "offset": 1207,
+ "line": 43,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1207,
+ "line": 43,
+ "column": 32
+ },
+ "end": {
+ "offset": 1208,
+ "line": 43,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 1208,
+ "line": 43,
+ "column": 33
+ },
+ "end": {
+ "offset": 1210,
+ "line": 43,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1210,
+ "line": 43,
+ "column": 35
+ },
+ "end": {
+ "offset": 1211,
+ "line": 43,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1211,
+ "line": 43,
+ "column": 36
+ },
+ "end": {
+ "offset": 1212,
+ "line": 43,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1212,
+ "line": 43,
+ "column": 37
+ },
+ "end": {
+ "offset": 1213,
+ "line": 43,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 1214,
+ "line": 43,
+ "column": 39
+ },
+ "end": {
+ "offset": 1216,
+ "line": 43,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1217,
+ "line": 43,
+ "column": 42
+ },
+ "end": {
+ "offset": 1221,
+ "line": 43,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 1222,
+ "line": 43,
+ "column": 47
+ },
+ "end": {
+ "offset": 1229,
+ "line": 43,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1230,
+ "line": 43,
+ "column": 55
+ },
+ "end": {
+ "offset": 1233,
+ "line": 43,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 1234,
+ "line": 43,
+ "column": 59
+ },
+ "end": {
+ "offset": 1244,
+ "line": 43,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 1245,
+ "line": 43,
+ "column": 70
+ },
+ "end": {
+ "offset": 1250,
+ "line": 43,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"Clamp close timeout\"",
+ "value": "Clamp close timeout",
+ "range": {
+ "start": {
+ "offset": 1251,
+ "line": 43,
+ "column": 76
+ },
+ "end": {
+ "offset": 1272,
+ "line": 43,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "place_path",
+ "operationId": "place_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "place_path",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "place_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "above_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.42000000000000004
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 53,
+ "column": 23
+ }
+ },
+ {
+ "id": "at_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.32
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.3297802811774664e-17,
+ 4.3297802811774664e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 54,
+ "column": 20
+ }
+ },
+ {
+ "id": "leave_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.42000000000000004
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 57,
+ "column": 23
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "after",
+ "pointId": "at_place",
+ "kind": "io",
+ "sourceMap": {
+ "line": 55,
+ "column": 26
+ },
+ "data": {
+ "statement": "io . do [ 1 ] = false",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1565,
+ "line": 55,
+ "column": 26
+ },
+ "end": {
+ "offset": 1567,
+ "line": 55,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1567,
+ "line": 55,
+ "column": 28
+ },
+ "end": {
+ "offset": 1568,
+ "line": 55,
+ "column": 29
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 1568,
+ "line": 55,
+ "column": 29
+ },
+ "end": {
+ "offset": 1570,
+ "line": 55,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1570,
+ "line": 55,
+ "column": 31
+ },
+ "end": {
+ "offset": 1571,
+ "line": 55,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1571,
+ "line": 55,
+ "column": 32
+ },
+ "end": {
+ "offset": 1572,
+ "line": 55,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1572,
+ "line": 55,
+ "column": 33
+ },
+ "end": {
+ "offset": 1573,
+ "line": 55,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 1574,
+ "line": 55,
+ "column": 35
+ },
+ "end": {
+ "offset": 1575,
+ "line": 55,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "false",
+ "value": "false",
+ "range": {
+ "start": {
+ "offset": 1576,
+ "line": 55,
+ "column": 37
+ },
+ "end": {
+ "offset": 1581,
+ "line": 55,
+ "column": 42
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "at_place",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 56,
+ "column": 26
+ },
+ "data": {
+ "statement": "wait io . di [ 2 ] == true timeout 2 s on_timeout alarm \"Clamp open timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 1607,
+ "line": 56,
+ "column": 26
+ },
+ "end": {
+ "offset": 1611,
+ "line": 56,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1612,
+ "line": 56,
+ "column": 31
+ },
+ "end": {
+ "offset": 1614,
+ "line": 56,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1614,
+ "line": 56,
+ "column": 33
+ },
+ "end": {
+ "offset": 1615,
+ "line": 56,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 1615,
+ "line": 56,
+ "column": 34
+ },
+ "end": {
+ "offset": 1617,
+ "line": 56,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1617,
+ "line": 56,
+ "column": 36
+ },
+ "end": {
+ "offset": 1618,
+ "line": 56,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1618,
+ "line": 56,
+ "column": 37
+ },
+ "end": {
+ "offset": 1619,
+ "line": 56,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1619,
+ "line": 56,
+ "column": 38
+ },
+ "end": {
+ "offset": 1620,
+ "line": 56,
+ "column": 39
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 1621,
+ "line": 56,
+ "column": 40
+ },
+ "end": {
+ "offset": 1623,
+ "line": 56,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1624,
+ "line": 56,
+ "column": 43
+ },
+ "end": {
+ "offset": 1628,
+ "line": 56,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 1629,
+ "line": 56,
+ "column": 48
+ },
+ "end": {
+ "offset": 1636,
+ "line": 56,
+ "column": 55
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1637,
+ "line": 56,
+ "column": 56
+ },
+ "end": {
+ "offset": 1640,
+ "line": 56,
+ "column": 59
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 1641,
+ "line": 56,
+ "column": 60
+ },
+ "end": {
+ "offset": 1651,
+ "line": 56,
+ "column": 70
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 1652,
+ "line": 56,
+ "column": 71
+ },
+ "end": {
+ "offset": 1657,
+ "line": 56,
+ "column": 76
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"Clamp open timeout\"",
+ "value": "Clamp open timeout",
+ "range": {
+ "start": {
+ "offset": 1658,
+ "line": 56,
+ "column": 77
+ },
+ "end": {
+ "offset": 1678,
+ "line": 56,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2FullSpecExample",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2FullSpecExample"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:78:5",
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:78:5",
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_99_FullSpecExample-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 32,
+ "duration": 1.92,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2FullSpecExample.mod",
+ "W2FullSpecExample.ls",
+ "W2FullSpecExample.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "file": "static/W2_E10_ExpressionDiagnostics.grl",
+ "coverage_level": "Static",
+ "expected_status": "diagnostic",
+ "status": "diagnostic",
+ "input_hash": "c08db186d16a8bc3f0ecb4731abb6601d8c69348fd08ca6b21b8848f32df2347",
+ "spec_sections": [
+ 7,
+ 22
+ ],
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_SYMBOL",
+ "message": "Unknown constant missing_symbol",
+ "sourceMap": {
+ "line": 4,
+ "column": 41
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_SYMBOL",
+ "message": "Unknown constant missing_symbol",
+ "sourceMap": {
+ "line": 4,
+ "column": 41
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_FUNCTION",
+ "message": "Unknown function no_such_function",
+ "sourceMap": {
+ "line": 5,
+ "column": 43
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_ARITY",
+ "message": "atan2 expects 2 argument(s)",
+ "sourceMap": {
+ "line": 6,
+ "column": 36
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_DOMAIN",
+ "message": "Function argument is below domain",
+ "sourceMap": {
+ "line": 7,
+ "column": 33
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_DIV_ZERO",
+ "message": "Division by zero",
+ "sourceMap": {
+ "line": 8,
+ "column": 35
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_UNIT_MISMATCH",
+ "message": "Cannot combine length and time",
+ "sourceMap": {
+ "line": 9,
+ "column": 25
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_SYMBOL",
+ "message": "Unknown constant missing_symbol",
+ "sourceMap": {
+ "line": 4,
+ "column": 41
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_FUNCTION",
+ "message": "Unknown function no_such_function",
+ "sourceMap": {
+ "line": 5,
+ "column": 43
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_ARITY",
+ "message": "atan2 expects 2 argument(s)",
+ "sourceMap": {
+ "line": 6,
+ "column": 36
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_DOMAIN",
+ "message": "Function argument is below domain",
+ "sourceMap": {
+ "line": 7,
+ "column": 33
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_DIV_ZERO",
+ "message": "Division by zero",
+ "sourceMap": {
+ "line": 8,
+ "column": 35
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_UNIT_MISMATCH",
+ "message": "Cannot combine length and time",
+ "sourceMap": {
+ "line": 9,
+ "column": 25
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628022836-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/compile.json",
+ "controllerJson": "W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/controller.json",
+ "motionQueueJson": "W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/motion-queue.json",
+ "traceJson": "W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/trace.json",
+ "ioJson": "W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/io.json",
+ "trajectoryJson": "W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/trajectory.json",
+ "postReportJson": "W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/post-report.json",
+ "roundtripJson": "W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/roundtrip.json",
+ "reportJson": "W2-JOB-20260628022836-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628022836-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "file": "static/W2_E20_SemanticDiagnostics.grl",
+ "coverage_level": "Static",
+ "expected_status": "diagnostic",
+ "status": "diagnostic",
+ "input_hash": "98750f73027e3272a3f1e86f90ea6066d67387e7ffef190441893fff38012ed5",
+ "spec_sections": [
+ 6,
+ 15,
+ 22
+ ],
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "GRL_ARGUMENT_NOT_LVALUE",
+ "message": "out argument done must be a writable lvalue",
+ "sourceMap": {
+ "line": 15,
+ "column": 19
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_SYMBOL_DUPLICATE",
+ "message": "Duplicate symbol v",
+ "sourceMap": {
+ "line": 4,
+ "column": 3
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_ARGUMENT_NOT_LVALUE",
+ "message": "out argument done must be a writable lvalue",
+ "sourceMap": {
+ "line": 15,
+ "column": 19
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_FUNC_SIDE_EFFECT",
+ "message": "Function bad_func cannot execute wait",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_CALL_TARGET_NOT_FOUND",
+ "message": "Unknown call target missing_proc",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_TARGET_NOT_FOUND",
+ "message": "Unknown target missing_target"
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628022836-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/compile.json",
+ "controllerJson": "W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/controller.json",
+ "motionQueueJson": "W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/motion-queue.json",
+ "traceJson": "W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/trace.json",
+ "ioJson": "W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/io.json",
+ "trajectoryJson": "W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/trajectory.json",
+ "postReportJson": "W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/post-report.json",
+ "roundtripJson": "W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/roundtrip.json",
+ "reportJson": "W2-JOB-20260628022836-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628022836-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+ }
+ },
+ {
+ "program_id": "W2_E30_MotionDiagnostics",
+ "file": "error/W2_E30_MotionDiagnostics.grl",
+ "coverage_level": "Static",
+ "expected_status": "diagnostic",
+ "status": "diagnostic",
+ "input_hash": "19f8c9f8a1ba6f6cfa8dde62207f8ee1797267e9addf7bbdbfbe941d8734b543",
+ "spec_sections": [
+ 8,
+ 9,
+ 10,
+ 11,
+ 22
+ ],
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "GRL_PATH_EMPTY",
+ "message": "Path empty_path must contain at least one point"
+ },
+ {
+ "severity": "error",
+ "code": "GRL_PATH_EMPTY",
+ "message": "Path empty_path must contain at least one point"
+ },
+ {
+ "severity": "error",
+ "code": "KDL_JOINT_LIMIT",
+ "message": "joint_1 exceeds fixture limit",
+ "segmentId": "main:MOVEJ",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ }
+ },
+ {
+ "severity": "error",
+ "code": "KDL_TARGET_UNREACHABLE",
+ "message": "Target main:MOVEL is outside ABB120 fixture workspace",
+ "segmentId": "main:MOVEL",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628022836-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/compile.json",
+ "controllerJson": "W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/controller.json",
+ "motionQueueJson": "W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/motion-queue.json",
+ "traceJson": "W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/trace.json",
+ "ioJson": "W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/io.json",
+ "trajectoryJson": "W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/trajectory.json",
+ "postReportJson": "W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/post-report.json",
+ "roundtripJson": "W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/roundtrip.json",
+ "reportJson": "W2-JOB-20260628022836-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628022836-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "file": "static/W2_E40_ControlFlowDiagnostics.grl",
+ "coverage_level": "Static",
+ "expected_status": "diagnostic",
+ "status": "diagnostic",
+ "input_hash": "3ba920eda8d0932b260b9875ce395803d55ebb6a48ecb3c8857b2a4ef1478fea",
+ "spec_sections": [
+ 14,
+ 22
+ ],
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_CONTINUE_OUTSIDE_LOOP",
+ "message": "continue is only valid inside loop",
+ "sourceMap": {
+ "line": 6,
+ "column": 5
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_SWITCH_CASE_DUPLICATE",
+ "message": "Duplicate switch case 1",
+ "sourceMap": {
+ "line": 14,
+ "column": 7
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_SWITCH_CASE_NOT_CONSTANT",
+ "message": "switch case must be a constant expression",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_LABEL_NOT_FOUND",
+ "message": "Unknown label missing",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_JUMP_INTO_BLOCK",
+ "message": "jump cannot enter a nested or sibling block"
+ },
+ {
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628022836-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/compile.json",
+ "controllerJson": "W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/controller.json",
+ "motionQueueJson": "W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json",
+ "traceJson": "W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/trace.json",
+ "ioJson": "W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/io.json",
+ "trajectoryJson": "W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/trajectory.json",
+ "postReportJson": "W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/post-report.json",
+ "roundtripJson": "W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json",
+ "reportJson": "W2-JOB-20260628022836-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628022836-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+ }
+ },
+ {
+ "program_id": "W2_E50_RuntimeTimeout",
+ "file": "error/W2_E50_RuntimeTimeout.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "diagnostic",
+ "status": "diagnostic",
+ "input_hash": "2d5b41bef4b80c8a22f48697abe3b1a335779f439741f52376388091d8ea4fb6",
+ "spec_sections": [
+ 13,
+ 16
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628022836-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/compile.json",
+ "controllerJson": "W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/controller.json",
+ "motionQueueJson": "W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/motion-queue.json",
+ "traceJson": "W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/trace.json",
+ "ioJson": "W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/io.json",
+ "trajectoryJson": "W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/trajectory.json",
+ "postReportJson": "W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/post-report.json",
+ "roundtripJson": "W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/roundtrip.json",
+ "reportJson": "W2-JOB-20260628022836-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628022836-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2RuntimeTimeout",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 5,
+ "procedureCount": 2,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "running",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:0": 0,
+ "$wait:main:1": 0.1
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "DI99 timeout",
+ "message": "DI99 timeout",
+ "severity": "warning",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "time": 0.1
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2RuntimeTimeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2RuntimeTimeout"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 4
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "timeout",
+ "elapsed": 0.1
+ },
+ "id": 5
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "DI99 timeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "DI99 timeout",
+ "severity": "warning"
+ },
+ "id": 6
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 8
+ }
+ ],
+ "currentSource": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "completed": false
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": false,
+ "io.di[6]": true,
+ "io.di[7]": false,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "scripts": []
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2RuntimeTimeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2RuntimeTimeout"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 4
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "timeout",
+ "elapsed": 0.1
+ },
+ "id": 5
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "DI99 timeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "DI99 timeout",
+ "severity": "warning"
+ },
+ "id": 6
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 8
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": false,
+ "io.di[6]": true,
+ "io.di[7]": false,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "scripts": []
+ },
+ "trajectory": {
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2RuntimeTimeout.mod",
+ "W2RuntimeTimeout.ls",
+ "W2RuntimeTimeout.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "file": "post/W2_P10_BrandHints.grl",
+ "coverage_level": "Post",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "0b0b7f523d6afa37eb7b33db69fc8dc8eef910799030e24a13b87344bb0a7f80",
+ "spec_sections": [
+ 18,
+ 20
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint fanuc ignored for abb",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint kuka ignored for abb",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint kuka ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint fanuc ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2BrandHints.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628022836-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/compile.json",
+ "controllerJson": "W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/controller.json",
+ "motionQueueJson": "W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/motion-queue.json",
+ "traceJson": "W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/trace.json",
+ "ioJson": "W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/io.json",
+ "trajectoryJson": "W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/trajectory.json",
+ "postReportJson": "W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/post-report.json",
+ "roundtripJson": "W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/roundtrip.json",
+ "reportJson": "W2-JOB-20260628022836-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628022836-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2BrandHints",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 1,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 7,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "post": {
+ "filenames": [
+ "W2BrandHints.mod",
+ "W2BrandHints.ls",
+ "W2BrandHints.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint fanuc ignored for abb",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint kuka ignored for abb",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint kuka ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for kuka",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint fanuc ignored for kuka",
+ "brand": "kuka"
+ }
+ ]
+ },
+ "roundtrip": {
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2BrandHints.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "file": "post/W2_P20_CrossBrandMotion.grl",
+ "coverage_level": "Post",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "25574be5f4073c18281213d73b72e386f93b1ec57fe21490a9097f8050ce68eb",
+ "spec_sections": [
+ 20
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2CrossBrandMotion.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628022836-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/compile.json",
+ "controllerJson": "W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/controller.json",
+ "motionQueueJson": "W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/motion-queue.json",
+ "traceJson": "W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/trace.json",
+ "ioJson": "W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/io.json",
+ "trajectoryJson": "W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/trajectory.json",
+ "postReportJson": "W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/post-report.json",
+ "roundtripJson": "W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/roundtrip.json",
+ "reportJson": "W2-JOB-20260628022836-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628022836-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2CrossBrandMotion",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 6,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 10,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "post": {
+ "filenames": [
+ "W2CrossBrandMotion.mod",
+ "W2CrossBrandMotion.ls",
+ "W2CrossBrandMotion.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for kuka",
+ "brand": "kuka"
+ }
+ ]
+ },
+ "roundtrip": {
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2CrossBrandMotion.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "file": "post/W2_P30_Roundtrip.grl",
+ "coverage_level": "Post",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "ffef36ecf9e77bceff45b3438905861f7007365b608525e14f18561e58d2e6cf",
+ "spec_sections": [
+ 19,
+ 20,
+ 21
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2Roundtrip.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628022836-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/compile.json",
+ "controllerJson": "W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/controller.json",
+ "motionQueueJson": "W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/motion-queue.json",
+ "traceJson": "W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/trace.json",
+ "ioJson": "W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/io.json",
+ "trajectoryJson": "W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/trajectory.json",
+ "postReportJson": "W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/post-report.json",
+ "roundtripJson": "W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/roundtrip.json",
+ "reportJson": "W2-JOB-20260628022836-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628022836-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2Roundtrip",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 1,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 1
+ },
+ "post": {
+ "filenames": [
+ "W2Roundtrip.mod",
+ "W2Roundtrip.ls",
+ "W2Roundtrip.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ },
+ "roundtrip": {
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2Roundtrip.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+ }
+ }
+ ],
+ "artifacts": {
+ "root": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62",
+ "manifestJson": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/manifest.json",
+ "jobJson": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/job.json",
+ "reportJson": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/report.json",
+ "reportHtml": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/report.html",
+ "desktopScreenshot": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/screenshots/virtual-controller-desktop.png",
+ "mobileScreenshot": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/screenshots/virtual-controller-mobile.png",
+ "uiEvidenceJson": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/screenshots/evidence.json"
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/manifest.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/manifest.json
new file mode 100644
index 0000000..f6d8cfd
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/manifest.json
@@ -0,0 +1,451 @@
+{
+ "suite_id": "working2-abb120-spec",
+ "robot_id": "abb_irb120_3_58",
+ "spec_source": "work/doc/通用机器人编程语法规范.md",
+ "program_root": "kdl-wasm/web/tests/fixtures/abb120/spec-programs",
+ "runtime_commands": [
+ "loadProgram",
+ "start",
+ "stepInto",
+ "hold",
+ "resume",
+ "stepMotion",
+ "stop",
+ "resetFault"
+ ],
+ "programs": [
+ {
+ "program_id": "W2_00_MinimalModule",
+ "file": "runtime/W2_00_MinimalModule.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 4,
+ 5,
+ 6,
+ 9,
+ 10,
+ 23
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "file": "runtime/W2_10_DataTargetToolFrame.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 6,
+ 8,
+ 9
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_20_ExpressionMath",
+ "file": "runtime/W2_20_ExpressionMath.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 7,
+ 9,
+ 13
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "file": "runtime/W2_30_MotionAllTypes.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 8,
+ 9,
+ 10
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_40_PathEvents",
+ "file": "runtime/W2_40_PathEvents.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 11,
+ 13,
+ 19
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_50_OperationProcess",
+ "file": "runtime/W2_50_OperationProcess.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 12,
+ 13
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_60_IOWaitPulse",
+ "file": "runtime/W2_60_IOWaitPulse.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 13
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "file": "runtime/W2_70_ControlFlow.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 14
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "file": "runtime/W2_80_ProcFuncCall.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 15
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "file": "runtime/W2_90_ExceptionAlarm.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 16,
+ 17
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": [
+ "GRL_P1_UNIMPLEMENTED"
+ ]
+ },
+ {
+ "program_id": "W2_99_FullSpecExample",
+ "file": "runtime/W2_99_FullSpecExample.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 24
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "file": "static/W2_E10_ExpressionDiagnostics.grl",
+ "coverage_level": "Static",
+ "spec_sections": [
+ 7,
+ 22
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "GRL_EXPR_UNKNOWN_SYMBOL",
+ "GRL_EXPR_UNKNOWN_FUNCTION",
+ "GRL_EXPR_ARITY",
+ "GRL_EXPR_DOMAIN",
+ "GRL_EXPR_DIV_ZERO",
+ "GRL_EXPR_UNIT_MISMATCH"
+ ]
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "file": "static/W2_E20_SemanticDiagnostics.grl",
+ "coverage_level": "Static",
+ "spec_sections": [
+ 6,
+ 15,
+ 22
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "GRL_SYMBOL_DUPLICATE",
+ "GRL_ARGUMENT_NOT_LVALUE",
+ "GRL_CALL_TARGET_NOT_FOUND",
+ "GRL_FUNC_SIDE_EFFECT",
+ "GRL_TARGET_NOT_FOUND"
+ ]
+ },
+ {
+ "program_id": "W2_E30_MotionDiagnostics",
+ "file": "error/W2_E30_MotionDiagnostics.grl",
+ "coverage_level": "Static",
+ "spec_sections": [
+ 8,
+ 9,
+ 10,
+ 11,
+ 22
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "KDL_JOINT_LIMIT",
+ "KDL_TARGET_UNREACHABLE",
+ "GRL_PATH_EMPTY"
+ ]
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "file": "static/W2_E40_ControlFlowDiagnostics.grl",
+ "coverage_level": "Static",
+ "spec_sections": [
+ 14,
+ 22
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "GRL_BREAK_OUTSIDE_FLOW",
+ "GRL_CONTINUE_OUTSIDE_LOOP",
+ "GRL_JUMP_INTO_BLOCK",
+ "GRL_SWITCH_CASE_DUPLICATE",
+ "GRL_SWITCH_CASE_NOT_CONSTANT",
+ "GRL_LABEL_NOT_FOUND"
+ ]
+ },
+ {
+ "program_id": "W2_E50_RuntimeTimeout",
+ "file": "error/W2_E50_RuntimeTimeout.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 13,
+ 16
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "VC_WAIT_TIMEOUT"
+ ]
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "file": "post/W2_P10_BrandHints.grl",
+ "coverage_level": "Post",
+ "spec_sections": [
+ 18,
+ 20
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": [
+ "GRL_POST_HINT_IGNORED"
+ ]
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "file": "post/W2_P20_CrossBrandMotion.grl",
+ "coverage_level": "Post",
+ "spec_sections": [
+ 20
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "file": "post/W2_P30_Roundtrip.grl",
+ "coverage_level": "Post",
+ "spec_sections": [
+ 19,
+ 20,
+ 21
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ }
+ ],
+ "coverage_matrix": [
+ {
+ "spec_section": 4,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_00_MinimalModule"
+ ]
+ },
+ {
+ "spec_section": 5,
+ "coverage_level": "Runtime",
+ "program_ids": [
+ "W2_00_MinimalModule"
+ ]
+ },
+ {
+ "spec_section": 6,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_10_DataTargetToolFrame",
+ "W2_E20_SemanticDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 7,
+ "coverage_level": "Runtime/Static/Post",
+ "program_ids": [
+ "W2_20_ExpressionMath",
+ "W2_E10_ExpressionDiagnostics",
+ "W2_P20_CrossBrandMotion"
+ ]
+ },
+ {
+ "spec_section": 8,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_10_DataTargetToolFrame",
+ "W2_E30_MotionDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 9,
+ "coverage_level": "Runtime/Post",
+ "program_ids": [
+ "W2_20_ExpressionMath",
+ "W2_30_MotionAllTypes",
+ "W2_P20_CrossBrandMotion"
+ ]
+ },
+ {
+ "spec_section": 10,
+ "coverage_level": "Runtime/Static/Post",
+ "program_ids": [
+ "W2_30_MotionAllTypes",
+ "W2_E30_MotionDiagnostics",
+ "W2_P20_CrossBrandMotion"
+ ]
+ },
+ {
+ "spec_section": 11,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_40_PathEvents",
+ "W2_E30_MotionDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 12,
+ "coverage_level": "Runtime/Post",
+ "program_ids": [
+ "W2_50_OperationProcess",
+ "W2_P30_Roundtrip"
+ ]
+ },
+ {
+ "spec_section": 13,
+ "coverage_level": "Runtime",
+ "program_ids": [
+ "W2_60_IOWaitPulse",
+ "W2_E50_RuntimeTimeout"
+ ]
+ },
+ {
+ "spec_section": 14,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_70_ControlFlow",
+ "W2_E40_ControlFlowDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 15,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_80_ProcFuncCall",
+ "W2_E20_SemanticDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 16,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_90_ExceptionAlarm",
+ "W2_E50_RuntimeTimeout"
+ ]
+ },
+ {
+ "spec_section": 17,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_90_ExceptionAlarm"
+ ]
+ },
+ {
+ "spec_section": 18,
+ "coverage_level": "Post",
+ "program_ids": [
+ "W2_P10_BrandHints"
+ ]
+ },
+ {
+ "spec_section": 19,
+ "coverage_level": "Post",
+ "program_ids": [
+ "W2_P30_Roundtrip"
+ ]
+ },
+ {
+ "spec_section": 20,
+ "coverage_level": "Post",
+ "program_ids": [
+ "W2_P20_CrossBrandMotion"
+ ]
+ },
+ {
+ "spec_section": 21,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_00_MinimalModule",
+ "W2_E10_ExpressionDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 22,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_E10_ExpressionDiagnostics",
+ "W2_E20_SemanticDiagnostics",
+ "W2_E30_MotionDiagnostics",
+ "W2_E40_ControlFlowDiagnostics",
+ "W2_E50_RuntimeTimeout"
+ ]
+ },
+ {
+ "spec_section": 23,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_00_MinimalModule"
+ ]
+ },
+ {
+ "spec_section": 24,
+ "coverage_level": "Runtime/Post",
+ "program_ids": [
+ "W2_99_FullSpecExample",
+ "W2_P30_Roundtrip"
+ ]
+ },
+ {
+ "spec_section": 25,
+ "coverage_level": "Runtime/Static/Post",
+ "program_ids": [
+ "W2_00_MinimalModule",
+ "W2_10_DataTargetToolFrame",
+ "W2_20_ExpressionMath",
+ "W2_30_MotionAllTypes",
+ "W2_40_PathEvents",
+ "W2_50_OperationProcess",
+ "W2_60_IOWaitPulse",
+ "W2_70_ControlFlow",
+ "W2_80_ProcFuncCall",
+ "W2_90_ExceptionAlarm",
+ "W2_P20_CrossBrandMotion"
+ ]
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/compile.json
new file mode 100644
index 0000000..b21d4dd
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2MinimalModule",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 1,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 4,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/controller.json
new file mode 100644
index 0000000..eb27052
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/controller.json
@@ -0,0 +1,455 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MinimalModule",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MinimalModule"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_00_MinimalModule-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/io.json
new file mode 100644
index 0000000..a9a6139
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_00_MinimalModule-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/motion-queue.json
new file mode 100644
index 0000000..4c4fa93
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/motion-queue.json
@@ -0,0 +1,82 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/post-report.json
new file mode 100644
index 0000000..2b435af
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2MinimalModule.mod",
+ "W2MinimalModule.ls",
+ "W2MinimalModule.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/trace.json
new file mode 100644
index 0000000..b260ea8
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/trace.json
@@ -0,0 +1,72 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MinimalModule",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MinimalModule"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/trajectory.json
new file mode 100644
index 0000000..6f9d002
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/compile.json
new file mode 100644
index 0000000..a66b72a
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2DataTargetToolFrame",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 19,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/controller.json
new file mode 100644
index 0000000..4677666
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/controller.json
@@ -0,0 +1,872 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2DataTargetToolFrame",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2DataTargetToolFrame"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_10_DataTargetToolFrame-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/io.json
new file mode 100644
index 0000000..4c885c5
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_10_DataTargetToolFrame-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/motion-queue.json
new file mode 100644
index 0000000..ffd4169
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/motion-queue.json
@@ -0,0 +1,416 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/post-report.json
new file mode 100644
index 0000000..62c1345
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2DataTargetToolFrame.mod",
+ "W2DataTargetToolFrame.ls",
+ "W2DataTargetToolFrame.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/trace.json
new file mode 100644
index 0000000..eddbe65
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/trace.json
@@ -0,0 +1,155 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2DataTargetToolFrame",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2DataTargetToolFrame"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/trajectory.json
new file mode 100644
index 0000000..cfea046
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.5,
+ 0.03,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/compile.json
new file mode 100644
index 0000000..2f9bd02
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2ExpressionMath",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 2,
+ "kdlPathRequests": 0,
+ "symbolCount": 9,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/controller.json
new file mode 100644
index 0000000..237450e
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/controller.json
@@ -0,0 +1,631 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:2": 0
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExpressionMath",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExpressionMath"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_20_ExpressionMath-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/io.json
new file mode 100644
index 0000000..f239c92
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_20_ExpressionMath-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/motion-queue.json
new file mode 100644
index 0000000..cb5539e
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/motion-queue.json
@@ -0,0 +1,172 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/post-report.json
new file mode 100644
index 0000000..b9a1299
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2ExpressionMath.mod",
+ "W2ExpressionMath.ls",
+ "W2ExpressionMath.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/trace.json
new file mode 100644
index 0000000..d834175
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/trace.json
@@ -0,0 +1,156 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExpressionMath",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExpressionMath"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/trajectory.json
new file mode 100644
index 0000000..d1691a1
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 8,
+ "duration": 0.48,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.45,
+ 0.04,
+ -0.2,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/compile.json
new file mode 100644
index 0000000..0a93c5d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2MotionAllTypes",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 10,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/controller.json
new file mode 100644
index 0000000..3123338
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/controller.json
@@ -0,0 +1,936 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MotionAllTypes",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MotionAllTypes"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_30_MotionAllTypes-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/io.json
new file mode 100644
index 0000000..498441f
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_30_MotionAllTypes-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/motion-queue.json
new file mode 100644
index 0000000..b627627
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/motion-queue.json
@@ -0,0 +1,480 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/post-report.json
new file mode 100644
index 0000000..3634288
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2MotionAllTypes.mod",
+ "W2MotionAllTypes.ls",
+ "W2MotionAllTypes.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/trace.json
new file mode 100644
index 0000000..5fac72a
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/trace.json
@@ -0,0 +1,155 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MotionAllTypes",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MotionAllTypes"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/trajectory.json
new file mode 100644
index 0000000..431e931
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.6,
+ 0,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/compile.json
new file mode 100644
index 0000000..5e98362
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2PathEvents",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 7,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/controller.json
new file mode 100644
index 0000000..f80f32e
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/controller.json
@@ -0,0 +1,1106 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2PathEvents",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2PathEvents"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "generated_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "generated_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "generated_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p_home",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_pick",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0.20000000169966334,
+ -0.3500000029744108,
+ 0.4500000038242425,
+ 0.10000000084983167,
+ -0.20000000169966334,
+ 0.300000002549495
+ ],
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_place",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.1500000012747475,
+ -0.4000000033993267
+ ],
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "before",
+ "pointId": "p_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 17,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 10 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 703,
+ "line": 17,
+ "column": 25
+ },
+ "end": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ },
+ "end": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ },
+ "end": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ },
+ "end": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ },
+ "end": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ },
+ "end": {
+ "offset": 712,
+ "line": 17,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 713,
+ "line": 17,
+ "column": 35
+ },
+ "end": {
+ "offset": 714,
+ "line": 17,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 715,
+ "line": 17,
+ "column": 37
+ },
+ "end": {
+ "offset": 719,
+ "line": 17,
+ "column": 41
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "p_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 19,
+ "column": 24
+ },
+ "data": {
+ "statement": "wait io . di [ 10 ] == true timeout 2 s on_timeout alarm \"pick sensor timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 780,
+ "line": 19,
+ "column": 24
+ },
+ "end": {
+ "offset": 784,
+ "line": 19,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 785,
+ "line": 19,
+ "column": 29
+ },
+ "end": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ },
+ "end": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ },
+ "end": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ },
+ "end": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ },
+ "end": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ },
+ "end": {
+ "offset": 794,
+ "line": 19,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 795,
+ "line": 19,
+ "column": 39
+ },
+ "end": {
+ "offset": 797,
+ "line": 19,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 798,
+ "line": 19,
+ "column": 42
+ },
+ "end": {
+ "offset": 802,
+ "line": 19,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 803,
+ "line": 19,
+ "column": 47
+ },
+ "end": {
+ "offset": 810,
+ "line": 19,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 811,
+ "line": 19,
+ "column": 55
+ },
+ "end": {
+ "offset": 814,
+ "line": 19,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 815,
+ "line": 19,
+ "column": 59
+ },
+ "end": {
+ "offset": 825,
+ "line": 19,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 826,
+ "line": 19,
+ "column": 70
+ },
+ "end": {
+ "offset": 831,
+ "line": 19,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"pick sensor timeout\"",
+ "value": "pick sensor timeout",
+ "range": {
+ "start": {
+ "offset": 832,
+ "line": 19,
+ "column": 76
+ },
+ "end": {
+ "offset": 853,
+ "line": 19,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_2",
+ "timing": "at",
+ "pointId": "p_place",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 21,
+ "column": 37
+ },
+ "data": {
+ "statement": "pulse io . do [ 11 ] duration 100 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 929,
+ "line": 21,
+ "column": 37
+ },
+ "end": {
+ "offset": 934,
+ "line": 21,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 935,
+ "line": 21,
+ "column": 43
+ },
+ "end": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ },
+ "end": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ },
+ "end": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ },
+ "end": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "11",
+ "value": 11,
+ "range": {
+ "start": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ },
+ "end": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ },
+ "end": {
+ "offset": 944,
+ "line": 21,
+ "column": 52
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 945,
+ "line": 21,
+ "column": 53
+ },
+ "end": {
+ "offset": 953,
+ "line": 21,
+ "column": 61
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "100 ms",
+ "value": 100,
+ "range": {
+ "start": {
+ "offset": 954,
+ "line": 21,
+ "column": 62
+ },
+ "end": {
+ "offset": 960,
+ "line": 21,
+ "column": 68
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.1
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_40_PathEvents-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "generated_path"
+ ],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/io.json
new file mode 100644
index 0000000..2d8957a
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_40_PathEvents-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/motion-queue.json
new file mode 100644
index 0000000..7fbb840
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/motion-queue.json
@@ -0,0 +1,731 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "generated_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "generated_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "generated_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p_home",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_pick",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0.20000000169966334,
+ -0.3500000029744108,
+ 0.4500000038242425,
+ 0.10000000084983167,
+ -0.20000000169966334,
+ 0.300000002549495
+ ],
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_place",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.1500000012747475,
+ -0.4000000033993267
+ ],
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "before",
+ "pointId": "p_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 17,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 10 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 703,
+ "line": 17,
+ "column": 25
+ },
+ "end": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ },
+ "end": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ },
+ "end": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ },
+ "end": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ },
+ "end": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ },
+ "end": {
+ "offset": 712,
+ "line": 17,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 713,
+ "line": 17,
+ "column": 35
+ },
+ "end": {
+ "offset": 714,
+ "line": 17,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 715,
+ "line": 17,
+ "column": 37
+ },
+ "end": {
+ "offset": 719,
+ "line": 17,
+ "column": 41
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "p_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 19,
+ "column": 24
+ },
+ "data": {
+ "statement": "wait io . di [ 10 ] == true timeout 2 s on_timeout alarm \"pick sensor timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 780,
+ "line": 19,
+ "column": 24
+ },
+ "end": {
+ "offset": 784,
+ "line": 19,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 785,
+ "line": 19,
+ "column": 29
+ },
+ "end": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ },
+ "end": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ },
+ "end": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ },
+ "end": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ },
+ "end": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ },
+ "end": {
+ "offset": 794,
+ "line": 19,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 795,
+ "line": 19,
+ "column": 39
+ },
+ "end": {
+ "offset": 797,
+ "line": 19,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 798,
+ "line": 19,
+ "column": 42
+ },
+ "end": {
+ "offset": 802,
+ "line": 19,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 803,
+ "line": 19,
+ "column": 47
+ },
+ "end": {
+ "offset": 810,
+ "line": 19,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 811,
+ "line": 19,
+ "column": 55
+ },
+ "end": {
+ "offset": 814,
+ "line": 19,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 815,
+ "line": 19,
+ "column": 59
+ },
+ "end": {
+ "offset": 825,
+ "line": 19,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 826,
+ "line": 19,
+ "column": 70
+ },
+ "end": {
+ "offset": 831,
+ "line": 19,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"pick sensor timeout\"",
+ "value": "pick sensor timeout",
+ "range": {
+ "start": {
+ "offset": 832,
+ "line": 19,
+ "column": 76
+ },
+ "end": {
+ "offset": 853,
+ "line": 19,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_2",
+ "timing": "at",
+ "pointId": "p_place",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 21,
+ "column": 37
+ },
+ "data": {
+ "statement": "pulse io . do [ 11 ] duration 100 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 929,
+ "line": 21,
+ "column": 37
+ },
+ "end": {
+ "offset": 934,
+ "line": 21,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 935,
+ "line": 21,
+ "column": 43
+ },
+ "end": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ },
+ "end": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ },
+ "end": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ },
+ "end": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "11",
+ "value": 11,
+ "range": {
+ "start": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ },
+ "end": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ },
+ "end": {
+ "offset": 944,
+ "line": 21,
+ "column": 52
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 945,
+ "line": 21,
+ "column": 53
+ },
+ "end": {
+ "offset": 953,
+ "line": 21,
+ "column": 61
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "100 ms",
+ "value": 100,
+ "range": {
+ "start": {
+ "offset": 954,
+ "line": 21,
+ "column": 62
+ },
+ "end": {
+ "offset": 960,
+ "line": 21,
+ "column": 68
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.1
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/post-report.json
new file mode 100644
index 0000000..1799726
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/post-report.json
@@ -0,0 +1,27 @@
+{
+ "filenames": [
+ "W2PathEvents.mod",
+ "W2PathEvents.ls",
+ "W2PathEvents.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/trace.json
new file mode 100644
index 0000000..74a552c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/trace.json
@@ -0,0 +1,72 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2PathEvents",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2PathEvents"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/trajectory.json
new file mode 100644
index 0000000..8c6de8c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.15000000127474747,
+ -0.4000000033993266
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/compile.json
new file mode 100644
index 0000000..4ad1d93
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2OperationProcess",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 6,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/controller.json
new file mode 100644
index 0000000..6520e77
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/controller.json
@@ -0,0 +1,500 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2OperationProcess",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2OperationProcess"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "start_action",
+ "statement": "io . do [ 1 ] = true",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "op_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "op_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "op_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "end_action",
+ "statement": "io . do [ 1 ] = false",
+ "sourceMap": {
+ "line": 21,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_50_OperationProcess-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "op_path"
+ ],
+ "operationIds": [
+ "pick_op"
+ ],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/io.json
new file mode 100644
index 0000000..67ae792
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_50_OperationProcess-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/motion-queue.json
new file mode 100644
index 0000000..6b8ce58
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/motion-queue.json
@@ -0,0 +1,123 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "start_action",
+ "statement": "io . do [ 1 ] = true",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "op_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "op_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "op_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "end_action",
+ "statement": "io . do [ 1 ] = false",
+ "sourceMap": {
+ "line": 21,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/post-report.json
new file mode 100644
index 0000000..b22568b
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/post-report.json
@@ -0,0 +1,27 @@
+{
+ "filenames": [
+ "W2OperationProcess.mod",
+ "W2OperationProcess.ls",
+ "W2OperationProcess.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/trace.json
new file mode 100644
index 0000000..e16ed9a
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/trace.json
@@ -0,0 +1,72 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2OperationProcess",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2OperationProcess"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/trajectory.json
new file mode 100644
index 0000000..6f9d002
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/compile.json
new file mode 100644
index 0000000..a051026
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2IOWaitPulse",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 12,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 5,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/controller.json
new file mode 100644
index 0000000..63159c3
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/controller.json
@@ -0,0 +1,1139 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 10,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 10
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:3": 0,
+ "$wait:main:4": 0,
+ "$wait:main:5": 0.1,
+ "$wait:main:6": 0.1,
+ "$wait:main:7": 0.1
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2IOWaitPulse",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2IOWaitPulse"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 11
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 12
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 13
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 14
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 15
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 16
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 17
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 18
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 19
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ]
+ },
+ "id": 20
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 21
+ },
+ {
+ "time": 0.1,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 22
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 10,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 23
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "io_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "io_path",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "io_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "at",
+ "pointId": "p0",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 9,
+ "column": 35
+ },
+ "data": {
+ "statement": "pulse io . do [ 20 ] duration 50 + 50 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 286,
+ "line": 9,
+ "column": 35
+ },
+ "end": {
+ "offset": 291,
+ "line": 9,
+ "column": 40
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 292,
+ "line": 9,
+ "column": 41
+ },
+ "end": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ },
+ "end": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ },
+ "end": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ },
+ "end": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "20",
+ "value": 20,
+ "range": {
+ "start": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ },
+ "end": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ },
+ "end": {
+ "offset": 301,
+ "line": 9,
+ "column": 50
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 302,
+ "line": 9,
+ "column": 51
+ },
+ "end": {
+ "offset": 310,
+ "line": 9,
+ "column": 59
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 311,
+ "line": 9,
+ "column": 60
+ },
+ "end": {
+ "offset": 313,
+ "line": 9,
+ "column": 62
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "+",
+ "value": "+",
+ "range": {
+ "start": {
+ "offset": 314,
+ "line": 9,
+ "column": 63
+ },
+ "end": {
+ "offset": 315,
+ "line": 9,
+ "column": 64
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50 ms",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 316,
+ "line": 9,
+ "column": 65
+ },
+ "end": {
+ "offset": 321,
+ "line": 9,
+ "column": 70
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.05
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75,
+ "io.do[1]": true,
+ "io.ao[1]": 0.75,
+ "io.go[1]": 3,
+ "io.do[2]": true
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ },
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ },
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ },
+ {
+ "id": 13,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 14,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 15,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_60_IOWaitPulse-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "io_path"
+ ],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/io.json
new file mode 100644
index 0000000..20e3541
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/io.json
@@ -0,0 +1,253 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75,
+ "io.do[1]": true,
+ "io.ao[1]": 0.75,
+ "io.go[1]": 3,
+ "io.do[2]": true
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ },
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ },
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ },
+ {
+ "id": 13,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 14,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 15,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_60_IOWaitPulse-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/motion-queue.json
new file mode 100644
index 0000000..f9168f2
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/motion-queue.json
@@ -0,0 +1,279 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "io_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "io_path",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "io_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "at",
+ "pointId": "p0",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 9,
+ "column": 35
+ },
+ "data": {
+ "statement": "pulse io . do [ 20 ] duration 50 + 50 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 286,
+ "line": 9,
+ "column": 35
+ },
+ "end": {
+ "offset": 291,
+ "line": 9,
+ "column": 40
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 292,
+ "line": 9,
+ "column": 41
+ },
+ "end": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ },
+ "end": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ },
+ "end": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ },
+ "end": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "20",
+ "value": 20,
+ "range": {
+ "start": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ },
+ "end": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ },
+ "end": {
+ "offset": 301,
+ "line": 9,
+ "column": 50
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 302,
+ "line": 9,
+ "column": 51
+ },
+ "end": {
+ "offset": 310,
+ "line": 9,
+ "column": 59
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 311,
+ "line": 9,
+ "column": 60
+ },
+ "end": {
+ "offset": 313,
+ "line": 9,
+ "column": 62
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "+",
+ "value": "+",
+ "range": {
+ "start": {
+ "offset": 314,
+ "line": 9,
+ "column": 63
+ },
+ "end": {
+ "offset": 315,
+ "line": 9,
+ "column": 64
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50 ms",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 316,
+ "line": 9,
+ "column": 65
+ },
+ "end": {
+ "offset": 321,
+ "line": 9,
+ "column": 70
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.05
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/post-report.json
new file mode 100644
index 0000000..ae4ab05
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/post-report.json
@@ -0,0 +1,27 @@
+{
+ "filenames": [
+ "W2IOWaitPulse.mod",
+ "W2IOWaitPulse.ls",
+ "W2IOWaitPulse.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/trace.json
new file mode 100644
index 0000000..41e0322
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/trace.json
@@ -0,0 +1,493 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2IOWaitPulse",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2IOWaitPulse"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 11
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 12
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 13
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 14
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 15
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 16
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 17
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 18
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 19
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ]
+ },
+ "id": 20
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 21
+ },
+ {
+ "time": 0.1,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 22
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 10,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 23
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/trajectory.json
new file mode 100644
index 0000000..6f9d002
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/compile.json
new file mode 100644
index 0000000..28b7c9c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2ControlFlow",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 14,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/controller.json
new file mode 100644
index 0000000..5c3d7e6
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/controller.json
@@ -0,0 +1,610 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 8,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 8
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ },
+ {
+ "id": "else:0",
+ "variables": {
+ "i": 1
+ }
+ },
+ {
+ "id": "for:3",
+ "variables": {}
+ },
+ {
+ "id": "switch:5",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "NOT_READY",
+ "message": "not ready",
+ "severity": "error",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "time": 0
+ },
+ {
+ "id": "MODE1",
+ "message": "mode 1",
+ "severity": "error",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "time": 0.1
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ControlFlow",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ControlFlow"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 1,
+ "message": "not ready",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "NOT_READY",
+ "severity": "error"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "EXEC_WHILE",
+ "source": {
+ "kind": "EXEC_WHILE",
+ "id": "main:EXEC_WHILE:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "EXEC_FOR",
+ "source": {
+ "kind": "EXEC_FOR",
+ "id": "main:EXEC_FOR:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:23:7",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "EXEC_SWITCH",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "BREAK",
+ "source": {
+ "kind": "BREAK",
+ "id": "main:BREAK:28:9",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "info",
+ "code": "VC_BREAK",
+ "message": "BREAK reached",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ "id": 11
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 7,
+ "message": "mode 1",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "MODE1",
+ "severity": "error"
+ },
+ "id": 12
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "id": 13
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_70_ControlFlow-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/io.json
new file mode 100644
index 0000000..67c50b6
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_70_ControlFlow-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/motion-queue.json
new file mode 100644
index 0000000..57085bb
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/motion-queue.json
@@ -0,0 +1,5 @@
+{
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/post-report.json
new file mode 100644
index 0000000..4e58295
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/post-report.json
@@ -0,0 +1,153 @@
+{
+ "filenames": [
+ "W2ControlFlow.mod",
+ "W2ControlFlow.ls",
+ "W2ControlFlow.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/trace.json
new file mode 100644
index 0000000..f70bed5
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/trace.json
@@ -0,0 +1,253 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ControlFlow",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ControlFlow"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 1,
+ "message": "not ready",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "NOT_READY",
+ "severity": "error"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "EXEC_WHILE",
+ "source": {
+ "kind": "EXEC_WHILE",
+ "id": "main:EXEC_WHILE:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "EXEC_FOR",
+ "source": {
+ "kind": "EXEC_FOR",
+ "id": "main:EXEC_FOR:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:23:7",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "EXEC_SWITCH",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "BREAK",
+ "source": {
+ "kind": "BREAK",
+ "id": "main:BREAK:28:9",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "info",
+ "code": "VC_BREAK",
+ "message": "BREAK reached",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ "id": 11
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 7,
+ "message": "mode 1",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "MODE1",
+ "severity": "error"
+ },
+ "id": 12
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "id": 13
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/trajectory.json
new file mode 100644
index 0000000..cb22e65
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/compile.json
new file mode 100644
index 0000000..e582d30
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2ProcFuncCall",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 9,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 8,
+ "procedureCount": 3,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/controller.json
new file mode 100644
index 0000000..3db47f6
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/controller.json
@@ -0,0 +1,523 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 5,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 5
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ProcFuncCall",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ProcFuncCall"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call read_part",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "read_part:RAW_STATEMENT:8:5",
+ "sourceMap": {
+ "line": 8,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 3,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "CALL",
+ "id": "main:CALL:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call increment_retry",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 8
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "increment_retry:RAW_STATEMENT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RETURN",
+ "source": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 11
+ }
+ ],
+ "currentSource": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "completed": true
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_80_ProcFuncCall-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/io.json
new file mode 100644
index 0000000..222cd29
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_80_ProcFuncCall-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/motion-queue.json
new file mode 100644
index 0000000..57085bb
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/motion-queue.json
@@ -0,0 +1,5 @@
+{
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/post-report.json
new file mode 100644
index 0000000..44ff58d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/post-report.json
@@ -0,0 +1,117 @@
+{
+ "filenames": [
+ "W2ProcFuncCall.mod",
+ "W2ProcFuncCall.ls",
+ "W2ProcFuncCall.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/trace.json
new file mode 100644
index 0000000..fd70e4b
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/trace.json
@@ -0,0 +1,202 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ProcFuncCall",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ProcFuncCall"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call read_part",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "read_part:RAW_STATEMENT:8:5",
+ "sourceMap": {
+ "line": 8,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 3,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "CALL",
+ "id": "main:CALL:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call increment_retry",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 8
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "increment_retry:RAW_STATEMENT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RETURN",
+ "source": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 11
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/trajectory.json
new file mode 100644
index 0000000..cb22e65
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/compile.json
new file mode 100644
index 0000000..c8515aa
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2ExceptionAlarm",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 5,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 6,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/controller.json
new file mode 100644
index 0000000..64d6d9b
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/controller.json
@@ -0,0 +1,606 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 5,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 5
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "START",
+ "message": "start",
+ "severity": "info",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "time": 0
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExceptionAlarm",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExceptionAlarm"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "start",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "START",
+ "severity": "info"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "enable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ }
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:23:5",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "disable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ }
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 10
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_90_ExceptionAlarm-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/io.json
new file mode 100644
index 0000000..f36d75c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_90_ExceptionAlarm-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/motion-queue.json
new file mode 100644
index 0000000..f6cb95e
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/motion-queue.json
@@ -0,0 +1,82 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/post-report.json
new file mode 100644
index 0000000..6c7c328
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/post-report.json
@@ -0,0 +1,81 @@
+{
+ "filenames": [
+ "W2ExceptionAlarm.mod",
+ "W2ExceptionAlarm.ls",
+ "W2ExceptionAlarm.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/trace.json
new file mode 100644
index 0000000..a2c2108
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/trace.json
@@ -0,0 +1,201 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExceptionAlarm",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExceptionAlarm"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "start",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "START",
+ "severity": "info"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "enable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ }
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:23:5",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "disable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ }
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 10
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/trajectory.json
new file mode 100644
index 0000000..6f9d002
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/compile.json
new file mode 100644
index 0000000..ea23e7d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2FullSpecExample",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 14,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 2,
+ "symbolCount": 13,
+ "procedureCount": 1,
+ "pathCount": 2,
+ "operationCount": 2
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/controller.json
new file mode 100644
index 0000000..d938f8e
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/controller.json
@@ -0,0 +1,1983 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2FullSpecExample",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2FullSpecExample"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:78:5",
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:78:5",
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "pick_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "pick_path",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "pick_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "approach",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 39,
+ "column": 20
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "above_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.4
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 40,
+ "column": 22
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "at_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.3
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.3297802811774664e-17,
+ 4.3297802811774664e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 19
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "leave_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.4
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 44,
+ "column": 22
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "after",
+ "pointId": "at_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 42,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 1 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1160,
+ "line": 42,
+ "column": 25
+ },
+ "end": {
+ "offset": 1162,
+ "line": 42,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1162,
+ "line": 42,
+ "column": 27
+ },
+ "end": {
+ "offset": 1163,
+ "line": 42,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 1163,
+ "line": 42,
+ "column": 28
+ },
+ "end": {
+ "offset": 1165,
+ "line": 42,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1165,
+ "line": 42,
+ "column": 30
+ },
+ "end": {
+ "offset": 1166,
+ "line": 42,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1166,
+ "line": 42,
+ "column": 31
+ },
+ "end": {
+ "offset": 1167,
+ "line": 42,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1167,
+ "line": 42,
+ "column": 32
+ },
+ "end": {
+ "offset": 1168,
+ "line": 42,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 1169,
+ "line": 42,
+ "column": 34
+ },
+ "end": {
+ "offset": 1170,
+ "line": 42,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1171,
+ "line": 42,
+ "column": 36
+ },
+ "end": {
+ "offset": 1175,
+ "line": 42,
+ "column": 40
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "at_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 43,
+ "column": 25
+ },
+ "data": {
+ "statement": "wait io . di [ 1 ] == true timeout 2 s on_timeout alarm \"Clamp close timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 1200,
+ "line": 43,
+ "column": 25
+ },
+ "end": {
+ "offset": 1204,
+ "line": 43,
+ "column": 29
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1205,
+ "line": 43,
+ "column": 30
+ },
+ "end": {
+ "offset": 1207,
+ "line": 43,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1207,
+ "line": 43,
+ "column": 32
+ },
+ "end": {
+ "offset": 1208,
+ "line": 43,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 1208,
+ "line": 43,
+ "column": 33
+ },
+ "end": {
+ "offset": 1210,
+ "line": 43,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1210,
+ "line": 43,
+ "column": 35
+ },
+ "end": {
+ "offset": 1211,
+ "line": 43,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1211,
+ "line": 43,
+ "column": 36
+ },
+ "end": {
+ "offset": 1212,
+ "line": 43,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1212,
+ "line": 43,
+ "column": 37
+ },
+ "end": {
+ "offset": 1213,
+ "line": 43,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 1214,
+ "line": 43,
+ "column": 39
+ },
+ "end": {
+ "offset": 1216,
+ "line": 43,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1217,
+ "line": 43,
+ "column": 42
+ },
+ "end": {
+ "offset": 1221,
+ "line": 43,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 1222,
+ "line": 43,
+ "column": 47
+ },
+ "end": {
+ "offset": 1229,
+ "line": 43,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1230,
+ "line": 43,
+ "column": 55
+ },
+ "end": {
+ "offset": 1233,
+ "line": 43,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 1234,
+ "line": 43,
+ "column": 59
+ },
+ "end": {
+ "offset": 1244,
+ "line": 43,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 1245,
+ "line": 43,
+ "column": 70
+ },
+ "end": {
+ "offset": 1250,
+ "line": 43,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"Clamp close timeout\"",
+ "value": "Clamp close timeout",
+ "range": {
+ "start": {
+ "offset": 1251,
+ "line": 43,
+ "column": 76
+ },
+ "end": {
+ "offset": 1272,
+ "line": 43,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "place_path",
+ "operationId": "place_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "place_path",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "place_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "above_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.42000000000000004
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 53,
+ "column": 23
+ }
+ },
+ {
+ "id": "at_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.32
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.3297802811774664e-17,
+ 4.3297802811774664e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 54,
+ "column": 20
+ }
+ },
+ {
+ "id": "leave_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.42000000000000004
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 57,
+ "column": 23
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "after",
+ "pointId": "at_place",
+ "kind": "io",
+ "sourceMap": {
+ "line": 55,
+ "column": 26
+ },
+ "data": {
+ "statement": "io . do [ 1 ] = false",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1565,
+ "line": 55,
+ "column": 26
+ },
+ "end": {
+ "offset": 1567,
+ "line": 55,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1567,
+ "line": 55,
+ "column": 28
+ },
+ "end": {
+ "offset": 1568,
+ "line": 55,
+ "column": 29
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 1568,
+ "line": 55,
+ "column": 29
+ },
+ "end": {
+ "offset": 1570,
+ "line": 55,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1570,
+ "line": 55,
+ "column": 31
+ },
+ "end": {
+ "offset": 1571,
+ "line": 55,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1571,
+ "line": 55,
+ "column": 32
+ },
+ "end": {
+ "offset": 1572,
+ "line": 55,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1572,
+ "line": 55,
+ "column": 33
+ },
+ "end": {
+ "offset": 1573,
+ "line": 55,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 1574,
+ "line": 55,
+ "column": 35
+ },
+ "end": {
+ "offset": 1575,
+ "line": 55,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "false",
+ "value": "false",
+ "range": {
+ "start": {
+ "offset": 1576,
+ "line": 55,
+ "column": 37
+ },
+ "end": {
+ "offset": 1581,
+ "line": 55,
+ "column": 42
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "at_place",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 56,
+ "column": 26
+ },
+ "data": {
+ "statement": "wait io . di [ 2 ] == true timeout 2 s on_timeout alarm \"Clamp open timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 1607,
+ "line": 56,
+ "column": 26
+ },
+ "end": {
+ "offset": 1611,
+ "line": 56,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1612,
+ "line": 56,
+ "column": 31
+ },
+ "end": {
+ "offset": 1614,
+ "line": 56,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1614,
+ "line": 56,
+ "column": 33
+ },
+ "end": {
+ "offset": 1615,
+ "line": 56,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 1615,
+ "line": 56,
+ "column": 34
+ },
+ "end": {
+ "offset": 1617,
+ "line": 56,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1617,
+ "line": 56,
+ "column": 36
+ },
+ "end": {
+ "offset": 1618,
+ "line": 56,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1618,
+ "line": 56,
+ "column": 37
+ },
+ "end": {
+ "offset": 1619,
+ "line": 56,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1619,
+ "line": 56,
+ "column": 38
+ },
+ "end": {
+ "offset": 1620,
+ "line": 56,
+ "column": 39
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 1621,
+ "line": 56,
+ "column": 40
+ },
+ "end": {
+ "offset": 1623,
+ "line": 56,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1624,
+ "line": 56,
+ "column": 43
+ },
+ "end": {
+ "offset": 1628,
+ "line": 56,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 1629,
+ "line": 56,
+ "column": 48
+ },
+ "end": {
+ "offset": 1636,
+ "line": 56,
+ "column": 55
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1637,
+ "line": 56,
+ "column": 56
+ },
+ "end": {
+ "offset": 1640,
+ "line": 56,
+ "column": 59
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 1641,
+ "line": 56,
+ "column": 60
+ },
+ "end": {
+ "offset": 1651,
+ "line": 56,
+ "column": 70
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 1652,
+ "line": 56,
+ "column": 71
+ },
+ "end": {
+ "offset": 1657,
+ "line": 56,
+ "column": 76
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"Clamp open timeout\"",
+ "value": "Clamp open timeout",
+ "range": {
+ "start": {
+ "offset": 1658,
+ "line": 56,
+ "column": 77
+ },
+ "end": {
+ "offset": 1678,
+ "line": 56,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_99_FullSpecExample-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "pick_path",
+ "place_path"
+ ],
+ "operationIds": [
+ "pick_op",
+ "place_op"
+ ],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/io.json
new file mode 100644
index 0000000..8b73019
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_99_FullSpecExample-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/motion-queue.json
new file mode 100644
index 0000000..338f793
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/motion-queue.json
@@ -0,0 +1,1521 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "pick_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "pick_path",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "pick_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "approach",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 39,
+ "column": 20
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "above_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.4
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 40,
+ "column": 22
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "at_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.3
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.3297802811774664e-17,
+ 4.3297802811774664e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 19
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "leave_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.4
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 44,
+ "column": 22
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "after",
+ "pointId": "at_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 42,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 1 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1160,
+ "line": 42,
+ "column": 25
+ },
+ "end": {
+ "offset": 1162,
+ "line": 42,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1162,
+ "line": 42,
+ "column": 27
+ },
+ "end": {
+ "offset": 1163,
+ "line": 42,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 1163,
+ "line": 42,
+ "column": 28
+ },
+ "end": {
+ "offset": 1165,
+ "line": 42,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1165,
+ "line": 42,
+ "column": 30
+ },
+ "end": {
+ "offset": 1166,
+ "line": 42,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1166,
+ "line": 42,
+ "column": 31
+ },
+ "end": {
+ "offset": 1167,
+ "line": 42,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1167,
+ "line": 42,
+ "column": 32
+ },
+ "end": {
+ "offset": 1168,
+ "line": 42,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 1169,
+ "line": 42,
+ "column": 34
+ },
+ "end": {
+ "offset": 1170,
+ "line": 42,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1171,
+ "line": 42,
+ "column": 36
+ },
+ "end": {
+ "offset": 1175,
+ "line": 42,
+ "column": 40
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "at_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 43,
+ "column": 25
+ },
+ "data": {
+ "statement": "wait io . di [ 1 ] == true timeout 2 s on_timeout alarm \"Clamp close timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 1200,
+ "line": 43,
+ "column": 25
+ },
+ "end": {
+ "offset": 1204,
+ "line": 43,
+ "column": 29
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1205,
+ "line": 43,
+ "column": 30
+ },
+ "end": {
+ "offset": 1207,
+ "line": 43,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1207,
+ "line": 43,
+ "column": 32
+ },
+ "end": {
+ "offset": 1208,
+ "line": 43,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 1208,
+ "line": 43,
+ "column": 33
+ },
+ "end": {
+ "offset": 1210,
+ "line": 43,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1210,
+ "line": 43,
+ "column": 35
+ },
+ "end": {
+ "offset": 1211,
+ "line": 43,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1211,
+ "line": 43,
+ "column": 36
+ },
+ "end": {
+ "offset": 1212,
+ "line": 43,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1212,
+ "line": 43,
+ "column": 37
+ },
+ "end": {
+ "offset": 1213,
+ "line": 43,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 1214,
+ "line": 43,
+ "column": 39
+ },
+ "end": {
+ "offset": 1216,
+ "line": 43,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1217,
+ "line": 43,
+ "column": 42
+ },
+ "end": {
+ "offset": 1221,
+ "line": 43,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 1222,
+ "line": 43,
+ "column": 47
+ },
+ "end": {
+ "offset": 1229,
+ "line": 43,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1230,
+ "line": 43,
+ "column": 55
+ },
+ "end": {
+ "offset": 1233,
+ "line": 43,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 1234,
+ "line": 43,
+ "column": 59
+ },
+ "end": {
+ "offset": 1244,
+ "line": 43,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 1245,
+ "line": 43,
+ "column": 70
+ },
+ "end": {
+ "offset": 1250,
+ "line": 43,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"Clamp close timeout\"",
+ "value": "Clamp close timeout",
+ "range": {
+ "start": {
+ "offset": 1251,
+ "line": 43,
+ "column": 76
+ },
+ "end": {
+ "offset": 1272,
+ "line": 43,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "place_path",
+ "operationId": "place_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "place_path",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "place_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "above_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.42000000000000004
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 53,
+ "column": 23
+ }
+ },
+ {
+ "id": "at_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.32
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.3297802811774664e-17,
+ 4.3297802811774664e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 54,
+ "column": 20
+ }
+ },
+ {
+ "id": "leave_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.42000000000000004
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 57,
+ "column": 23
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "after",
+ "pointId": "at_place",
+ "kind": "io",
+ "sourceMap": {
+ "line": 55,
+ "column": 26
+ },
+ "data": {
+ "statement": "io . do [ 1 ] = false",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1565,
+ "line": 55,
+ "column": 26
+ },
+ "end": {
+ "offset": 1567,
+ "line": 55,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1567,
+ "line": 55,
+ "column": 28
+ },
+ "end": {
+ "offset": 1568,
+ "line": 55,
+ "column": 29
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 1568,
+ "line": 55,
+ "column": 29
+ },
+ "end": {
+ "offset": 1570,
+ "line": 55,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1570,
+ "line": 55,
+ "column": 31
+ },
+ "end": {
+ "offset": 1571,
+ "line": 55,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1571,
+ "line": 55,
+ "column": 32
+ },
+ "end": {
+ "offset": 1572,
+ "line": 55,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1572,
+ "line": 55,
+ "column": 33
+ },
+ "end": {
+ "offset": 1573,
+ "line": 55,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 1574,
+ "line": 55,
+ "column": 35
+ },
+ "end": {
+ "offset": 1575,
+ "line": 55,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "false",
+ "value": "false",
+ "range": {
+ "start": {
+ "offset": 1576,
+ "line": 55,
+ "column": 37
+ },
+ "end": {
+ "offset": 1581,
+ "line": 55,
+ "column": 42
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "at_place",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 56,
+ "column": 26
+ },
+ "data": {
+ "statement": "wait io . di [ 2 ] == true timeout 2 s on_timeout alarm \"Clamp open timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 1607,
+ "line": 56,
+ "column": 26
+ },
+ "end": {
+ "offset": 1611,
+ "line": 56,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1612,
+ "line": 56,
+ "column": 31
+ },
+ "end": {
+ "offset": 1614,
+ "line": 56,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1614,
+ "line": 56,
+ "column": 33
+ },
+ "end": {
+ "offset": 1615,
+ "line": 56,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 1615,
+ "line": 56,
+ "column": 34
+ },
+ "end": {
+ "offset": 1617,
+ "line": 56,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1617,
+ "line": 56,
+ "column": 36
+ },
+ "end": {
+ "offset": 1618,
+ "line": 56,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1618,
+ "line": 56,
+ "column": 37
+ },
+ "end": {
+ "offset": 1619,
+ "line": 56,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1619,
+ "line": 56,
+ "column": 38
+ },
+ "end": {
+ "offset": 1620,
+ "line": 56,
+ "column": 39
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 1621,
+ "line": 56,
+ "column": 40
+ },
+ "end": {
+ "offset": 1623,
+ "line": 56,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1624,
+ "line": 56,
+ "column": 43
+ },
+ "end": {
+ "offset": 1628,
+ "line": 56,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 1629,
+ "line": 56,
+ "column": 48
+ },
+ "end": {
+ "offset": 1636,
+ "line": 56,
+ "column": 55
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1637,
+ "line": 56,
+ "column": 56
+ },
+ "end": {
+ "offset": 1640,
+ "line": 56,
+ "column": 59
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 1641,
+ "line": 56,
+ "column": 60
+ },
+ "end": {
+ "offset": 1651,
+ "line": 56,
+ "column": 70
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 1652,
+ "line": 56,
+ "column": 71
+ },
+ "end": {
+ "offset": 1657,
+ "line": 56,
+ "column": 76
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"Clamp open timeout\"",
+ "value": "Clamp open timeout",
+ "range": {
+ "start": {
+ "offset": 1658,
+ "line": 56,
+ "column": 77
+ },
+ "end": {
+ "offset": 1678,
+ "line": 56,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/post-report.json
new file mode 100644
index 0000000..0db5c5f
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/post-report.json
@@ -0,0 +1,45 @@
+{
+ "filenames": [
+ "W2FullSpecExample.mod",
+ "W2FullSpecExample.ls",
+ "W2FullSpecExample.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/trace.json
new file mode 100644
index 0000000..1fca576
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/trace.json
@@ -0,0 +1,155 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2FullSpecExample",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2FullSpecExample"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:78:5",
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:78:5",
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/trajectory.json
new file mode 100644
index 0000000..2d5b5e0
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 32,
+ "duration": 1.92,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/compile.json
new file mode 100644
index 0000000..9c97d4d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/compile.json
@@ -0,0 +1,11 @@
+{
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/post-report.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/post-report.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/compile.json
new file mode 100644
index 0000000..9c97d4d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/compile.json
@@ -0,0 +1,11 @@
+{
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/post-report.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/post-report.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/compile.json
new file mode 100644
index 0000000..9c97d4d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/compile.json
@@ -0,0 +1,11 @@
+{
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/post-report.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/post-report.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/compile.json
new file mode 100644
index 0000000..9c97d4d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/compile.json
@@ -0,0 +1,11 @@
+{
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/post-report.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/post-report.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/compile.json
new file mode 100644
index 0000000..6d939b1
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2RuntimeTimeout",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 5,
+ "procedureCount": 2,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/controller.json
new file mode 100644
index 0000000..ac88b82
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/controller.json
@@ -0,0 +1,431 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "running",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:0": 0,
+ "$wait:main:1": 0.1
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "DI99 timeout",
+ "message": "DI99 timeout",
+ "severity": "warning",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "time": 0.1
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2RuntimeTimeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2RuntimeTimeout"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 4
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "timeout",
+ "elapsed": 0.1
+ },
+ "id": 5
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "DI99 timeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "DI99 timeout",
+ "severity": "warning"
+ },
+ "id": 6
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 8
+ }
+ ],
+ "currentSource": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "completed": false
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": false,
+ "io.di[6]": true,
+ "io.di[7]": false,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "scripts": []
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/io.json
new file mode 100644
index 0000000..2fb8400
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/io.json
@@ -0,0 +1,139 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": false,
+ "io.di[6]": true,
+ "io.di[7]": false,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "scripts": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/motion-queue.json
new file mode 100644
index 0000000..57085bb
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/motion-queue.json
@@ -0,0 +1,5 @@
+{
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/post-report.json
new file mode 100644
index 0000000..d9d6613
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2RuntimeTimeout.mod",
+ "W2RuntimeTimeout.ls",
+ "W2RuntimeTimeout.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/trace.json
new file mode 100644
index 0000000..fedfe64
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/trace.json
@@ -0,0 +1,165 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2RuntimeTimeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2RuntimeTimeout"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 4
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "timeout",
+ "elapsed": 0.1
+ },
+ "id": 5
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "DI99 timeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "DI99 timeout",
+ "severity": "warning"
+ },
+ "id": 6
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 8
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/trajectory.json
new file mode 100644
index 0000000..cb22e65
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/compile.json
new file mode 100644
index 0000000..4b5e199
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2BrandHints",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 1,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 7,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/post-report.json
new file mode 100644
index 0000000..d8d1d95
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/post-report.json
@@ -0,0 +1,45 @@
+{
+ "filenames": [
+ "W2BrandHints.mod",
+ "W2BrandHints.ls",
+ "W2BrandHints.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint fanuc ignored for abb",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint kuka ignored for abb",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint kuka ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for kuka",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint fanuc ignored for kuka",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/roundtrip.json
new file mode 100644
index 0000000..8d3ce25
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/roundtrip.json
@@ -0,0 +1,29 @@
+{
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2BrandHints.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/compile.json
new file mode 100644
index 0000000..64b7f0c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2CrossBrandMotion",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 6,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 10,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/post-report.json
new file mode 100644
index 0000000..e129436
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/post-report.json
@@ -0,0 +1,21 @@
+{
+ "filenames": [
+ "W2CrossBrandMotion.mod",
+ "W2CrossBrandMotion.ls",
+ "W2CrossBrandMotion.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for kuka",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/roundtrip.json
new file mode 100644
index 0000000..6a91bfc
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/roundtrip.json
@@ -0,0 +1,29 @@
+{
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2CrossBrandMotion.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/compile.json
new file mode 100644
index 0000000..2863696
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2Roundtrip",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 1,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/post-report.json
new file mode 100644
index 0000000..3290428
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/post-report.json
@@ -0,0 +1,27 @@
+{
+ "filenames": [
+ "W2Roundtrip.mod",
+ "W2Roundtrip.ls",
+ "W2Roundtrip.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/roundtrip.json
new file mode 100644
index 0000000..a9f636c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/roundtrip.json
@@ -0,0 +1,29 @@
+{
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2Roundtrip.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/report.html b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/report.html
new file mode 100644
index 0000000..7aec8c8
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/report.html
@@ -0,0 +1,40 @@
+
+
+
+
+ W2-JOB-20260628022836-51484d62
+
+
+
+ W2-JOB-20260628022836-51484d62
+ Suite working2-abb120-spec / Robot abb_irb120_3_58
+ Covered sections: 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25
+
+ | Program | Layer | Status | Diagnostics |
+ | W2_00_MinimalModule | Runtime | pass | 0 |
+| W2_10_DataTargetToolFrame | Runtime | pass | 8 |
+| W2_20_ExpressionMath | Runtime | pass | 0 |
+| W2_30_MotionAllTypes | Runtime | pass | 8 |
+| W2_40_PathEvents | Runtime | pass | 0 |
+| W2_50_OperationProcess | Runtime | pass | 0 |
+| W2_60_IOWaitPulse | Runtime | pass | 0 |
+| W2_70_ControlFlow | Runtime | pass | 45 |
+| W2_80_ProcFuncCall | Runtime | pass | 6 |
+| W2_90_ExceptionAlarm | Runtime | pass | 13 |
+| W2_99_FullSpecExample | Runtime | pass | 4 |
+| W2_E10_ExpressionDiagnostics | Static | diagnostic | 13 |
+| W2_E20_SemanticDiagnostics | Static | diagnostic | 6 |
+| W2_E30_MotionDiagnostics | Static | diagnostic | 4 |
+| W2_E40_ControlFlowDiagnostics | Static | diagnostic | 9 |
+| W2_E50_RuntimeTimeout | Runtime | diagnostic | 1 |
+| W2_P10_BrandHints | Post | pass | 10 |
+| W2_P20_CrossBrandMotion | Post | pass | 6 |
+| W2_P30_Roundtrip | Post | pass | 7 |
+
+
+
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/report.json
new file mode 100644
index 0000000..4264e24
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/report.json
@@ -0,0 +1,1409 @@
+{
+ "job_id": "W2-JOB-20260628022836-51484d62",
+ "suite_id": "working2-abb120-spec",
+ "robot_id": "abb_irb120_3_58",
+ "coverage": {
+ "specSections": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25
+ ],
+ "coveredSections": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25
+ ],
+ "missingSections": [],
+ "runtimePrograms": 12,
+ "staticPrograms": 4,
+ "postPrograms": 3
+ },
+ "summary": {
+ "programs": 19,
+ "pass": 14,
+ "diagnostic": 5,
+ "fail": 0
+ },
+ "diagnostics": [
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 37,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 37,
+ "column": 14
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 38,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 38,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_speed preserved as raw IR",
+ "sourceMap": {
+ "line": 39,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement vl preserved as raw IR",
+ "sourceMap": {
+ "line": 39,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_zone preserved as raw IR",
+ "sourceMap": {
+ "line": 40,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement z5 preserved as raw IR",
+ "sourceMap": {
+ "line": 40,
+ "column": 14
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 14
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_speed preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement vl preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_zone preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement z10 preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 14
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 18
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 24
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 31
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement elseif preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fault preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 12
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement == preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 18
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement true preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 21
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement FAULT preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"fault\" preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 19
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement else preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement NOT_READY preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"not ready\" preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 23
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement retry preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement = preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 1 preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement continue preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 18
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 24
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 31
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement case preserved as raw IR",
+ "sourceMap": {
+ "line": 26,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 1 preserved as raw IR",
+ "sourceMap": {
+ "line": 26,
+ "column": 12
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement MODE1 preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"mode 1\" preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 21
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement break preserved as raw IR",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement case preserved as raw IR",
+ "sourceMap": {
+ "line": 29,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 2 preserved as raw IR",
+ "sourceMap": {
+ "line": 29,
+ "column": 12
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 9
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 20
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 28
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 33
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement default preserved as raw IR",
+ "sourceMap": {
+ "line": 31,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 9
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement MODE_OTHER preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"mode other\" preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 18
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 24
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 31
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "warning",
+ "code": "GRL_P1_UNIMPLEMENTED",
+ "message": "trap recover_trap is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 6,
+ "column": 3
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "warning",
+ "code": "GRL_P1_UNIMPLEMENTED",
+ "message": "task background is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 9,
+ "column": 3
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement raise preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement E_PICK_FAILED preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement E_PICK_FAILED preserved as raw IR",
+ "sourceMap": {
+ "line": 17,
+ "column": 11
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement RECOVER preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"recovering\" preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 21
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement severity preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 34
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement warning preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 43
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement CLEANUP preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"cleanup\" preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 21
+ }
+ },
+ {
+ "program_id": "W2_99_FullSpecExample",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 74,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_99_FullSpecExample",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 74,
+ "column": 14
+ }
+ },
+ {
+ "program_id": "W2_99_FullSpecExample",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 75,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_99_FullSpecExample",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 75,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_SYMBOL",
+ "message": "Unknown constant missing_symbol",
+ "sourceMap": {
+ "line": 4,
+ "column": 41
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_SYMBOL",
+ "message": "Unknown constant missing_symbol",
+ "sourceMap": {
+ "line": 4,
+ "column": 41
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_FUNCTION",
+ "message": "Unknown function no_such_function",
+ "sourceMap": {
+ "line": 5,
+ "column": 43
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_ARITY",
+ "message": "atan2 expects 2 argument(s)",
+ "sourceMap": {
+ "line": 6,
+ "column": 36
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_DOMAIN",
+ "message": "Function argument is below domain",
+ "sourceMap": {
+ "line": 7,
+ "column": 33
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_DIV_ZERO",
+ "message": "Division by zero",
+ "sourceMap": {
+ "line": 8,
+ "column": 35
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_UNIT_MISMATCH",
+ "message": "Cannot combine length and time",
+ "sourceMap": {
+ "line": 9,
+ "column": 25
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_SYMBOL",
+ "message": "Unknown constant missing_symbol",
+ "sourceMap": {
+ "line": 4,
+ "column": 41
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_FUNCTION",
+ "message": "Unknown function no_such_function",
+ "sourceMap": {
+ "line": 5,
+ "column": 43
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_ARITY",
+ "message": "atan2 expects 2 argument(s)",
+ "sourceMap": {
+ "line": 6,
+ "column": 36
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_DOMAIN",
+ "message": "Function argument is below domain",
+ "sourceMap": {
+ "line": 7,
+ "column": 33
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_DIV_ZERO",
+ "message": "Division by zero",
+ "sourceMap": {
+ "line": 8,
+ "column": 35
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_UNIT_MISMATCH",
+ "message": "Cannot combine length and time",
+ "sourceMap": {
+ "line": 9,
+ "column": 25
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "severity": "error",
+ "code": "GRL_ARGUMENT_NOT_LVALUE",
+ "message": "out argument done must be a writable lvalue",
+ "sourceMap": {
+ "line": 15,
+ "column": 19
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "severity": "error",
+ "code": "GRL_SYMBOL_DUPLICATE",
+ "message": "Duplicate symbol v",
+ "sourceMap": {
+ "line": 4,
+ "column": 3
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "severity": "error",
+ "code": "GRL_ARGUMENT_NOT_LVALUE",
+ "message": "out argument done must be a writable lvalue",
+ "sourceMap": {
+ "line": 15,
+ "column": 19
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "severity": "error",
+ "code": "GRL_FUNC_SIDE_EFFECT",
+ "message": "Function bad_func cannot execute wait",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "severity": "error",
+ "code": "GRL_CALL_TARGET_NOT_FOUND",
+ "message": "Unknown call target missing_proc",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "severity": "error",
+ "code": "GRL_TARGET_NOT_FOUND",
+ "message": "Unknown target missing_target"
+ },
+ {
+ "program_id": "W2_E30_MotionDiagnostics",
+ "severity": "error",
+ "code": "GRL_PATH_EMPTY",
+ "message": "Path empty_path must contain at least one point"
+ },
+ {
+ "program_id": "W2_E30_MotionDiagnostics",
+ "severity": "error",
+ "code": "GRL_PATH_EMPTY",
+ "message": "Path empty_path must contain at least one point"
+ },
+ {
+ "program_id": "W2_E30_MotionDiagnostics",
+ "severity": "error",
+ "code": "KDL_JOINT_LIMIT",
+ "message": "joint_1 exceeds fixture limit",
+ "segmentId": "main:MOVEJ",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E30_MotionDiagnostics",
+ "severity": "error",
+ "code": "KDL_TARGET_UNREACHABLE",
+ "message": "Target main:MOVEL is outside ABB120 fixture workspace",
+ "segmentId": "main:MOVEL",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_CONTINUE_OUTSIDE_LOOP",
+ "message": "continue is only valid inside loop",
+ "sourceMap": {
+ "line": 6,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_SWITCH_CASE_DUPLICATE",
+ "message": "Duplicate switch case 1",
+ "sourceMap": {
+ "line": 14,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_SWITCH_CASE_NOT_CONSTANT",
+ "message": "switch case must be a constant expression",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_LABEL_NOT_FOUND",
+ "message": "Unknown label missing",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_JUMP_INTO_BLOCK",
+ "message": "jump cannot enter a nested or sibling block"
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E50_RuntimeTimeout",
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint fanuc ignored for abb",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint kuka ignored for abb",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint kuka ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint fanuc ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2BrandHints.mod",
+ "line": 3
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2CrossBrandMotion.mod",
+ "line": 3
+ }
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2Roundtrip.mod",
+ "line": 3
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/job.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/job.json
new file mode 100644
index 0000000..64a150b
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/job.json
@@ -0,0 +1,21619 @@
+{
+ "job_id": "W2-JOB-20260628024709-51484d62",
+ "suite_id": "working2-abb120-spec",
+ "robot_id": "abb_irb120_3_58",
+ "robot": {
+ "robotId": "abb_irb120_3_58",
+ "urdf": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n",
+ "loadOptions": {
+ "robotId": "abb_irb120_3_58",
+ "baseLink": "base_link",
+ "tipLink": "tool0"
+ },
+ "source": {
+ "repository": "https://github.com/ros-industrial/abb",
+ "branch": "noetic-devel",
+ "entrypoint": "abb_irb120_support/urdf/irb120_3_58.xacro",
+ "macro": "abb_irb120_support/urdf/irb120_3_58_macro.xacro"
+ },
+ "standardJoints": {
+ "home": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "approach": [
+ 0,
+ -0.4,
+ 0.5,
+ 0,
+ 0.2,
+ 0
+ ],
+ "pick": [
+ 0.2,
+ -0.35,
+ 0.45,
+ 0.1,
+ -0.2,
+ 0.3
+ ],
+ "place": [
+ -0.35,
+ -0.25,
+ 0.35,
+ -0.25,
+ 0.15,
+ -0.4
+ ]
+ }
+ },
+ "git_revision": "working-tree",
+ "manifest_hash": "ead98b6d28dd4ef6718c82ed930805c021547a79c74dd2fe5413d85f8896d67a",
+ "coverage": {
+ "specSections": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25
+ ],
+ "coveredSections": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25
+ ],
+ "missingSections": [],
+ "runtimePrograms": 12,
+ "staticPrograms": 4,
+ "postPrograms": 3
+ },
+ "programs": [
+ {
+ "program_id": "W2_00_MinimalModule",
+ "file": "runtime/W2_00_MinimalModule.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "4eae9a20aaf3becd68f0577a1a98c52ff25ec9dfdea700919e9920bd94945f59",
+ "spec_sections": [
+ 4,
+ 5,
+ 6,
+ 9,
+ 10,
+ 23
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628024709-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/compile.json",
+ "controllerJson": "W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/controller.json",
+ "motionQueueJson": "W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/motion-queue.json",
+ "traceJson": "W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/trace.json",
+ "ioJson": "W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/io.json",
+ "trajectoryJson": "W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/trajectory.json",
+ "postReportJson": "W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/post-report.json",
+ "roundtripJson": "W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/roundtrip.json",
+ "reportJson": "W2-JOB-20260628024709-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628024709-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2MinimalModule",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 1,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 4,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MinimalModule",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MinimalModule"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_00_MinimalModule-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MinimalModule",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MinimalModule"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_00_MinimalModule-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2MinimalModule.mod",
+ "W2MinimalModule.ls",
+ "W2MinimalModule.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "file": "runtime/W2_10_DataTargetToolFrame.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "6e7480a7195f219554aa1463e3fe832830d9af027a0c3748a740ff48936d1e3d",
+ "spec_sections": [
+ 6,
+ 8,
+ 9
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 37,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 37,
+ "column": 14
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 38,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 38,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_speed preserved as raw IR",
+ "sourceMap": {
+ "line": 39,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement vl preserved as raw IR",
+ "sourceMap": {
+ "line": 39,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_zone preserved as raw IR",
+ "sourceMap": {
+ "line": 40,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement z5 preserved as raw IR",
+ "sourceMap": {
+ "line": 40,
+ "column": 14
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628024709-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/compile.json",
+ "controllerJson": "W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/controller.json",
+ "motionQueueJson": "W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/motion-queue.json",
+ "traceJson": "W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/trace.json",
+ "ioJson": "W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/io.json",
+ "trajectoryJson": "W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/trajectory.json",
+ "postReportJson": "W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/post-report.json",
+ "roundtripJson": "W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/roundtrip.json",
+ "reportJson": "W2-JOB-20260628024709-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628024709-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2DataTargetToolFrame",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 19,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2DataTargetToolFrame",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2DataTargetToolFrame"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_10_DataTargetToolFrame-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2DataTargetToolFrame",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2DataTargetToolFrame"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_10_DataTargetToolFrame-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.5,
+ 0.03,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2DataTargetToolFrame.mod",
+ "W2DataTargetToolFrame.ls",
+ "W2DataTargetToolFrame.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_20_ExpressionMath",
+ "file": "runtime/W2_20_ExpressionMath.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "2e1afb8beaa60b2666056b1d6594a58da50a006c761e76ef131c9cfdd40c29b3",
+ "spec_sections": [
+ 7,
+ 9,
+ 13
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628024709-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/compile.json",
+ "controllerJson": "W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/controller.json",
+ "motionQueueJson": "W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/motion-queue.json",
+ "traceJson": "W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/trace.json",
+ "ioJson": "W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/io.json",
+ "trajectoryJson": "W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/trajectory.json",
+ "postReportJson": "W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/post-report.json",
+ "roundtripJson": "W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/roundtrip.json",
+ "reportJson": "W2-JOB-20260628024709-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628024709-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2ExpressionMath",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 2,
+ "kdlPathRequests": 0,
+ "symbolCount": 9,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:2": 0
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExpressionMath",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExpressionMath"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_20_ExpressionMath-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExpressionMath",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExpressionMath"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_20_ExpressionMath-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 8,
+ "duration": 0.48,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.45,
+ 0.04,
+ -0.2,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2ExpressionMath.mod",
+ "W2ExpressionMath.ls",
+ "W2ExpressionMath.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "file": "runtime/W2_30_MotionAllTypes.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "f851346e7e008aa85718895b6ba97010f3071027f6c3cd920dc5920c7cd6020c",
+ "spec_sections": [
+ 8,
+ 9,
+ 10
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 14
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_speed preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement vl preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_zone preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement z10 preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 14
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628024709-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/compile.json",
+ "controllerJson": "W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/controller.json",
+ "motionQueueJson": "W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/motion-queue.json",
+ "traceJson": "W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/trace.json",
+ "ioJson": "W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/io.json",
+ "trajectoryJson": "W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/trajectory.json",
+ "postReportJson": "W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/post-report.json",
+ "roundtripJson": "W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/roundtrip.json",
+ "reportJson": "W2-JOB-20260628024709-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628024709-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2MotionAllTypes",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 10,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MotionAllTypes",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MotionAllTypes"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_30_MotionAllTypes-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MotionAllTypes",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MotionAllTypes"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_30_MotionAllTypes-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.6,
+ 0,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2MotionAllTypes.mod",
+ "W2MotionAllTypes.ls",
+ "W2MotionAllTypes.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_40_PathEvents",
+ "file": "runtime/W2_40_PathEvents.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "86770c6d548271a2ae9f332b6bd4b84e52b513d41647df37f62b7e49a4b11942",
+ "spec_sections": [
+ 11,
+ 13,
+ 19
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628024709-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/compile.json",
+ "controllerJson": "W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/controller.json",
+ "motionQueueJson": "W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/motion-queue.json",
+ "traceJson": "W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/trace.json",
+ "ioJson": "W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/io.json",
+ "trajectoryJson": "W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/trajectory.json",
+ "postReportJson": "W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/post-report.json",
+ "roundtripJson": "W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/roundtrip.json",
+ "reportJson": "W2-JOB-20260628024709-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628024709-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2PathEvents",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 7,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2PathEvents",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2PathEvents"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "generated_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "generated_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "generated_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p_home",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_pick",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0.20000000169966334,
+ -0.3500000029744108,
+ 0.4500000038242425,
+ 0.10000000084983167,
+ -0.20000000169966334,
+ 0.300000002549495
+ ],
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_place",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.1500000012747475,
+ -0.4000000033993267
+ ],
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "before",
+ "pointId": "p_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 17,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 10 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 703,
+ "line": 17,
+ "column": 25
+ },
+ "end": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ },
+ "end": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ },
+ "end": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ },
+ "end": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ },
+ "end": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ },
+ "end": {
+ "offset": 712,
+ "line": 17,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 713,
+ "line": 17,
+ "column": 35
+ },
+ "end": {
+ "offset": 714,
+ "line": 17,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 715,
+ "line": 17,
+ "column": 37
+ },
+ "end": {
+ "offset": 719,
+ "line": 17,
+ "column": 41
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "p_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 19,
+ "column": 24
+ },
+ "data": {
+ "statement": "wait io . di [ 10 ] == true timeout 2 s on_timeout alarm \"pick sensor timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 780,
+ "line": 19,
+ "column": 24
+ },
+ "end": {
+ "offset": 784,
+ "line": 19,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 785,
+ "line": 19,
+ "column": 29
+ },
+ "end": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ },
+ "end": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ },
+ "end": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ },
+ "end": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ },
+ "end": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ },
+ "end": {
+ "offset": 794,
+ "line": 19,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 795,
+ "line": 19,
+ "column": 39
+ },
+ "end": {
+ "offset": 797,
+ "line": 19,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 798,
+ "line": 19,
+ "column": 42
+ },
+ "end": {
+ "offset": 802,
+ "line": 19,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 803,
+ "line": 19,
+ "column": 47
+ },
+ "end": {
+ "offset": 810,
+ "line": 19,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 811,
+ "line": 19,
+ "column": 55
+ },
+ "end": {
+ "offset": 814,
+ "line": 19,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 815,
+ "line": 19,
+ "column": 59
+ },
+ "end": {
+ "offset": 825,
+ "line": 19,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 826,
+ "line": 19,
+ "column": 70
+ },
+ "end": {
+ "offset": 831,
+ "line": 19,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"pick sensor timeout\"",
+ "value": "pick sensor timeout",
+ "range": {
+ "start": {
+ "offset": 832,
+ "line": 19,
+ "column": 76
+ },
+ "end": {
+ "offset": 853,
+ "line": 19,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_2",
+ "timing": "at",
+ "pointId": "p_place",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 21,
+ "column": 37
+ },
+ "data": {
+ "statement": "pulse io . do [ 11 ] duration 100 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 929,
+ "line": 21,
+ "column": 37
+ },
+ "end": {
+ "offset": 934,
+ "line": 21,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 935,
+ "line": 21,
+ "column": 43
+ },
+ "end": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ },
+ "end": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ },
+ "end": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ },
+ "end": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "11",
+ "value": 11,
+ "range": {
+ "start": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ },
+ "end": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ },
+ "end": {
+ "offset": 944,
+ "line": 21,
+ "column": 52
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 945,
+ "line": 21,
+ "column": 53
+ },
+ "end": {
+ "offset": 953,
+ "line": 21,
+ "column": 61
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "100 ms",
+ "value": 100,
+ "range": {
+ "start": {
+ "offset": 954,
+ "line": 21,
+ "column": 62
+ },
+ "end": {
+ "offset": 960,
+ "line": 21,
+ "column": 68
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.1
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_40_PathEvents-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "generated_path"
+ ],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "generated_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "generated_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "generated_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p_home",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_pick",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0.20000000169966334,
+ -0.3500000029744108,
+ 0.4500000038242425,
+ 0.10000000084983167,
+ -0.20000000169966334,
+ 0.300000002549495
+ ],
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_place",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.1500000012747475,
+ -0.4000000033993267
+ ],
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "before",
+ "pointId": "p_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 17,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 10 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 703,
+ "line": 17,
+ "column": 25
+ },
+ "end": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ },
+ "end": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ },
+ "end": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ },
+ "end": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ },
+ "end": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ },
+ "end": {
+ "offset": 712,
+ "line": 17,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 713,
+ "line": 17,
+ "column": 35
+ },
+ "end": {
+ "offset": 714,
+ "line": 17,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 715,
+ "line": 17,
+ "column": 37
+ },
+ "end": {
+ "offset": 719,
+ "line": 17,
+ "column": 41
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "p_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 19,
+ "column": 24
+ },
+ "data": {
+ "statement": "wait io . di [ 10 ] == true timeout 2 s on_timeout alarm \"pick sensor timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 780,
+ "line": 19,
+ "column": 24
+ },
+ "end": {
+ "offset": 784,
+ "line": 19,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 785,
+ "line": 19,
+ "column": 29
+ },
+ "end": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ },
+ "end": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ },
+ "end": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ },
+ "end": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ },
+ "end": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ },
+ "end": {
+ "offset": 794,
+ "line": 19,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 795,
+ "line": 19,
+ "column": 39
+ },
+ "end": {
+ "offset": 797,
+ "line": 19,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 798,
+ "line": 19,
+ "column": 42
+ },
+ "end": {
+ "offset": 802,
+ "line": 19,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 803,
+ "line": 19,
+ "column": 47
+ },
+ "end": {
+ "offset": 810,
+ "line": 19,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 811,
+ "line": 19,
+ "column": 55
+ },
+ "end": {
+ "offset": 814,
+ "line": 19,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 815,
+ "line": 19,
+ "column": 59
+ },
+ "end": {
+ "offset": 825,
+ "line": 19,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 826,
+ "line": 19,
+ "column": 70
+ },
+ "end": {
+ "offset": 831,
+ "line": 19,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"pick sensor timeout\"",
+ "value": "pick sensor timeout",
+ "range": {
+ "start": {
+ "offset": 832,
+ "line": 19,
+ "column": 76
+ },
+ "end": {
+ "offset": 853,
+ "line": 19,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_2",
+ "timing": "at",
+ "pointId": "p_place",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 21,
+ "column": 37
+ },
+ "data": {
+ "statement": "pulse io . do [ 11 ] duration 100 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 929,
+ "line": 21,
+ "column": 37
+ },
+ "end": {
+ "offset": 934,
+ "line": 21,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 935,
+ "line": 21,
+ "column": 43
+ },
+ "end": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ },
+ "end": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ },
+ "end": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ },
+ "end": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "11",
+ "value": 11,
+ "range": {
+ "start": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ },
+ "end": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ },
+ "end": {
+ "offset": 944,
+ "line": 21,
+ "column": 52
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 945,
+ "line": 21,
+ "column": 53
+ },
+ "end": {
+ "offset": 953,
+ "line": 21,
+ "column": 61
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "100 ms",
+ "value": 100,
+ "range": {
+ "start": {
+ "offset": 954,
+ "line": 21,
+ "column": 62
+ },
+ "end": {
+ "offset": 960,
+ "line": 21,
+ "column": 68
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.1
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2PathEvents",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2PathEvents"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_40_PathEvents-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.15000000127474747,
+ -0.4000000033993266
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2PathEvents.mod",
+ "W2PathEvents.ls",
+ "W2PathEvents.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_50_OperationProcess",
+ "file": "runtime/W2_50_OperationProcess.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "01b2232a6f30383d441f7cc73020fc44d0e752e807ff07f92af0ed9132afa1c6",
+ "spec_sections": [
+ 12,
+ 13
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628024709-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/compile.json",
+ "controllerJson": "W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/controller.json",
+ "motionQueueJson": "W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/motion-queue.json",
+ "traceJson": "W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/trace.json",
+ "ioJson": "W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/io.json",
+ "trajectoryJson": "W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/trajectory.json",
+ "postReportJson": "W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/post-report.json",
+ "roundtripJson": "W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/roundtrip.json",
+ "reportJson": "W2-JOB-20260628024709-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628024709-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2OperationProcess",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 6,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 1
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2OperationProcess",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2OperationProcess"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "start_action",
+ "statement": "io . do [ 1 ] = true",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "op_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "op_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "op_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "end_action",
+ "statement": "io . do [ 1 ] = false",
+ "sourceMap": {
+ "line": 21,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_50_OperationProcess-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "op_path"
+ ],
+ "operationIds": [
+ "pick_op"
+ ],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "start_action",
+ "statement": "io . do [ 1 ] = true",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "op_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "op_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "op_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "end_action",
+ "statement": "io . do [ 1 ] = false",
+ "sourceMap": {
+ "line": 21,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2OperationProcess",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2OperationProcess"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_50_OperationProcess-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2OperationProcess.mod",
+ "W2OperationProcess.ls",
+ "W2OperationProcess.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_60_IOWaitPulse",
+ "file": "runtime/W2_60_IOWaitPulse.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "b473d3fcbc92ba0e6d34790d12ff1367bfc89452744ae540ffd9b301fc7f2636",
+ "spec_sections": [
+ 13
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628024709-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/compile.json",
+ "controllerJson": "W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/controller.json",
+ "motionQueueJson": "W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/motion-queue.json",
+ "traceJson": "W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/trace.json",
+ "ioJson": "W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/io.json",
+ "trajectoryJson": "W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/trajectory.json",
+ "postReportJson": "W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/post-report.json",
+ "roundtripJson": "W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/roundtrip.json",
+ "reportJson": "W2-JOB-20260628024709-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628024709-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2IOWaitPulse",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 12,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 5,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 10,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 10
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:3": 0,
+ "$wait:main:4": 0,
+ "$wait:main:5": 0.1,
+ "$wait:main:6": 0.1,
+ "$wait:main:7": 0.1
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2IOWaitPulse",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2IOWaitPulse"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 11
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 12
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 13
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 14
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 15
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 16
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 17
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 18
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 19
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ]
+ },
+ "id": 20
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 21
+ },
+ {
+ "time": 0.1,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 22
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 10,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 23
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "io_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "io_path",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "io_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "at",
+ "pointId": "p0",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 9,
+ "column": 35
+ },
+ "data": {
+ "statement": "pulse io . do [ 20 ] duration 50 + 50 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 286,
+ "line": 9,
+ "column": 35
+ },
+ "end": {
+ "offset": 291,
+ "line": 9,
+ "column": 40
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 292,
+ "line": 9,
+ "column": 41
+ },
+ "end": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ },
+ "end": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ },
+ "end": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ },
+ "end": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "20",
+ "value": 20,
+ "range": {
+ "start": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ },
+ "end": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ },
+ "end": {
+ "offset": 301,
+ "line": 9,
+ "column": 50
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 302,
+ "line": 9,
+ "column": 51
+ },
+ "end": {
+ "offset": 310,
+ "line": 9,
+ "column": 59
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 311,
+ "line": 9,
+ "column": 60
+ },
+ "end": {
+ "offset": 313,
+ "line": 9,
+ "column": 62
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "+",
+ "value": "+",
+ "range": {
+ "start": {
+ "offset": 314,
+ "line": 9,
+ "column": 63
+ },
+ "end": {
+ "offset": 315,
+ "line": 9,
+ "column": 64
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50 ms",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 316,
+ "line": 9,
+ "column": 65
+ },
+ "end": {
+ "offset": 321,
+ "line": 9,
+ "column": 70
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.05
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75,
+ "io.do[1]": true,
+ "io.ao[1]": 0.75,
+ "io.go[1]": 3,
+ "io.do[2]": true
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ },
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ },
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ },
+ {
+ "id": 13,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 14,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 15,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_60_IOWaitPulse-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "io_path"
+ ],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "io_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "io_path",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "io_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "at",
+ "pointId": "p0",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 9,
+ "column": 35
+ },
+ "data": {
+ "statement": "pulse io . do [ 20 ] duration 50 + 50 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 286,
+ "line": 9,
+ "column": 35
+ },
+ "end": {
+ "offset": 291,
+ "line": 9,
+ "column": 40
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 292,
+ "line": 9,
+ "column": 41
+ },
+ "end": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ },
+ "end": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ },
+ "end": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ },
+ "end": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "20",
+ "value": 20,
+ "range": {
+ "start": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ },
+ "end": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ },
+ "end": {
+ "offset": 301,
+ "line": 9,
+ "column": 50
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 302,
+ "line": 9,
+ "column": 51
+ },
+ "end": {
+ "offset": 310,
+ "line": 9,
+ "column": 59
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 311,
+ "line": 9,
+ "column": 60
+ },
+ "end": {
+ "offset": 313,
+ "line": 9,
+ "column": 62
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "+",
+ "value": "+",
+ "range": {
+ "start": {
+ "offset": 314,
+ "line": 9,
+ "column": 63
+ },
+ "end": {
+ "offset": 315,
+ "line": 9,
+ "column": 64
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50 ms",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 316,
+ "line": 9,
+ "column": 65
+ },
+ "end": {
+ "offset": 321,
+ "line": 9,
+ "column": 70
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.05
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2IOWaitPulse",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2IOWaitPulse"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 11
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 12
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 13
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 14
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 15
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 16
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 17
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 18
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 19
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ]
+ },
+ "id": 20
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 21
+ },
+ {
+ "time": 0.1,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 22
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 10,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 23
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75,
+ "io.do[1]": true,
+ "io.ao[1]": 0.75,
+ "io.go[1]": 3,
+ "io.do[2]": true
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ },
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ },
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ },
+ {
+ "id": 13,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 14,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 15,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_60_IOWaitPulse-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2IOWaitPulse.mod",
+ "W2IOWaitPulse.ls",
+ "W2IOWaitPulse.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "file": "runtime/W2_70_ControlFlow.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "516fe162d1032f7a3d65c2b632ea10bafb95b10b38ccb15f77db79f86f0aaa7c",
+ "spec_sections": [
+ 14
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 18
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 24
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 26
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 31
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement elseif preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fault preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 12
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement == preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 18
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement true preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 21
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement FAULT preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"fault\" preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 19
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement else preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement NOT_READY preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"not ready\" preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 23
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement retry preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement = preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 1 preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement continue preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 18
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 24
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 26
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 31
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement case preserved as raw IR",
+ "sourceMap": {
+ "line": 26,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 1 preserved as raw IR",
+ "sourceMap": {
+ "line": 26,
+ "column": 12
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement MODE1 preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"mode 1\" preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 21
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement break preserved as raw IR",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement case preserved as raw IR",
+ "sourceMap": {
+ "line": 29,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 2 preserved as raw IR",
+ "sourceMap": {
+ "line": 29,
+ "column": 12
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 9
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 20
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 26
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 28
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 33
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement default preserved as raw IR",
+ "sourceMap": {
+ "line": 31,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 9
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement MODE_OTHER preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"mode other\" preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 26
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628024709-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/compile.json",
+ "controllerJson": "W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/controller.json",
+ "motionQueueJson": "W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/motion-queue.json",
+ "traceJson": "W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/trace.json",
+ "ioJson": "W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/io.json",
+ "trajectoryJson": "W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/trajectory.json",
+ "postReportJson": "W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/post-report.json",
+ "roundtripJson": "W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/roundtrip.json",
+ "reportJson": "W2-JOB-20260628024709-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628024709-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2ControlFlow",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 14,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 8,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 8
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ },
+ {
+ "id": "else:0",
+ "variables": {
+ "i": 1
+ }
+ },
+ {
+ "id": "for:3",
+ "variables": {}
+ },
+ {
+ "id": "switch:5",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "NOT_READY",
+ "message": "not ready",
+ "severity": "error",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "time": 0
+ },
+ {
+ "id": "MODE1",
+ "message": "mode 1",
+ "severity": "error",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "time": 0.1
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ControlFlow",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ControlFlow"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 1,
+ "message": "not ready",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "NOT_READY",
+ "severity": "error"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "EXEC_WHILE",
+ "source": {
+ "kind": "EXEC_WHILE",
+ "id": "main:EXEC_WHILE:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "EXEC_FOR",
+ "source": {
+ "kind": "EXEC_FOR",
+ "id": "main:EXEC_FOR:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:23:7",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "EXEC_SWITCH",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "BREAK",
+ "source": {
+ "kind": "BREAK",
+ "id": "main:BREAK:28:9",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "info",
+ "code": "VC_BREAK",
+ "message": "BREAK reached",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ "id": 11
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 7,
+ "message": "mode 1",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "MODE1",
+ "severity": "error"
+ },
+ "id": 12
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "id": 13
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_70_ControlFlow-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ControlFlow",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ControlFlow"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 1,
+ "message": "not ready",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "NOT_READY",
+ "severity": "error"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "EXEC_WHILE",
+ "source": {
+ "kind": "EXEC_WHILE",
+ "id": "main:EXEC_WHILE:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "EXEC_FOR",
+ "source": {
+ "kind": "EXEC_FOR",
+ "id": "main:EXEC_FOR:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:23:7",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "EXEC_SWITCH",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "BREAK",
+ "source": {
+ "kind": "BREAK",
+ "id": "main:BREAK:28:9",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "info",
+ "code": "VC_BREAK",
+ "message": "BREAK reached",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ "id": 11
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 7,
+ "message": "mode 1",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "MODE1",
+ "severity": "error"
+ },
+ "id": 12
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "id": 13
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_70_ControlFlow-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2ControlFlow.mod",
+ "W2ControlFlow.ls",
+ "W2ControlFlow.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "file": "runtime/W2_80_ProcFuncCall.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "701334663d6a215852dbe4c78b3025ebcda5e318513a1e73ab0e6518c49788d5",
+ "spec_sections": [
+ 15
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 18
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 24
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 26
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 31
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628024709-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/compile.json",
+ "controllerJson": "W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/controller.json",
+ "motionQueueJson": "W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/motion-queue.json",
+ "traceJson": "W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/trace.json",
+ "ioJson": "W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/io.json",
+ "trajectoryJson": "W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/trajectory.json",
+ "postReportJson": "W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/post-report.json",
+ "roundtripJson": "W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/roundtrip.json",
+ "reportJson": "W2-JOB-20260628024709-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628024709-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2ProcFuncCall",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 9,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 8,
+ "procedureCount": 3,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 5,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 5
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ProcFuncCall",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ProcFuncCall"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call read_part",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "read_part:RAW_STATEMENT:8:5",
+ "sourceMap": {
+ "line": 8,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 3,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "CALL",
+ "id": "main:CALL:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call increment_retry",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 8
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "increment_retry:RAW_STATEMENT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RETURN",
+ "source": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 11
+ }
+ ],
+ "currentSource": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "completed": true
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_80_ProcFuncCall-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ProcFuncCall",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ProcFuncCall"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call read_part",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "read_part:RAW_STATEMENT:8:5",
+ "sourceMap": {
+ "line": 8,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 3,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "CALL",
+ "id": "main:CALL:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call increment_retry",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 8
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "increment_retry:RAW_STATEMENT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RETURN",
+ "source": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 11
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_80_ProcFuncCall-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2ProcFuncCall.mod",
+ "W2ProcFuncCall.ls",
+ "W2ProcFuncCall.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "file": "runtime/W2_90_ExceptionAlarm.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "494455105f84d035ce785747ee5dde77d85db6fb2bd907d1774d1de14e61a6a0",
+ "spec_sections": [
+ 16,
+ 17
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "GRL_P1_UNIMPLEMENTED",
+ "message": "trap recover_trap is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 6,
+ "column": 3
+ }
+ },
+ {
+ "severity": "warning",
+ "code": "GRL_P1_UNIMPLEMENTED",
+ "message": "task background is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 9,
+ "column": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement raise preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement E_PICK_FAILED preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement E_PICK_FAILED preserved as raw IR",
+ "sourceMap": {
+ "line": 17,
+ "column": 11
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement RECOVER preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"recovering\" preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 21
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement severity preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 34
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement warning preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 43
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement CLEANUP preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"cleanup\" preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 21
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628024709-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/compile.json",
+ "controllerJson": "W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/controller.json",
+ "motionQueueJson": "W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/motion-queue.json",
+ "traceJson": "W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/trace.json",
+ "ioJson": "W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/io.json",
+ "trajectoryJson": "W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/trajectory.json",
+ "postReportJson": "W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/post-report.json",
+ "roundtripJson": "W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/roundtrip.json",
+ "reportJson": "W2-JOB-20260628024709-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628024709-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2ExceptionAlarm",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 5,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 6,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 5,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 5
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "START",
+ "message": "start",
+ "severity": "info",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "time": 0
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExceptionAlarm",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExceptionAlarm"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "start",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "START",
+ "severity": "info"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "enable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ }
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:23:5",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "disable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ }
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 10
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_90_ExceptionAlarm-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExceptionAlarm",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExceptionAlarm"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "start",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "START",
+ "severity": "info"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "enable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ }
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:23:5",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "disable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ }
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 10
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_90_ExceptionAlarm-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2ExceptionAlarm.mod",
+ "W2ExceptionAlarm.ls",
+ "W2ExceptionAlarm.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_99_FullSpecExample",
+ "file": "runtime/W2_99_FullSpecExample.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "cd08e3c9c9c522b75f37f404b4fb915b4af8477ccca5d2f5fc1bed61c9c66024",
+ "spec_sections": [
+ 24
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 74,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 74,
+ "column": 14
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 75,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 75,
+ "column": 15
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628024709-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/compile.json",
+ "controllerJson": "W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/controller.json",
+ "motionQueueJson": "W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/motion-queue.json",
+ "traceJson": "W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/trace.json",
+ "ioJson": "W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/io.json",
+ "trajectoryJson": "W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/trajectory.json",
+ "postReportJson": "W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/post-report.json",
+ "roundtripJson": "W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/roundtrip.json",
+ "reportJson": "W2-JOB-20260628024709-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628024709-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2FullSpecExample",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 14,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 2,
+ "symbolCount": 13,
+ "procedureCount": 1,
+ "pathCount": 2,
+ "operationCount": 2
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2FullSpecExample",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2FullSpecExample"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:78:5",
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:78:5",
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "pick_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "pick_path",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "pick_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "approach",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 39,
+ "column": 20
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "above_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.4
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 40,
+ "column": 22
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "at_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.3
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.3297802811774664e-17,
+ 4.3297802811774664e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 19
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "leave_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.4
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 44,
+ "column": 22
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "after",
+ "pointId": "at_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 42,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 1 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1160,
+ "line": 42,
+ "column": 25
+ },
+ "end": {
+ "offset": 1162,
+ "line": 42,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1162,
+ "line": 42,
+ "column": 27
+ },
+ "end": {
+ "offset": 1163,
+ "line": 42,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 1163,
+ "line": 42,
+ "column": 28
+ },
+ "end": {
+ "offset": 1165,
+ "line": 42,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1165,
+ "line": 42,
+ "column": 30
+ },
+ "end": {
+ "offset": 1166,
+ "line": 42,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1166,
+ "line": 42,
+ "column": 31
+ },
+ "end": {
+ "offset": 1167,
+ "line": 42,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1167,
+ "line": 42,
+ "column": 32
+ },
+ "end": {
+ "offset": 1168,
+ "line": 42,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 1169,
+ "line": 42,
+ "column": 34
+ },
+ "end": {
+ "offset": 1170,
+ "line": 42,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1171,
+ "line": 42,
+ "column": 36
+ },
+ "end": {
+ "offset": 1175,
+ "line": 42,
+ "column": 40
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "at_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 43,
+ "column": 25
+ },
+ "data": {
+ "statement": "wait io . di [ 1 ] == true timeout 2 s on_timeout alarm \"Clamp close timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 1200,
+ "line": 43,
+ "column": 25
+ },
+ "end": {
+ "offset": 1204,
+ "line": 43,
+ "column": 29
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1205,
+ "line": 43,
+ "column": 30
+ },
+ "end": {
+ "offset": 1207,
+ "line": 43,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1207,
+ "line": 43,
+ "column": 32
+ },
+ "end": {
+ "offset": 1208,
+ "line": 43,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 1208,
+ "line": 43,
+ "column": 33
+ },
+ "end": {
+ "offset": 1210,
+ "line": 43,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1210,
+ "line": 43,
+ "column": 35
+ },
+ "end": {
+ "offset": 1211,
+ "line": 43,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1211,
+ "line": 43,
+ "column": 36
+ },
+ "end": {
+ "offset": 1212,
+ "line": 43,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1212,
+ "line": 43,
+ "column": 37
+ },
+ "end": {
+ "offset": 1213,
+ "line": 43,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 1214,
+ "line": 43,
+ "column": 39
+ },
+ "end": {
+ "offset": 1216,
+ "line": 43,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1217,
+ "line": 43,
+ "column": 42
+ },
+ "end": {
+ "offset": 1221,
+ "line": 43,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 1222,
+ "line": 43,
+ "column": 47
+ },
+ "end": {
+ "offset": 1229,
+ "line": 43,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1230,
+ "line": 43,
+ "column": 55
+ },
+ "end": {
+ "offset": 1233,
+ "line": 43,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 1234,
+ "line": 43,
+ "column": 59
+ },
+ "end": {
+ "offset": 1244,
+ "line": 43,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 1245,
+ "line": 43,
+ "column": 70
+ },
+ "end": {
+ "offset": 1250,
+ "line": 43,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"Clamp close timeout\"",
+ "value": "Clamp close timeout",
+ "range": {
+ "start": {
+ "offset": 1251,
+ "line": 43,
+ "column": 76
+ },
+ "end": {
+ "offset": 1272,
+ "line": 43,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "place_path",
+ "operationId": "place_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "place_path",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "place_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "above_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.42000000000000004
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 53,
+ "column": 23
+ }
+ },
+ {
+ "id": "at_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.32
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.3297802811774664e-17,
+ 4.3297802811774664e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 54,
+ "column": 20
+ }
+ },
+ {
+ "id": "leave_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.42000000000000004
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 57,
+ "column": 23
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "after",
+ "pointId": "at_place",
+ "kind": "io",
+ "sourceMap": {
+ "line": 55,
+ "column": 26
+ },
+ "data": {
+ "statement": "io . do [ 1 ] = false",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1565,
+ "line": 55,
+ "column": 26
+ },
+ "end": {
+ "offset": 1567,
+ "line": 55,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1567,
+ "line": 55,
+ "column": 28
+ },
+ "end": {
+ "offset": 1568,
+ "line": 55,
+ "column": 29
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 1568,
+ "line": 55,
+ "column": 29
+ },
+ "end": {
+ "offset": 1570,
+ "line": 55,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1570,
+ "line": 55,
+ "column": 31
+ },
+ "end": {
+ "offset": 1571,
+ "line": 55,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1571,
+ "line": 55,
+ "column": 32
+ },
+ "end": {
+ "offset": 1572,
+ "line": 55,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1572,
+ "line": 55,
+ "column": 33
+ },
+ "end": {
+ "offset": 1573,
+ "line": 55,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 1574,
+ "line": 55,
+ "column": 35
+ },
+ "end": {
+ "offset": 1575,
+ "line": 55,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "false",
+ "value": "false",
+ "range": {
+ "start": {
+ "offset": 1576,
+ "line": 55,
+ "column": 37
+ },
+ "end": {
+ "offset": 1581,
+ "line": 55,
+ "column": 42
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "at_place",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 56,
+ "column": 26
+ },
+ "data": {
+ "statement": "wait io . di [ 2 ] == true timeout 2 s on_timeout alarm \"Clamp open timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 1607,
+ "line": 56,
+ "column": 26
+ },
+ "end": {
+ "offset": 1611,
+ "line": 56,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1612,
+ "line": 56,
+ "column": 31
+ },
+ "end": {
+ "offset": 1614,
+ "line": 56,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1614,
+ "line": 56,
+ "column": 33
+ },
+ "end": {
+ "offset": 1615,
+ "line": 56,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 1615,
+ "line": 56,
+ "column": 34
+ },
+ "end": {
+ "offset": 1617,
+ "line": 56,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1617,
+ "line": 56,
+ "column": 36
+ },
+ "end": {
+ "offset": 1618,
+ "line": 56,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1618,
+ "line": 56,
+ "column": 37
+ },
+ "end": {
+ "offset": 1619,
+ "line": 56,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1619,
+ "line": 56,
+ "column": 38
+ },
+ "end": {
+ "offset": 1620,
+ "line": 56,
+ "column": 39
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 1621,
+ "line": 56,
+ "column": 40
+ },
+ "end": {
+ "offset": 1623,
+ "line": 56,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1624,
+ "line": 56,
+ "column": 43
+ },
+ "end": {
+ "offset": 1628,
+ "line": 56,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 1629,
+ "line": 56,
+ "column": 48
+ },
+ "end": {
+ "offset": 1636,
+ "line": 56,
+ "column": 55
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1637,
+ "line": 56,
+ "column": 56
+ },
+ "end": {
+ "offset": 1640,
+ "line": 56,
+ "column": 59
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 1641,
+ "line": 56,
+ "column": 60
+ },
+ "end": {
+ "offset": 1651,
+ "line": 56,
+ "column": 70
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 1652,
+ "line": 56,
+ "column": 71
+ },
+ "end": {
+ "offset": 1657,
+ "line": 56,
+ "column": 76
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"Clamp open timeout\"",
+ "value": "Clamp open timeout",
+ "range": {
+ "start": {
+ "offset": 1658,
+ "line": 56,
+ "column": 77
+ },
+ "end": {
+ "offset": 1678,
+ "line": 56,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_99_FullSpecExample-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "pick_path",
+ "place_path"
+ ],
+ "operationIds": [
+ "pick_op",
+ "place_op"
+ ],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "pick_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "pick_path",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "pick_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "approach",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 39,
+ "column": 20
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "above_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.4
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 40,
+ "column": 22
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "at_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.3
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.3297802811774664e-17,
+ 4.3297802811774664e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 19
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "leave_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.4
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 44,
+ "column": 22
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "after",
+ "pointId": "at_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 42,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 1 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1160,
+ "line": 42,
+ "column": 25
+ },
+ "end": {
+ "offset": 1162,
+ "line": 42,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1162,
+ "line": 42,
+ "column": 27
+ },
+ "end": {
+ "offset": 1163,
+ "line": 42,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 1163,
+ "line": 42,
+ "column": 28
+ },
+ "end": {
+ "offset": 1165,
+ "line": 42,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1165,
+ "line": 42,
+ "column": 30
+ },
+ "end": {
+ "offset": 1166,
+ "line": 42,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1166,
+ "line": 42,
+ "column": 31
+ },
+ "end": {
+ "offset": 1167,
+ "line": 42,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1167,
+ "line": 42,
+ "column": 32
+ },
+ "end": {
+ "offset": 1168,
+ "line": 42,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 1169,
+ "line": 42,
+ "column": 34
+ },
+ "end": {
+ "offset": 1170,
+ "line": 42,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1171,
+ "line": 42,
+ "column": 36
+ },
+ "end": {
+ "offset": 1175,
+ "line": 42,
+ "column": 40
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "at_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 43,
+ "column": 25
+ },
+ "data": {
+ "statement": "wait io . di [ 1 ] == true timeout 2 s on_timeout alarm \"Clamp close timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 1200,
+ "line": 43,
+ "column": 25
+ },
+ "end": {
+ "offset": 1204,
+ "line": 43,
+ "column": 29
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1205,
+ "line": 43,
+ "column": 30
+ },
+ "end": {
+ "offset": 1207,
+ "line": 43,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1207,
+ "line": 43,
+ "column": 32
+ },
+ "end": {
+ "offset": 1208,
+ "line": 43,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 1208,
+ "line": 43,
+ "column": 33
+ },
+ "end": {
+ "offset": 1210,
+ "line": 43,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1210,
+ "line": 43,
+ "column": 35
+ },
+ "end": {
+ "offset": 1211,
+ "line": 43,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1211,
+ "line": 43,
+ "column": 36
+ },
+ "end": {
+ "offset": 1212,
+ "line": 43,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1212,
+ "line": 43,
+ "column": 37
+ },
+ "end": {
+ "offset": 1213,
+ "line": 43,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 1214,
+ "line": 43,
+ "column": 39
+ },
+ "end": {
+ "offset": 1216,
+ "line": 43,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1217,
+ "line": 43,
+ "column": 42
+ },
+ "end": {
+ "offset": 1221,
+ "line": 43,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 1222,
+ "line": 43,
+ "column": 47
+ },
+ "end": {
+ "offset": 1229,
+ "line": 43,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1230,
+ "line": 43,
+ "column": 55
+ },
+ "end": {
+ "offset": 1233,
+ "line": 43,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 1234,
+ "line": 43,
+ "column": 59
+ },
+ "end": {
+ "offset": 1244,
+ "line": 43,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 1245,
+ "line": 43,
+ "column": 70
+ },
+ "end": {
+ "offset": 1250,
+ "line": 43,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"Clamp close timeout\"",
+ "value": "Clamp close timeout",
+ "range": {
+ "start": {
+ "offset": 1251,
+ "line": 43,
+ "column": 76
+ },
+ "end": {
+ "offset": 1272,
+ "line": 43,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "place_path",
+ "operationId": "place_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "place_path",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "place_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "above_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.42000000000000004
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 53,
+ "column": 23
+ }
+ },
+ {
+ "id": "at_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.32
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.3297802811774664e-17,
+ 4.3297802811774664e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 54,
+ "column": 20
+ }
+ },
+ {
+ "id": "leave_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.42000000000000004
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 57,
+ "column": 23
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "after",
+ "pointId": "at_place",
+ "kind": "io",
+ "sourceMap": {
+ "line": 55,
+ "column": 26
+ },
+ "data": {
+ "statement": "io . do [ 1 ] = false",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1565,
+ "line": 55,
+ "column": 26
+ },
+ "end": {
+ "offset": 1567,
+ "line": 55,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1567,
+ "line": 55,
+ "column": 28
+ },
+ "end": {
+ "offset": 1568,
+ "line": 55,
+ "column": 29
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 1568,
+ "line": 55,
+ "column": 29
+ },
+ "end": {
+ "offset": 1570,
+ "line": 55,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1570,
+ "line": 55,
+ "column": 31
+ },
+ "end": {
+ "offset": 1571,
+ "line": 55,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1571,
+ "line": 55,
+ "column": 32
+ },
+ "end": {
+ "offset": 1572,
+ "line": 55,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1572,
+ "line": 55,
+ "column": 33
+ },
+ "end": {
+ "offset": 1573,
+ "line": 55,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 1574,
+ "line": 55,
+ "column": 35
+ },
+ "end": {
+ "offset": 1575,
+ "line": 55,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "false",
+ "value": "false",
+ "range": {
+ "start": {
+ "offset": 1576,
+ "line": 55,
+ "column": 37
+ },
+ "end": {
+ "offset": 1581,
+ "line": 55,
+ "column": 42
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "at_place",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 56,
+ "column": 26
+ },
+ "data": {
+ "statement": "wait io . di [ 2 ] == true timeout 2 s on_timeout alarm \"Clamp open timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 1607,
+ "line": 56,
+ "column": 26
+ },
+ "end": {
+ "offset": 1611,
+ "line": 56,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1612,
+ "line": 56,
+ "column": 31
+ },
+ "end": {
+ "offset": 1614,
+ "line": 56,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1614,
+ "line": 56,
+ "column": 33
+ },
+ "end": {
+ "offset": 1615,
+ "line": 56,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 1615,
+ "line": 56,
+ "column": 34
+ },
+ "end": {
+ "offset": 1617,
+ "line": 56,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1617,
+ "line": 56,
+ "column": 36
+ },
+ "end": {
+ "offset": 1618,
+ "line": 56,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1618,
+ "line": 56,
+ "column": 37
+ },
+ "end": {
+ "offset": 1619,
+ "line": 56,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1619,
+ "line": 56,
+ "column": 38
+ },
+ "end": {
+ "offset": 1620,
+ "line": 56,
+ "column": 39
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 1621,
+ "line": 56,
+ "column": 40
+ },
+ "end": {
+ "offset": 1623,
+ "line": 56,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1624,
+ "line": 56,
+ "column": 43
+ },
+ "end": {
+ "offset": 1628,
+ "line": 56,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 1629,
+ "line": 56,
+ "column": 48
+ },
+ "end": {
+ "offset": 1636,
+ "line": 56,
+ "column": 55
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1637,
+ "line": 56,
+ "column": 56
+ },
+ "end": {
+ "offset": 1640,
+ "line": 56,
+ "column": 59
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 1641,
+ "line": 56,
+ "column": 60
+ },
+ "end": {
+ "offset": 1651,
+ "line": 56,
+ "column": 70
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 1652,
+ "line": 56,
+ "column": 71
+ },
+ "end": {
+ "offset": 1657,
+ "line": 56,
+ "column": 76
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"Clamp open timeout\"",
+ "value": "Clamp open timeout",
+ "range": {
+ "start": {
+ "offset": 1658,
+ "line": 56,
+ "column": 77
+ },
+ "end": {
+ "offset": 1678,
+ "line": 56,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2FullSpecExample",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2FullSpecExample"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:78:5",
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:78:5",
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_99_FullSpecExample-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 32,
+ "duration": 1.92,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2FullSpecExample.mod",
+ "W2FullSpecExample.ls",
+ "W2FullSpecExample.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "file": "static/W2_E10_ExpressionDiagnostics.grl",
+ "coverage_level": "Static",
+ "expected_status": "diagnostic",
+ "status": "diagnostic",
+ "input_hash": "c08db186d16a8bc3f0ecb4731abb6601d8c69348fd08ca6b21b8848f32df2347",
+ "spec_sections": [
+ 7,
+ 22
+ ],
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_SYMBOL",
+ "message": "Unknown constant missing_symbol",
+ "sourceMap": {
+ "line": 4,
+ "column": 41
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_SYMBOL",
+ "message": "Unknown constant missing_symbol",
+ "sourceMap": {
+ "line": 4,
+ "column": 41
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_FUNCTION",
+ "message": "Unknown function no_such_function",
+ "sourceMap": {
+ "line": 5,
+ "column": 43
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_ARITY",
+ "message": "atan2 expects 2 argument(s)",
+ "sourceMap": {
+ "line": 6,
+ "column": 36
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_DOMAIN",
+ "message": "Function argument is below domain",
+ "sourceMap": {
+ "line": 7,
+ "column": 33
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_DIV_ZERO",
+ "message": "Division by zero",
+ "sourceMap": {
+ "line": 8,
+ "column": 35
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_UNIT_MISMATCH",
+ "message": "Cannot combine length and time",
+ "sourceMap": {
+ "line": 9,
+ "column": 25
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_SYMBOL",
+ "message": "Unknown constant missing_symbol",
+ "sourceMap": {
+ "line": 4,
+ "column": 41
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_FUNCTION",
+ "message": "Unknown function no_such_function",
+ "sourceMap": {
+ "line": 5,
+ "column": 43
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_ARITY",
+ "message": "atan2 expects 2 argument(s)",
+ "sourceMap": {
+ "line": 6,
+ "column": 36
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_DOMAIN",
+ "message": "Function argument is below domain",
+ "sourceMap": {
+ "line": 7,
+ "column": 33
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_DIV_ZERO",
+ "message": "Division by zero",
+ "sourceMap": {
+ "line": 8,
+ "column": 35
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_UNIT_MISMATCH",
+ "message": "Cannot combine length and time",
+ "sourceMap": {
+ "line": 9,
+ "column": 25
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628024709-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/compile.json",
+ "controllerJson": "W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/controller.json",
+ "motionQueueJson": "W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/motion-queue.json",
+ "traceJson": "W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/trace.json",
+ "ioJson": "W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/io.json",
+ "trajectoryJson": "W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/trajectory.json",
+ "postReportJson": "W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/post-report.json",
+ "roundtripJson": "W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/roundtrip.json",
+ "reportJson": "W2-JOB-20260628024709-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628024709-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "file": "static/W2_E20_SemanticDiagnostics.grl",
+ "coverage_level": "Static",
+ "expected_status": "diagnostic",
+ "status": "diagnostic",
+ "input_hash": "98750f73027e3272a3f1e86f90ea6066d67387e7ffef190441893fff38012ed5",
+ "spec_sections": [
+ 6,
+ 15,
+ 22
+ ],
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "GRL_ARGUMENT_NOT_LVALUE",
+ "message": "out argument done must be a writable lvalue",
+ "sourceMap": {
+ "line": 15,
+ "column": 19
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_SYMBOL_DUPLICATE",
+ "message": "Duplicate symbol v",
+ "sourceMap": {
+ "line": 4,
+ "column": 3
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_ARGUMENT_NOT_LVALUE",
+ "message": "out argument done must be a writable lvalue",
+ "sourceMap": {
+ "line": 15,
+ "column": 19
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_FUNC_SIDE_EFFECT",
+ "message": "Function bad_func cannot execute wait",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_CALL_TARGET_NOT_FOUND",
+ "message": "Unknown call target missing_proc",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_TARGET_NOT_FOUND",
+ "message": "Unknown target missing_target"
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628024709-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/compile.json",
+ "controllerJson": "W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/controller.json",
+ "motionQueueJson": "W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/motion-queue.json",
+ "traceJson": "W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/trace.json",
+ "ioJson": "W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/io.json",
+ "trajectoryJson": "W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/trajectory.json",
+ "postReportJson": "W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/post-report.json",
+ "roundtripJson": "W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/roundtrip.json",
+ "reportJson": "W2-JOB-20260628024709-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628024709-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+ }
+ },
+ {
+ "program_id": "W2_E30_MotionDiagnostics",
+ "file": "error/W2_E30_MotionDiagnostics.grl",
+ "coverage_level": "Static",
+ "expected_status": "diagnostic",
+ "status": "diagnostic",
+ "input_hash": "19f8c9f8a1ba6f6cfa8dde62207f8ee1797267e9addf7bbdbfbe941d8734b543",
+ "spec_sections": [
+ 8,
+ 9,
+ 10,
+ 11,
+ 22
+ ],
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "GRL_PATH_EMPTY",
+ "message": "Path empty_path must contain at least one point"
+ },
+ {
+ "severity": "error",
+ "code": "GRL_PATH_EMPTY",
+ "message": "Path empty_path must contain at least one point"
+ },
+ {
+ "severity": "error",
+ "code": "KDL_JOINT_LIMIT",
+ "message": "joint_1 exceeds fixture limit",
+ "segmentId": "main:MOVEJ",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ }
+ },
+ {
+ "severity": "error",
+ "code": "KDL_TARGET_UNREACHABLE",
+ "message": "Target main:MOVEL is outside ABB120 fixture workspace",
+ "segmentId": "main:MOVEL",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628024709-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/compile.json",
+ "controllerJson": "W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/controller.json",
+ "motionQueueJson": "W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/motion-queue.json",
+ "traceJson": "W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/trace.json",
+ "ioJson": "W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/io.json",
+ "trajectoryJson": "W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/trajectory.json",
+ "postReportJson": "W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/post-report.json",
+ "roundtripJson": "W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/roundtrip.json",
+ "reportJson": "W2-JOB-20260628024709-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628024709-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "file": "static/W2_E40_ControlFlowDiagnostics.grl",
+ "coverage_level": "Static",
+ "expected_status": "diagnostic",
+ "status": "diagnostic",
+ "input_hash": "3ba920eda8d0932b260b9875ce395803d55ebb6a48ecb3c8857b2a4ef1478fea",
+ "spec_sections": [
+ 14,
+ 22
+ ],
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_CONTINUE_OUTSIDE_LOOP",
+ "message": "continue is only valid inside loop",
+ "sourceMap": {
+ "line": 6,
+ "column": 5
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_SWITCH_CASE_DUPLICATE",
+ "message": "Duplicate switch case 1",
+ "sourceMap": {
+ "line": 14,
+ "column": 7
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_SWITCH_CASE_NOT_CONSTANT",
+ "message": "switch case must be a constant expression",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_LABEL_NOT_FOUND",
+ "message": "Unknown label missing",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_JUMP_INTO_BLOCK",
+ "message": "jump cannot enter a nested or sibling block"
+ },
+ {
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628024709-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/compile.json",
+ "controllerJson": "W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/controller.json",
+ "motionQueueJson": "W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json",
+ "traceJson": "W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/trace.json",
+ "ioJson": "W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/io.json",
+ "trajectoryJson": "W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/trajectory.json",
+ "postReportJson": "W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/post-report.json",
+ "roundtripJson": "W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json",
+ "reportJson": "W2-JOB-20260628024709-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628024709-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+ }
+ },
+ {
+ "program_id": "W2_E50_RuntimeTimeout",
+ "file": "error/W2_E50_RuntimeTimeout.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "diagnostic",
+ "status": "diagnostic",
+ "input_hash": "2d5b41bef4b80c8a22f48697abe3b1a335779f439741f52376388091d8ea4fb6",
+ "spec_sections": [
+ 13,
+ 16
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628024709-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/compile.json",
+ "controllerJson": "W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/controller.json",
+ "motionQueueJson": "W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/motion-queue.json",
+ "traceJson": "W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/trace.json",
+ "ioJson": "W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/io.json",
+ "trajectoryJson": "W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/trajectory.json",
+ "postReportJson": "W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/post-report.json",
+ "roundtripJson": "W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/roundtrip.json",
+ "reportJson": "W2-JOB-20260628024709-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628024709-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2RuntimeTimeout",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 5,
+ "procedureCount": 2,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "running",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:0": 0,
+ "$wait:main:1": 0.1
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "DI99 timeout",
+ "message": "DI99 timeout",
+ "severity": "warning",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "time": 0.1
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2RuntimeTimeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2RuntimeTimeout"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 4
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "timeout",
+ "elapsed": 0.1
+ },
+ "id": 5
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "DI99 timeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "DI99 timeout",
+ "severity": "warning"
+ },
+ "id": 6
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 8
+ }
+ ],
+ "currentSource": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "completed": false
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": false,
+ "io.di[6]": true,
+ "io.di[7]": false,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "scripts": []
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2RuntimeTimeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2RuntimeTimeout"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 4
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "timeout",
+ "elapsed": 0.1
+ },
+ "id": 5
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "DI99 timeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "DI99 timeout",
+ "severity": "warning"
+ },
+ "id": 6
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 8
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": false,
+ "io.di[6]": true,
+ "io.di[7]": false,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "scripts": []
+ },
+ "trajectory": {
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2RuntimeTimeout.mod",
+ "W2RuntimeTimeout.ls",
+ "W2RuntimeTimeout.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "file": "post/W2_P10_BrandHints.grl",
+ "coverage_level": "Post",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "0b0b7f523d6afa37eb7b33db69fc8dc8eef910799030e24a13b87344bb0a7f80",
+ "spec_sections": [
+ 18,
+ 20
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint fanuc ignored for abb",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint kuka ignored for abb",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint kuka ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint fanuc ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2BrandHints.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628024709-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/compile.json",
+ "controllerJson": "W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/controller.json",
+ "motionQueueJson": "W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/motion-queue.json",
+ "traceJson": "W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/trace.json",
+ "ioJson": "W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/io.json",
+ "trajectoryJson": "W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/trajectory.json",
+ "postReportJson": "W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/post-report.json",
+ "roundtripJson": "W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/roundtrip.json",
+ "reportJson": "W2-JOB-20260628024709-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628024709-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2BrandHints",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 1,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 7,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "post": {
+ "filenames": [
+ "W2BrandHints.mod",
+ "W2BrandHints.ls",
+ "W2BrandHints.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint fanuc ignored for abb",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint kuka ignored for abb",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint kuka ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for kuka",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint fanuc ignored for kuka",
+ "brand": "kuka"
+ }
+ ]
+ },
+ "roundtrip": {
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2BrandHints.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "file": "post/W2_P20_CrossBrandMotion.grl",
+ "coverage_level": "Post",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "25574be5f4073c18281213d73b72e386f93b1ec57fe21490a9097f8050ce68eb",
+ "spec_sections": [
+ 20
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2CrossBrandMotion.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628024709-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/compile.json",
+ "controllerJson": "W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/controller.json",
+ "motionQueueJson": "W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/motion-queue.json",
+ "traceJson": "W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/trace.json",
+ "ioJson": "W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/io.json",
+ "trajectoryJson": "W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/trajectory.json",
+ "postReportJson": "W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/post-report.json",
+ "roundtripJson": "W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/roundtrip.json",
+ "reportJson": "W2-JOB-20260628024709-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628024709-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2CrossBrandMotion",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 6,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 10,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "post": {
+ "filenames": [
+ "W2CrossBrandMotion.mod",
+ "W2CrossBrandMotion.ls",
+ "W2CrossBrandMotion.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for kuka",
+ "brand": "kuka"
+ }
+ ]
+ },
+ "roundtrip": {
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2CrossBrandMotion.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "file": "post/W2_P30_Roundtrip.grl",
+ "coverage_level": "Post",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "ffef36ecf9e77bceff45b3438905861f7007365b608525e14f18561e58d2e6cf",
+ "spec_sections": [
+ 19,
+ 20,
+ 21
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2Roundtrip.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628024709-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/compile.json",
+ "controllerJson": "W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/controller.json",
+ "motionQueueJson": "W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/motion-queue.json",
+ "traceJson": "W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/trace.json",
+ "ioJson": "W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/io.json",
+ "trajectoryJson": "W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/trajectory.json",
+ "postReportJson": "W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/post-report.json",
+ "roundtripJson": "W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/roundtrip.json",
+ "reportJson": "W2-JOB-20260628024709-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628024709-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2Roundtrip",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 1,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 1
+ },
+ "post": {
+ "filenames": [
+ "W2Roundtrip.mod",
+ "W2Roundtrip.ls",
+ "W2Roundtrip.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ },
+ "roundtrip": {
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2Roundtrip.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+ }
+ }
+ ],
+ "artifacts": {
+ "root": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62",
+ "manifestJson": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/manifest.json",
+ "jobJson": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/job.json",
+ "reportJson": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/report.json",
+ "reportHtml": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/report.html",
+ "desktopScreenshot": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/screenshots/virtual-controller-desktop.png",
+ "mobileScreenshot": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/screenshots/virtual-controller-mobile.png",
+ "uiEvidenceJson": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/screenshots/evidence.json"
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/manifest.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/manifest.json
new file mode 100644
index 0000000..f6d8cfd
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/manifest.json
@@ -0,0 +1,451 @@
+{
+ "suite_id": "working2-abb120-spec",
+ "robot_id": "abb_irb120_3_58",
+ "spec_source": "work/doc/通用机器人编程语法规范.md",
+ "program_root": "kdl-wasm/web/tests/fixtures/abb120/spec-programs",
+ "runtime_commands": [
+ "loadProgram",
+ "start",
+ "stepInto",
+ "hold",
+ "resume",
+ "stepMotion",
+ "stop",
+ "resetFault"
+ ],
+ "programs": [
+ {
+ "program_id": "W2_00_MinimalModule",
+ "file": "runtime/W2_00_MinimalModule.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 4,
+ 5,
+ 6,
+ 9,
+ 10,
+ 23
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "file": "runtime/W2_10_DataTargetToolFrame.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 6,
+ 8,
+ 9
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_20_ExpressionMath",
+ "file": "runtime/W2_20_ExpressionMath.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 7,
+ 9,
+ 13
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "file": "runtime/W2_30_MotionAllTypes.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 8,
+ 9,
+ 10
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_40_PathEvents",
+ "file": "runtime/W2_40_PathEvents.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 11,
+ 13,
+ 19
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_50_OperationProcess",
+ "file": "runtime/W2_50_OperationProcess.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 12,
+ 13
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_60_IOWaitPulse",
+ "file": "runtime/W2_60_IOWaitPulse.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 13
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "file": "runtime/W2_70_ControlFlow.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 14
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "file": "runtime/W2_80_ProcFuncCall.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 15
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "file": "runtime/W2_90_ExceptionAlarm.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 16,
+ 17
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": [
+ "GRL_P1_UNIMPLEMENTED"
+ ]
+ },
+ {
+ "program_id": "W2_99_FullSpecExample",
+ "file": "runtime/W2_99_FullSpecExample.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 24
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "file": "static/W2_E10_ExpressionDiagnostics.grl",
+ "coverage_level": "Static",
+ "spec_sections": [
+ 7,
+ 22
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "GRL_EXPR_UNKNOWN_SYMBOL",
+ "GRL_EXPR_UNKNOWN_FUNCTION",
+ "GRL_EXPR_ARITY",
+ "GRL_EXPR_DOMAIN",
+ "GRL_EXPR_DIV_ZERO",
+ "GRL_EXPR_UNIT_MISMATCH"
+ ]
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "file": "static/W2_E20_SemanticDiagnostics.grl",
+ "coverage_level": "Static",
+ "spec_sections": [
+ 6,
+ 15,
+ 22
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "GRL_SYMBOL_DUPLICATE",
+ "GRL_ARGUMENT_NOT_LVALUE",
+ "GRL_CALL_TARGET_NOT_FOUND",
+ "GRL_FUNC_SIDE_EFFECT",
+ "GRL_TARGET_NOT_FOUND"
+ ]
+ },
+ {
+ "program_id": "W2_E30_MotionDiagnostics",
+ "file": "error/W2_E30_MotionDiagnostics.grl",
+ "coverage_level": "Static",
+ "spec_sections": [
+ 8,
+ 9,
+ 10,
+ 11,
+ 22
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "KDL_JOINT_LIMIT",
+ "KDL_TARGET_UNREACHABLE",
+ "GRL_PATH_EMPTY"
+ ]
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "file": "static/W2_E40_ControlFlowDiagnostics.grl",
+ "coverage_level": "Static",
+ "spec_sections": [
+ 14,
+ 22
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "GRL_BREAK_OUTSIDE_FLOW",
+ "GRL_CONTINUE_OUTSIDE_LOOP",
+ "GRL_JUMP_INTO_BLOCK",
+ "GRL_SWITCH_CASE_DUPLICATE",
+ "GRL_SWITCH_CASE_NOT_CONSTANT",
+ "GRL_LABEL_NOT_FOUND"
+ ]
+ },
+ {
+ "program_id": "W2_E50_RuntimeTimeout",
+ "file": "error/W2_E50_RuntimeTimeout.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 13,
+ 16
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "VC_WAIT_TIMEOUT"
+ ]
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "file": "post/W2_P10_BrandHints.grl",
+ "coverage_level": "Post",
+ "spec_sections": [
+ 18,
+ 20
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": [
+ "GRL_POST_HINT_IGNORED"
+ ]
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "file": "post/W2_P20_CrossBrandMotion.grl",
+ "coverage_level": "Post",
+ "spec_sections": [
+ 20
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "file": "post/W2_P30_Roundtrip.grl",
+ "coverage_level": "Post",
+ "spec_sections": [
+ 19,
+ 20,
+ 21
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ }
+ ],
+ "coverage_matrix": [
+ {
+ "spec_section": 4,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_00_MinimalModule"
+ ]
+ },
+ {
+ "spec_section": 5,
+ "coverage_level": "Runtime",
+ "program_ids": [
+ "W2_00_MinimalModule"
+ ]
+ },
+ {
+ "spec_section": 6,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_10_DataTargetToolFrame",
+ "W2_E20_SemanticDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 7,
+ "coverage_level": "Runtime/Static/Post",
+ "program_ids": [
+ "W2_20_ExpressionMath",
+ "W2_E10_ExpressionDiagnostics",
+ "W2_P20_CrossBrandMotion"
+ ]
+ },
+ {
+ "spec_section": 8,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_10_DataTargetToolFrame",
+ "W2_E30_MotionDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 9,
+ "coverage_level": "Runtime/Post",
+ "program_ids": [
+ "W2_20_ExpressionMath",
+ "W2_30_MotionAllTypes",
+ "W2_P20_CrossBrandMotion"
+ ]
+ },
+ {
+ "spec_section": 10,
+ "coverage_level": "Runtime/Static/Post",
+ "program_ids": [
+ "W2_30_MotionAllTypes",
+ "W2_E30_MotionDiagnostics",
+ "W2_P20_CrossBrandMotion"
+ ]
+ },
+ {
+ "spec_section": 11,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_40_PathEvents",
+ "W2_E30_MotionDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 12,
+ "coverage_level": "Runtime/Post",
+ "program_ids": [
+ "W2_50_OperationProcess",
+ "W2_P30_Roundtrip"
+ ]
+ },
+ {
+ "spec_section": 13,
+ "coverage_level": "Runtime",
+ "program_ids": [
+ "W2_60_IOWaitPulse",
+ "W2_E50_RuntimeTimeout"
+ ]
+ },
+ {
+ "spec_section": 14,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_70_ControlFlow",
+ "W2_E40_ControlFlowDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 15,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_80_ProcFuncCall",
+ "W2_E20_SemanticDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 16,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_90_ExceptionAlarm",
+ "W2_E50_RuntimeTimeout"
+ ]
+ },
+ {
+ "spec_section": 17,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_90_ExceptionAlarm"
+ ]
+ },
+ {
+ "spec_section": 18,
+ "coverage_level": "Post",
+ "program_ids": [
+ "W2_P10_BrandHints"
+ ]
+ },
+ {
+ "spec_section": 19,
+ "coverage_level": "Post",
+ "program_ids": [
+ "W2_P30_Roundtrip"
+ ]
+ },
+ {
+ "spec_section": 20,
+ "coverage_level": "Post",
+ "program_ids": [
+ "W2_P20_CrossBrandMotion"
+ ]
+ },
+ {
+ "spec_section": 21,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_00_MinimalModule",
+ "W2_E10_ExpressionDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 22,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_E10_ExpressionDiagnostics",
+ "W2_E20_SemanticDiagnostics",
+ "W2_E30_MotionDiagnostics",
+ "W2_E40_ControlFlowDiagnostics",
+ "W2_E50_RuntimeTimeout"
+ ]
+ },
+ {
+ "spec_section": 23,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_00_MinimalModule"
+ ]
+ },
+ {
+ "spec_section": 24,
+ "coverage_level": "Runtime/Post",
+ "program_ids": [
+ "W2_99_FullSpecExample",
+ "W2_P30_Roundtrip"
+ ]
+ },
+ {
+ "spec_section": 25,
+ "coverage_level": "Runtime/Static/Post",
+ "program_ids": [
+ "W2_00_MinimalModule",
+ "W2_10_DataTargetToolFrame",
+ "W2_20_ExpressionMath",
+ "W2_30_MotionAllTypes",
+ "W2_40_PathEvents",
+ "W2_50_OperationProcess",
+ "W2_60_IOWaitPulse",
+ "W2_70_ControlFlow",
+ "W2_80_ProcFuncCall",
+ "W2_90_ExceptionAlarm",
+ "W2_P20_CrossBrandMotion"
+ ]
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/compile.json
new file mode 100644
index 0000000..b21d4dd
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2MinimalModule",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 1,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 4,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/controller.json
new file mode 100644
index 0000000..eb27052
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/controller.json
@@ -0,0 +1,455 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MinimalModule",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MinimalModule"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_00_MinimalModule-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/io.json
new file mode 100644
index 0000000..a9a6139
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_00_MinimalModule-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/motion-queue.json
new file mode 100644
index 0000000..4c4fa93
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/motion-queue.json
@@ -0,0 +1,82 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/post-report.json
new file mode 100644
index 0000000..2b435af
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2MinimalModule.mod",
+ "W2MinimalModule.ls",
+ "W2MinimalModule.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/trace.json
new file mode 100644
index 0000000..b260ea8
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/trace.json
@@ -0,0 +1,72 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MinimalModule",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MinimalModule"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/trajectory.json
new file mode 100644
index 0000000..6f9d002
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/compile.json
new file mode 100644
index 0000000..a66b72a
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2DataTargetToolFrame",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 19,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/controller.json
new file mode 100644
index 0000000..4677666
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/controller.json
@@ -0,0 +1,872 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2DataTargetToolFrame",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2DataTargetToolFrame"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_10_DataTargetToolFrame-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/io.json
new file mode 100644
index 0000000..4c885c5
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_10_DataTargetToolFrame-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/motion-queue.json
new file mode 100644
index 0000000..ffd4169
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/motion-queue.json
@@ -0,0 +1,416 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/post-report.json
new file mode 100644
index 0000000..62c1345
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2DataTargetToolFrame.mod",
+ "W2DataTargetToolFrame.ls",
+ "W2DataTargetToolFrame.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/trace.json
new file mode 100644
index 0000000..eddbe65
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/trace.json
@@ -0,0 +1,155 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2DataTargetToolFrame",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2DataTargetToolFrame"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/trajectory.json
new file mode 100644
index 0000000..cfea046
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.5,
+ 0.03,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/compile.json
new file mode 100644
index 0000000..2f9bd02
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2ExpressionMath",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 2,
+ "kdlPathRequests": 0,
+ "symbolCount": 9,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/controller.json
new file mode 100644
index 0000000..237450e
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/controller.json
@@ -0,0 +1,631 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:2": 0
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExpressionMath",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExpressionMath"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_20_ExpressionMath-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/io.json
new file mode 100644
index 0000000..f239c92
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_20_ExpressionMath-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/motion-queue.json
new file mode 100644
index 0000000..cb5539e
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/motion-queue.json
@@ -0,0 +1,172 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/post-report.json
new file mode 100644
index 0000000..b9a1299
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2ExpressionMath.mod",
+ "W2ExpressionMath.ls",
+ "W2ExpressionMath.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/trace.json
new file mode 100644
index 0000000..d834175
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/trace.json
@@ -0,0 +1,156 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExpressionMath",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExpressionMath"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/trajectory.json
new file mode 100644
index 0000000..d1691a1
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 8,
+ "duration": 0.48,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.45,
+ 0.04,
+ -0.2,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/compile.json
new file mode 100644
index 0000000..0a93c5d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2MotionAllTypes",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 10,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/controller.json
new file mode 100644
index 0000000..3123338
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/controller.json
@@ -0,0 +1,936 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MotionAllTypes",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MotionAllTypes"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_30_MotionAllTypes-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/io.json
new file mode 100644
index 0000000..498441f
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_30_MotionAllTypes-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/motion-queue.json
new file mode 100644
index 0000000..b627627
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/motion-queue.json
@@ -0,0 +1,480 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/post-report.json
new file mode 100644
index 0000000..3634288
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2MotionAllTypes.mod",
+ "W2MotionAllTypes.ls",
+ "W2MotionAllTypes.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/trace.json
new file mode 100644
index 0000000..5fac72a
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/trace.json
@@ -0,0 +1,155 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MotionAllTypes",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MotionAllTypes"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/trajectory.json
new file mode 100644
index 0000000..431e931
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.6,
+ 0,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/compile.json
new file mode 100644
index 0000000..5e98362
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2PathEvents",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 7,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/controller.json
new file mode 100644
index 0000000..f80f32e
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/controller.json
@@ -0,0 +1,1106 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2PathEvents",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2PathEvents"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "generated_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "generated_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "generated_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p_home",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_pick",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0.20000000169966334,
+ -0.3500000029744108,
+ 0.4500000038242425,
+ 0.10000000084983167,
+ -0.20000000169966334,
+ 0.300000002549495
+ ],
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_place",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.1500000012747475,
+ -0.4000000033993267
+ ],
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "before",
+ "pointId": "p_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 17,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 10 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 703,
+ "line": 17,
+ "column": 25
+ },
+ "end": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ },
+ "end": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ },
+ "end": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ },
+ "end": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ },
+ "end": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ },
+ "end": {
+ "offset": 712,
+ "line": 17,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 713,
+ "line": 17,
+ "column": 35
+ },
+ "end": {
+ "offset": 714,
+ "line": 17,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 715,
+ "line": 17,
+ "column": 37
+ },
+ "end": {
+ "offset": 719,
+ "line": 17,
+ "column": 41
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "p_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 19,
+ "column": 24
+ },
+ "data": {
+ "statement": "wait io . di [ 10 ] == true timeout 2 s on_timeout alarm \"pick sensor timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 780,
+ "line": 19,
+ "column": 24
+ },
+ "end": {
+ "offset": 784,
+ "line": 19,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 785,
+ "line": 19,
+ "column": 29
+ },
+ "end": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ },
+ "end": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ },
+ "end": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ },
+ "end": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ },
+ "end": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ },
+ "end": {
+ "offset": 794,
+ "line": 19,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 795,
+ "line": 19,
+ "column": 39
+ },
+ "end": {
+ "offset": 797,
+ "line": 19,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 798,
+ "line": 19,
+ "column": 42
+ },
+ "end": {
+ "offset": 802,
+ "line": 19,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 803,
+ "line": 19,
+ "column": 47
+ },
+ "end": {
+ "offset": 810,
+ "line": 19,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 811,
+ "line": 19,
+ "column": 55
+ },
+ "end": {
+ "offset": 814,
+ "line": 19,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 815,
+ "line": 19,
+ "column": 59
+ },
+ "end": {
+ "offset": 825,
+ "line": 19,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 826,
+ "line": 19,
+ "column": 70
+ },
+ "end": {
+ "offset": 831,
+ "line": 19,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"pick sensor timeout\"",
+ "value": "pick sensor timeout",
+ "range": {
+ "start": {
+ "offset": 832,
+ "line": 19,
+ "column": 76
+ },
+ "end": {
+ "offset": 853,
+ "line": 19,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_2",
+ "timing": "at",
+ "pointId": "p_place",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 21,
+ "column": 37
+ },
+ "data": {
+ "statement": "pulse io . do [ 11 ] duration 100 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 929,
+ "line": 21,
+ "column": 37
+ },
+ "end": {
+ "offset": 934,
+ "line": 21,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 935,
+ "line": 21,
+ "column": 43
+ },
+ "end": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ },
+ "end": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ },
+ "end": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ },
+ "end": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "11",
+ "value": 11,
+ "range": {
+ "start": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ },
+ "end": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ },
+ "end": {
+ "offset": 944,
+ "line": 21,
+ "column": 52
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 945,
+ "line": 21,
+ "column": 53
+ },
+ "end": {
+ "offset": 953,
+ "line": 21,
+ "column": 61
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "100 ms",
+ "value": 100,
+ "range": {
+ "start": {
+ "offset": 954,
+ "line": 21,
+ "column": 62
+ },
+ "end": {
+ "offset": 960,
+ "line": 21,
+ "column": 68
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.1
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_40_PathEvents-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "generated_path"
+ ],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/io.json
new file mode 100644
index 0000000..2d8957a
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_40_PathEvents-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/motion-queue.json
new file mode 100644
index 0000000..7fbb840
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/motion-queue.json
@@ -0,0 +1,731 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "generated_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "generated_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "generated_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p_home",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_pick",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0.20000000169966334,
+ -0.3500000029744108,
+ 0.4500000038242425,
+ 0.10000000084983167,
+ -0.20000000169966334,
+ 0.300000002549495
+ ],
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_place",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.1500000012747475,
+ -0.4000000033993267
+ ],
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "before",
+ "pointId": "p_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 17,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 10 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 703,
+ "line": 17,
+ "column": 25
+ },
+ "end": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ },
+ "end": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ },
+ "end": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ },
+ "end": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ },
+ "end": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ },
+ "end": {
+ "offset": 712,
+ "line": 17,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 713,
+ "line": 17,
+ "column": 35
+ },
+ "end": {
+ "offset": 714,
+ "line": 17,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 715,
+ "line": 17,
+ "column": 37
+ },
+ "end": {
+ "offset": 719,
+ "line": 17,
+ "column": 41
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "p_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 19,
+ "column": 24
+ },
+ "data": {
+ "statement": "wait io . di [ 10 ] == true timeout 2 s on_timeout alarm \"pick sensor timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 780,
+ "line": 19,
+ "column": 24
+ },
+ "end": {
+ "offset": 784,
+ "line": 19,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 785,
+ "line": 19,
+ "column": 29
+ },
+ "end": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ },
+ "end": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ },
+ "end": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ },
+ "end": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ },
+ "end": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ },
+ "end": {
+ "offset": 794,
+ "line": 19,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 795,
+ "line": 19,
+ "column": 39
+ },
+ "end": {
+ "offset": 797,
+ "line": 19,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 798,
+ "line": 19,
+ "column": 42
+ },
+ "end": {
+ "offset": 802,
+ "line": 19,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 803,
+ "line": 19,
+ "column": 47
+ },
+ "end": {
+ "offset": 810,
+ "line": 19,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 811,
+ "line": 19,
+ "column": 55
+ },
+ "end": {
+ "offset": 814,
+ "line": 19,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 815,
+ "line": 19,
+ "column": 59
+ },
+ "end": {
+ "offset": 825,
+ "line": 19,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 826,
+ "line": 19,
+ "column": 70
+ },
+ "end": {
+ "offset": 831,
+ "line": 19,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"pick sensor timeout\"",
+ "value": "pick sensor timeout",
+ "range": {
+ "start": {
+ "offset": 832,
+ "line": 19,
+ "column": 76
+ },
+ "end": {
+ "offset": 853,
+ "line": 19,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_2",
+ "timing": "at",
+ "pointId": "p_place",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 21,
+ "column": 37
+ },
+ "data": {
+ "statement": "pulse io . do [ 11 ] duration 100 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 929,
+ "line": 21,
+ "column": 37
+ },
+ "end": {
+ "offset": 934,
+ "line": 21,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 935,
+ "line": 21,
+ "column": 43
+ },
+ "end": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ },
+ "end": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ },
+ "end": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ },
+ "end": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "11",
+ "value": 11,
+ "range": {
+ "start": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ },
+ "end": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ },
+ "end": {
+ "offset": 944,
+ "line": 21,
+ "column": 52
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 945,
+ "line": 21,
+ "column": 53
+ },
+ "end": {
+ "offset": 953,
+ "line": 21,
+ "column": 61
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "100 ms",
+ "value": 100,
+ "range": {
+ "start": {
+ "offset": 954,
+ "line": 21,
+ "column": 62
+ },
+ "end": {
+ "offset": 960,
+ "line": 21,
+ "column": 68
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.1
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/post-report.json
new file mode 100644
index 0000000..1799726
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/post-report.json
@@ -0,0 +1,27 @@
+{
+ "filenames": [
+ "W2PathEvents.mod",
+ "W2PathEvents.ls",
+ "W2PathEvents.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/trace.json
new file mode 100644
index 0000000..74a552c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/trace.json
@@ -0,0 +1,72 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2PathEvents",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2PathEvents"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/trajectory.json
new file mode 100644
index 0000000..8c6de8c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.15000000127474747,
+ -0.4000000033993266
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/compile.json
new file mode 100644
index 0000000..4ad1d93
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2OperationProcess",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 6,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/controller.json
new file mode 100644
index 0000000..6520e77
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/controller.json
@@ -0,0 +1,500 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2OperationProcess",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2OperationProcess"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "start_action",
+ "statement": "io . do [ 1 ] = true",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "op_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "op_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "op_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "end_action",
+ "statement": "io . do [ 1 ] = false",
+ "sourceMap": {
+ "line": 21,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_50_OperationProcess-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "op_path"
+ ],
+ "operationIds": [
+ "pick_op"
+ ],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/io.json
new file mode 100644
index 0000000..67ae792
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_50_OperationProcess-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/motion-queue.json
new file mode 100644
index 0000000..6b8ce58
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/motion-queue.json
@@ -0,0 +1,123 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "start_action",
+ "statement": "io . do [ 1 ] = true",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "op_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "op_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "op_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "end_action",
+ "statement": "io . do [ 1 ] = false",
+ "sourceMap": {
+ "line": 21,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/post-report.json
new file mode 100644
index 0000000..b22568b
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/post-report.json
@@ -0,0 +1,27 @@
+{
+ "filenames": [
+ "W2OperationProcess.mod",
+ "W2OperationProcess.ls",
+ "W2OperationProcess.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/trace.json
new file mode 100644
index 0000000..e16ed9a
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/trace.json
@@ -0,0 +1,72 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2OperationProcess",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2OperationProcess"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/trajectory.json
new file mode 100644
index 0000000..6f9d002
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/compile.json
new file mode 100644
index 0000000..a051026
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2IOWaitPulse",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 12,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 5,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/controller.json
new file mode 100644
index 0000000..63159c3
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/controller.json
@@ -0,0 +1,1139 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 10,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 10
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:3": 0,
+ "$wait:main:4": 0,
+ "$wait:main:5": 0.1,
+ "$wait:main:6": 0.1,
+ "$wait:main:7": 0.1
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2IOWaitPulse",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2IOWaitPulse"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 11
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 12
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 13
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 14
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 15
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 16
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 17
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 18
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 19
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ]
+ },
+ "id": 20
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 21
+ },
+ {
+ "time": 0.1,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 22
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 10,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 23
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "io_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "io_path",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "io_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "at",
+ "pointId": "p0",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 9,
+ "column": 35
+ },
+ "data": {
+ "statement": "pulse io . do [ 20 ] duration 50 + 50 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 286,
+ "line": 9,
+ "column": 35
+ },
+ "end": {
+ "offset": 291,
+ "line": 9,
+ "column": 40
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 292,
+ "line": 9,
+ "column": 41
+ },
+ "end": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ },
+ "end": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ },
+ "end": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ },
+ "end": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "20",
+ "value": 20,
+ "range": {
+ "start": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ },
+ "end": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ },
+ "end": {
+ "offset": 301,
+ "line": 9,
+ "column": 50
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 302,
+ "line": 9,
+ "column": 51
+ },
+ "end": {
+ "offset": 310,
+ "line": 9,
+ "column": 59
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 311,
+ "line": 9,
+ "column": 60
+ },
+ "end": {
+ "offset": 313,
+ "line": 9,
+ "column": 62
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "+",
+ "value": "+",
+ "range": {
+ "start": {
+ "offset": 314,
+ "line": 9,
+ "column": 63
+ },
+ "end": {
+ "offset": 315,
+ "line": 9,
+ "column": 64
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50 ms",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 316,
+ "line": 9,
+ "column": 65
+ },
+ "end": {
+ "offset": 321,
+ "line": 9,
+ "column": 70
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.05
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75,
+ "io.do[1]": true,
+ "io.ao[1]": 0.75,
+ "io.go[1]": 3,
+ "io.do[2]": true
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ },
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ },
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ },
+ {
+ "id": 13,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 14,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 15,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_60_IOWaitPulse-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "io_path"
+ ],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/io.json
new file mode 100644
index 0000000..20e3541
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/io.json
@@ -0,0 +1,253 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75,
+ "io.do[1]": true,
+ "io.ao[1]": 0.75,
+ "io.go[1]": 3,
+ "io.do[2]": true
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ },
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ },
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ },
+ {
+ "id": 13,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 14,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 15,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_60_IOWaitPulse-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/motion-queue.json
new file mode 100644
index 0000000..f9168f2
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/motion-queue.json
@@ -0,0 +1,279 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "io_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "io_path",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "io_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "at",
+ "pointId": "p0",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 9,
+ "column": 35
+ },
+ "data": {
+ "statement": "pulse io . do [ 20 ] duration 50 + 50 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 286,
+ "line": 9,
+ "column": 35
+ },
+ "end": {
+ "offset": 291,
+ "line": 9,
+ "column": 40
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 292,
+ "line": 9,
+ "column": 41
+ },
+ "end": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ },
+ "end": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ },
+ "end": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ },
+ "end": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "20",
+ "value": 20,
+ "range": {
+ "start": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ },
+ "end": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ },
+ "end": {
+ "offset": 301,
+ "line": 9,
+ "column": 50
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 302,
+ "line": 9,
+ "column": 51
+ },
+ "end": {
+ "offset": 310,
+ "line": 9,
+ "column": 59
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 311,
+ "line": 9,
+ "column": 60
+ },
+ "end": {
+ "offset": 313,
+ "line": 9,
+ "column": 62
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "+",
+ "value": "+",
+ "range": {
+ "start": {
+ "offset": 314,
+ "line": 9,
+ "column": 63
+ },
+ "end": {
+ "offset": 315,
+ "line": 9,
+ "column": 64
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50 ms",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 316,
+ "line": 9,
+ "column": 65
+ },
+ "end": {
+ "offset": 321,
+ "line": 9,
+ "column": 70
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.05
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/post-report.json
new file mode 100644
index 0000000..ae4ab05
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/post-report.json
@@ -0,0 +1,27 @@
+{
+ "filenames": [
+ "W2IOWaitPulse.mod",
+ "W2IOWaitPulse.ls",
+ "W2IOWaitPulse.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/trace.json
new file mode 100644
index 0000000..41e0322
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/trace.json
@@ -0,0 +1,493 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2IOWaitPulse",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2IOWaitPulse"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 11
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 12
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 13
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 14
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 15
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 16
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 17
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 18
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 19
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ]
+ },
+ "id": 20
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 21
+ },
+ {
+ "time": 0.1,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 22
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 10,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 23
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/trajectory.json
new file mode 100644
index 0000000..6f9d002
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/compile.json
new file mode 100644
index 0000000..28b7c9c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2ControlFlow",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 14,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/controller.json
new file mode 100644
index 0000000..5c3d7e6
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/controller.json
@@ -0,0 +1,610 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 8,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 8
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ },
+ {
+ "id": "else:0",
+ "variables": {
+ "i": 1
+ }
+ },
+ {
+ "id": "for:3",
+ "variables": {}
+ },
+ {
+ "id": "switch:5",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "NOT_READY",
+ "message": "not ready",
+ "severity": "error",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "time": 0
+ },
+ {
+ "id": "MODE1",
+ "message": "mode 1",
+ "severity": "error",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "time": 0.1
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ControlFlow",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ControlFlow"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 1,
+ "message": "not ready",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "NOT_READY",
+ "severity": "error"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "EXEC_WHILE",
+ "source": {
+ "kind": "EXEC_WHILE",
+ "id": "main:EXEC_WHILE:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "EXEC_FOR",
+ "source": {
+ "kind": "EXEC_FOR",
+ "id": "main:EXEC_FOR:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:23:7",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "EXEC_SWITCH",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "BREAK",
+ "source": {
+ "kind": "BREAK",
+ "id": "main:BREAK:28:9",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "info",
+ "code": "VC_BREAK",
+ "message": "BREAK reached",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ "id": 11
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 7,
+ "message": "mode 1",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "MODE1",
+ "severity": "error"
+ },
+ "id": 12
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "id": 13
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_70_ControlFlow-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/io.json
new file mode 100644
index 0000000..67c50b6
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_70_ControlFlow-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/motion-queue.json
new file mode 100644
index 0000000..57085bb
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/motion-queue.json
@@ -0,0 +1,5 @@
+{
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/post-report.json
new file mode 100644
index 0000000..4e58295
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/post-report.json
@@ -0,0 +1,153 @@
+{
+ "filenames": [
+ "W2ControlFlow.mod",
+ "W2ControlFlow.ls",
+ "W2ControlFlow.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/trace.json
new file mode 100644
index 0000000..f70bed5
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/trace.json
@@ -0,0 +1,253 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ControlFlow",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ControlFlow"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 1,
+ "message": "not ready",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "NOT_READY",
+ "severity": "error"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "EXEC_WHILE",
+ "source": {
+ "kind": "EXEC_WHILE",
+ "id": "main:EXEC_WHILE:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "EXEC_FOR",
+ "source": {
+ "kind": "EXEC_FOR",
+ "id": "main:EXEC_FOR:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:23:7",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "EXEC_SWITCH",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "BREAK",
+ "source": {
+ "kind": "BREAK",
+ "id": "main:BREAK:28:9",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "info",
+ "code": "VC_BREAK",
+ "message": "BREAK reached",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ "id": 11
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 7,
+ "message": "mode 1",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "MODE1",
+ "severity": "error"
+ },
+ "id": 12
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "id": 13
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/trajectory.json
new file mode 100644
index 0000000..cb22e65
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/compile.json
new file mode 100644
index 0000000..e582d30
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2ProcFuncCall",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 9,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 8,
+ "procedureCount": 3,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/controller.json
new file mode 100644
index 0000000..3db47f6
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/controller.json
@@ -0,0 +1,523 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 5,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 5
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ProcFuncCall",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ProcFuncCall"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call read_part",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "read_part:RAW_STATEMENT:8:5",
+ "sourceMap": {
+ "line": 8,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 3,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "CALL",
+ "id": "main:CALL:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call increment_retry",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 8
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "increment_retry:RAW_STATEMENT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RETURN",
+ "source": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 11
+ }
+ ],
+ "currentSource": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "completed": true
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_80_ProcFuncCall-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/io.json
new file mode 100644
index 0000000..222cd29
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_80_ProcFuncCall-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/motion-queue.json
new file mode 100644
index 0000000..57085bb
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/motion-queue.json
@@ -0,0 +1,5 @@
+{
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/post-report.json
new file mode 100644
index 0000000..44ff58d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/post-report.json
@@ -0,0 +1,117 @@
+{
+ "filenames": [
+ "W2ProcFuncCall.mod",
+ "W2ProcFuncCall.ls",
+ "W2ProcFuncCall.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/trace.json
new file mode 100644
index 0000000..fd70e4b
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/trace.json
@@ -0,0 +1,202 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ProcFuncCall",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ProcFuncCall"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call read_part",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "read_part:RAW_STATEMENT:8:5",
+ "sourceMap": {
+ "line": 8,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 3,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "CALL",
+ "id": "main:CALL:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call increment_retry",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 8
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "increment_retry:RAW_STATEMENT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RETURN",
+ "source": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 11
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/trajectory.json
new file mode 100644
index 0000000..cb22e65
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/compile.json
new file mode 100644
index 0000000..c8515aa
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2ExceptionAlarm",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 5,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 6,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/controller.json
new file mode 100644
index 0000000..64d6d9b
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/controller.json
@@ -0,0 +1,606 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 5,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 5
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "START",
+ "message": "start",
+ "severity": "info",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "time": 0
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExceptionAlarm",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExceptionAlarm"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "start",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "START",
+ "severity": "info"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "enable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ }
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:23:5",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "disable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ }
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 10
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_90_ExceptionAlarm-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/io.json
new file mode 100644
index 0000000..f36d75c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_90_ExceptionAlarm-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/motion-queue.json
new file mode 100644
index 0000000..f6cb95e
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/motion-queue.json
@@ -0,0 +1,82 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/post-report.json
new file mode 100644
index 0000000..6c7c328
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/post-report.json
@@ -0,0 +1,81 @@
+{
+ "filenames": [
+ "W2ExceptionAlarm.mod",
+ "W2ExceptionAlarm.ls",
+ "W2ExceptionAlarm.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/trace.json
new file mode 100644
index 0000000..a2c2108
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/trace.json
@@ -0,0 +1,201 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExceptionAlarm",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExceptionAlarm"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "start",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "START",
+ "severity": "info"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "enable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ }
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:23:5",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "disable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ }
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 10
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/trajectory.json
new file mode 100644
index 0000000..6f9d002
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/compile.json
new file mode 100644
index 0000000..ea23e7d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2FullSpecExample",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 14,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 2,
+ "symbolCount": 13,
+ "procedureCount": 1,
+ "pathCount": 2,
+ "operationCount": 2
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/controller.json
new file mode 100644
index 0000000..d938f8e
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/controller.json
@@ -0,0 +1,1983 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2FullSpecExample",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2FullSpecExample"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:78:5",
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:78:5",
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "pick_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "pick_path",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "pick_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "approach",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 39,
+ "column": 20
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "above_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.4
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 40,
+ "column": 22
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "at_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.3
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.3297802811774664e-17,
+ 4.3297802811774664e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 19
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "leave_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.4
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 44,
+ "column": 22
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "after",
+ "pointId": "at_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 42,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 1 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1160,
+ "line": 42,
+ "column": 25
+ },
+ "end": {
+ "offset": 1162,
+ "line": 42,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1162,
+ "line": 42,
+ "column": 27
+ },
+ "end": {
+ "offset": 1163,
+ "line": 42,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 1163,
+ "line": 42,
+ "column": 28
+ },
+ "end": {
+ "offset": 1165,
+ "line": 42,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1165,
+ "line": 42,
+ "column": 30
+ },
+ "end": {
+ "offset": 1166,
+ "line": 42,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1166,
+ "line": 42,
+ "column": 31
+ },
+ "end": {
+ "offset": 1167,
+ "line": 42,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1167,
+ "line": 42,
+ "column": 32
+ },
+ "end": {
+ "offset": 1168,
+ "line": 42,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 1169,
+ "line": 42,
+ "column": 34
+ },
+ "end": {
+ "offset": 1170,
+ "line": 42,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1171,
+ "line": 42,
+ "column": 36
+ },
+ "end": {
+ "offset": 1175,
+ "line": 42,
+ "column": 40
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "at_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 43,
+ "column": 25
+ },
+ "data": {
+ "statement": "wait io . di [ 1 ] == true timeout 2 s on_timeout alarm \"Clamp close timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 1200,
+ "line": 43,
+ "column": 25
+ },
+ "end": {
+ "offset": 1204,
+ "line": 43,
+ "column": 29
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1205,
+ "line": 43,
+ "column": 30
+ },
+ "end": {
+ "offset": 1207,
+ "line": 43,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1207,
+ "line": 43,
+ "column": 32
+ },
+ "end": {
+ "offset": 1208,
+ "line": 43,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 1208,
+ "line": 43,
+ "column": 33
+ },
+ "end": {
+ "offset": 1210,
+ "line": 43,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1210,
+ "line": 43,
+ "column": 35
+ },
+ "end": {
+ "offset": 1211,
+ "line": 43,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1211,
+ "line": 43,
+ "column": 36
+ },
+ "end": {
+ "offset": 1212,
+ "line": 43,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1212,
+ "line": 43,
+ "column": 37
+ },
+ "end": {
+ "offset": 1213,
+ "line": 43,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 1214,
+ "line": 43,
+ "column": 39
+ },
+ "end": {
+ "offset": 1216,
+ "line": 43,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1217,
+ "line": 43,
+ "column": 42
+ },
+ "end": {
+ "offset": 1221,
+ "line": 43,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 1222,
+ "line": 43,
+ "column": 47
+ },
+ "end": {
+ "offset": 1229,
+ "line": 43,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1230,
+ "line": 43,
+ "column": 55
+ },
+ "end": {
+ "offset": 1233,
+ "line": 43,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 1234,
+ "line": 43,
+ "column": 59
+ },
+ "end": {
+ "offset": 1244,
+ "line": 43,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 1245,
+ "line": 43,
+ "column": 70
+ },
+ "end": {
+ "offset": 1250,
+ "line": 43,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"Clamp close timeout\"",
+ "value": "Clamp close timeout",
+ "range": {
+ "start": {
+ "offset": 1251,
+ "line": 43,
+ "column": 76
+ },
+ "end": {
+ "offset": 1272,
+ "line": 43,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "place_path",
+ "operationId": "place_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "place_path",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "place_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "above_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.42000000000000004
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 53,
+ "column": 23
+ }
+ },
+ {
+ "id": "at_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.32
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.3297802811774664e-17,
+ 4.3297802811774664e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 54,
+ "column": 20
+ }
+ },
+ {
+ "id": "leave_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.42000000000000004
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 57,
+ "column": 23
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "after",
+ "pointId": "at_place",
+ "kind": "io",
+ "sourceMap": {
+ "line": 55,
+ "column": 26
+ },
+ "data": {
+ "statement": "io . do [ 1 ] = false",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1565,
+ "line": 55,
+ "column": 26
+ },
+ "end": {
+ "offset": 1567,
+ "line": 55,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1567,
+ "line": 55,
+ "column": 28
+ },
+ "end": {
+ "offset": 1568,
+ "line": 55,
+ "column": 29
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 1568,
+ "line": 55,
+ "column": 29
+ },
+ "end": {
+ "offset": 1570,
+ "line": 55,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1570,
+ "line": 55,
+ "column": 31
+ },
+ "end": {
+ "offset": 1571,
+ "line": 55,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1571,
+ "line": 55,
+ "column": 32
+ },
+ "end": {
+ "offset": 1572,
+ "line": 55,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1572,
+ "line": 55,
+ "column": 33
+ },
+ "end": {
+ "offset": 1573,
+ "line": 55,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 1574,
+ "line": 55,
+ "column": 35
+ },
+ "end": {
+ "offset": 1575,
+ "line": 55,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "false",
+ "value": "false",
+ "range": {
+ "start": {
+ "offset": 1576,
+ "line": 55,
+ "column": 37
+ },
+ "end": {
+ "offset": 1581,
+ "line": 55,
+ "column": 42
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "at_place",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 56,
+ "column": 26
+ },
+ "data": {
+ "statement": "wait io . di [ 2 ] == true timeout 2 s on_timeout alarm \"Clamp open timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 1607,
+ "line": 56,
+ "column": 26
+ },
+ "end": {
+ "offset": 1611,
+ "line": 56,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1612,
+ "line": 56,
+ "column": 31
+ },
+ "end": {
+ "offset": 1614,
+ "line": 56,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1614,
+ "line": 56,
+ "column": 33
+ },
+ "end": {
+ "offset": 1615,
+ "line": 56,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 1615,
+ "line": 56,
+ "column": 34
+ },
+ "end": {
+ "offset": 1617,
+ "line": 56,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1617,
+ "line": 56,
+ "column": 36
+ },
+ "end": {
+ "offset": 1618,
+ "line": 56,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1618,
+ "line": 56,
+ "column": 37
+ },
+ "end": {
+ "offset": 1619,
+ "line": 56,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1619,
+ "line": 56,
+ "column": 38
+ },
+ "end": {
+ "offset": 1620,
+ "line": 56,
+ "column": 39
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 1621,
+ "line": 56,
+ "column": 40
+ },
+ "end": {
+ "offset": 1623,
+ "line": 56,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1624,
+ "line": 56,
+ "column": 43
+ },
+ "end": {
+ "offset": 1628,
+ "line": 56,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 1629,
+ "line": 56,
+ "column": 48
+ },
+ "end": {
+ "offset": 1636,
+ "line": 56,
+ "column": 55
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1637,
+ "line": 56,
+ "column": 56
+ },
+ "end": {
+ "offset": 1640,
+ "line": 56,
+ "column": 59
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 1641,
+ "line": 56,
+ "column": 60
+ },
+ "end": {
+ "offset": 1651,
+ "line": 56,
+ "column": 70
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 1652,
+ "line": 56,
+ "column": 71
+ },
+ "end": {
+ "offset": 1657,
+ "line": 56,
+ "column": 76
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"Clamp open timeout\"",
+ "value": "Clamp open timeout",
+ "range": {
+ "start": {
+ "offset": 1658,
+ "line": 56,
+ "column": 77
+ },
+ "end": {
+ "offset": 1678,
+ "line": 56,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_99_FullSpecExample-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "pick_path",
+ "place_path"
+ ],
+ "operationIds": [
+ "pick_op",
+ "place_op"
+ ],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/io.json
new file mode 100644
index 0000000..8b73019
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_99_FullSpecExample-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/motion-queue.json
new file mode 100644
index 0000000..338f793
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/motion-queue.json
@@ -0,0 +1,1521 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "pick_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "pick_path",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "pick_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "approach",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 39,
+ "column": 20
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "above_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.4
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 40,
+ "column": 22
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "at_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.3
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.3297802811774664e-17,
+ 4.3297802811774664e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 19
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "leave_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.4
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 44,
+ "column": 22
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "after",
+ "pointId": "at_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 42,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 1 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1160,
+ "line": 42,
+ "column": 25
+ },
+ "end": {
+ "offset": 1162,
+ "line": 42,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1162,
+ "line": 42,
+ "column": 27
+ },
+ "end": {
+ "offset": 1163,
+ "line": 42,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 1163,
+ "line": 42,
+ "column": 28
+ },
+ "end": {
+ "offset": 1165,
+ "line": 42,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1165,
+ "line": 42,
+ "column": 30
+ },
+ "end": {
+ "offset": 1166,
+ "line": 42,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1166,
+ "line": 42,
+ "column": 31
+ },
+ "end": {
+ "offset": 1167,
+ "line": 42,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1167,
+ "line": 42,
+ "column": 32
+ },
+ "end": {
+ "offset": 1168,
+ "line": 42,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 1169,
+ "line": 42,
+ "column": 34
+ },
+ "end": {
+ "offset": 1170,
+ "line": 42,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1171,
+ "line": 42,
+ "column": 36
+ },
+ "end": {
+ "offset": 1175,
+ "line": 42,
+ "column": 40
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "at_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 43,
+ "column": 25
+ },
+ "data": {
+ "statement": "wait io . di [ 1 ] == true timeout 2 s on_timeout alarm \"Clamp close timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 1200,
+ "line": 43,
+ "column": 25
+ },
+ "end": {
+ "offset": 1204,
+ "line": 43,
+ "column": 29
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1205,
+ "line": 43,
+ "column": 30
+ },
+ "end": {
+ "offset": 1207,
+ "line": 43,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1207,
+ "line": 43,
+ "column": 32
+ },
+ "end": {
+ "offset": 1208,
+ "line": 43,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 1208,
+ "line": 43,
+ "column": 33
+ },
+ "end": {
+ "offset": 1210,
+ "line": 43,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1210,
+ "line": 43,
+ "column": 35
+ },
+ "end": {
+ "offset": 1211,
+ "line": 43,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1211,
+ "line": 43,
+ "column": 36
+ },
+ "end": {
+ "offset": 1212,
+ "line": 43,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1212,
+ "line": 43,
+ "column": 37
+ },
+ "end": {
+ "offset": 1213,
+ "line": 43,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 1214,
+ "line": 43,
+ "column": 39
+ },
+ "end": {
+ "offset": 1216,
+ "line": 43,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1217,
+ "line": 43,
+ "column": 42
+ },
+ "end": {
+ "offset": 1221,
+ "line": 43,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 1222,
+ "line": 43,
+ "column": 47
+ },
+ "end": {
+ "offset": 1229,
+ "line": 43,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1230,
+ "line": 43,
+ "column": 55
+ },
+ "end": {
+ "offset": 1233,
+ "line": 43,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 1234,
+ "line": 43,
+ "column": 59
+ },
+ "end": {
+ "offset": 1244,
+ "line": 43,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 1245,
+ "line": 43,
+ "column": 70
+ },
+ "end": {
+ "offset": 1250,
+ "line": 43,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"Clamp close timeout\"",
+ "value": "Clamp close timeout",
+ "range": {
+ "start": {
+ "offset": 1251,
+ "line": 43,
+ "column": 76
+ },
+ "end": {
+ "offset": 1272,
+ "line": 43,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "place_path",
+ "operationId": "place_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "place_path",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "place_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "above_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.42000000000000004
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 53,
+ "column": 23
+ }
+ },
+ {
+ "id": "at_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.32
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.3297802811774664e-17,
+ 4.3297802811774664e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 54,
+ "column": 20
+ }
+ },
+ {
+ "id": "leave_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.42000000000000004
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 57,
+ "column": 23
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "after",
+ "pointId": "at_place",
+ "kind": "io",
+ "sourceMap": {
+ "line": 55,
+ "column": 26
+ },
+ "data": {
+ "statement": "io . do [ 1 ] = false",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1565,
+ "line": 55,
+ "column": 26
+ },
+ "end": {
+ "offset": 1567,
+ "line": 55,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1567,
+ "line": 55,
+ "column": 28
+ },
+ "end": {
+ "offset": 1568,
+ "line": 55,
+ "column": 29
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 1568,
+ "line": 55,
+ "column": 29
+ },
+ "end": {
+ "offset": 1570,
+ "line": 55,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1570,
+ "line": 55,
+ "column": 31
+ },
+ "end": {
+ "offset": 1571,
+ "line": 55,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1571,
+ "line": 55,
+ "column": 32
+ },
+ "end": {
+ "offset": 1572,
+ "line": 55,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1572,
+ "line": 55,
+ "column": 33
+ },
+ "end": {
+ "offset": 1573,
+ "line": 55,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 1574,
+ "line": 55,
+ "column": 35
+ },
+ "end": {
+ "offset": 1575,
+ "line": 55,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "false",
+ "value": "false",
+ "range": {
+ "start": {
+ "offset": 1576,
+ "line": 55,
+ "column": 37
+ },
+ "end": {
+ "offset": 1581,
+ "line": 55,
+ "column": 42
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "at_place",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 56,
+ "column": 26
+ },
+ "data": {
+ "statement": "wait io . di [ 2 ] == true timeout 2 s on_timeout alarm \"Clamp open timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 1607,
+ "line": 56,
+ "column": 26
+ },
+ "end": {
+ "offset": 1611,
+ "line": 56,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1612,
+ "line": 56,
+ "column": 31
+ },
+ "end": {
+ "offset": 1614,
+ "line": 56,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1614,
+ "line": 56,
+ "column": 33
+ },
+ "end": {
+ "offset": 1615,
+ "line": 56,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 1615,
+ "line": 56,
+ "column": 34
+ },
+ "end": {
+ "offset": 1617,
+ "line": 56,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1617,
+ "line": 56,
+ "column": 36
+ },
+ "end": {
+ "offset": 1618,
+ "line": 56,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1618,
+ "line": 56,
+ "column": 37
+ },
+ "end": {
+ "offset": 1619,
+ "line": 56,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1619,
+ "line": 56,
+ "column": 38
+ },
+ "end": {
+ "offset": 1620,
+ "line": 56,
+ "column": 39
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 1621,
+ "line": 56,
+ "column": 40
+ },
+ "end": {
+ "offset": 1623,
+ "line": 56,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1624,
+ "line": 56,
+ "column": 43
+ },
+ "end": {
+ "offset": 1628,
+ "line": 56,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 1629,
+ "line": 56,
+ "column": 48
+ },
+ "end": {
+ "offset": 1636,
+ "line": 56,
+ "column": 55
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1637,
+ "line": 56,
+ "column": 56
+ },
+ "end": {
+ "offset": 1640,
+ "line": 56,
+ "column": 59
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 1641,
+ "line": 56,
+ "column": 60
+ },
+ "end": {
+ "offset": 1651,
+ "line": 56,
+ "column": 70
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 1652,
+ "line": 56,
+ "column": 71
+ },
+ "end": {
+ "offset": 1657,
+ "line": 56,
+ "column": 76
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"Clamp open timeout\"",
+ "value": "Clamp open timeout",
+ "range": {
+ "start": {
+ "offset": 1658,
+ "line": 56,
+ "column": 77
+ },
+ "end": {
+ "offset": 1678,
+ "line": 56,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/post-report.json
new file mode 100644
index 0000000..0db5c5f
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/post-report.json
@@ -0,0 +1,45 @@
+{
+ "filenames": [
+ "W2FullSpecExample.mod",
+ "W2FullSpecExample.ls",
+ "W2FullSpecExample.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/trace.json
new file mode 100644
index 0000000..1fca576
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/trace.json
@@ -0,0 +1,155 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2FullSpecExample",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2FullSpecExample"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:78:5",
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:78:5",
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/trajectory.json
new file mode 100644
index 0000000..2d5b5e0
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 32,
+ "duration": 1.92,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/compile.json
new file mode 100644
index 0000000..9c97d4d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/compile.json
@@ -0,0 +1,11 @@
+{
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/post-report.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/post-report.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/compile.json
new file mode 100644
index 0000000..9c97d4d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/compile.json
@@ -0,0 +1,11 @@
+{
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/post-report.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/post-report.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/compile.json
new file mode 100644
index 0000000..9c97d4d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/compile.json
@@ -0,0 +1,11 @@
+{
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/post-report.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/post-report.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/compile.json
new file mode 100644
index 0000000..9c97d4d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/compile.json
@@ -0,0 +1,11 @@
+{
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/post-report.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/post-report.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/compile.json
new file mode 100644
index 0000000..6d939b1
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2RuntimeTimeout",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 5,
+ "procedureCount": 2,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/controller.json
new file mode 100644
index 0000000..ac88b82
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/controller.json
@@ -0,0 +1,431 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "running",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:0": 0,
+ "$wait:main:1": 0.1
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "DI99 timeout",
+ "message": "DI99 timeout",
+ "severity": "warning",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "time": 0.1
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2RuntimeTimeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2RuntimeTimeout"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 4
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "timeout",
+ "elapsed": 0.1
+ },
+ "id": 5
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "DI99 timeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "DI99 timeout",
+ "severity": "warning"
+ },
+ "id": 6
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 8
+ }
+ ],
+ "currentSource": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "completed": false
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": false,
+ "io.di[6]": true,
+ "io.di[7]": false,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "scripts": []
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/io.json
new file mode 100644
index 0000000..2fb8400
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/io.json
@@ -0,0 +1,139 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": false,
+ "io.di[6]": true,
+ "io.di[7]": false,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "scripts": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/motion-queue.json
new file mode 100644
index 0000000..57085bb
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/motion-queue.json
@@ -0,0 +1,5 @@
+{
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/post-report.json
new file mode 100644
index 0000000..d9d6613
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2RuntimeTimeout.mod",
+ "W2RuntimeTimeout.ls",
+ "W2RuntimeTimeout.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/trace.json
new file mode 100644
index 0000000..fedfe64
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/trace.json
@@ -0,0 +1,165 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2RuntimeTimeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2RuntimeTimeout"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 4
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "timeout",
+ "elapsed": 0.1
+ },
+ "id": 5
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "DI99 timeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "DI99 timeout",
+ "severity": "warning"
+ },
+ "id": 6
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 8
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/trajectory.json
new file mode 100644
index 0000000..cb22e65
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/trajectory.json
@@ -0,0 +1,21 @@
+{
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/compile.json
new file mode 100644
index 0000000..4b5e199
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2BrandHints",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 1,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 7,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/post-report.json
new file mode 100644
index 0000000..d8d1d95
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/post-report.json
@@ -0,0 +1,45 @@
+{
+ "filenames": [
+ "W2BrandHints.mod",
+ "W2BrandHints.ls",
+ "W2BrandHints.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint fanuc ignored for abb",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint kuka ignored for abb",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint kuka ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for kuka",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint fanuc ignored for kuka",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/roundtrip.json
new file mode 100644
index 0000000..8d3ce25
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/roundtrip.json
@@ -0,0 +1,29 @@
+{
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2BrandHints.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/compile.json
new file mode 100644
index 0000000..64b7f0c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2CrossBrandMotion",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 6,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 10,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/post-report.json
new file mode 100644
index 0000000..e129436
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/post-report.json
@@ -0,0 +1,21 @@
+{
+ "filenames": [
+ "W2CrossBrandMotion.mod",
+ "W2CrossBrandMotion.ls",
+ "W2CrossBrandMotion.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for kuka",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/roundtrip.json
new file mode 100644
index 0000000..6a91bfc
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/roundtrip.json
@@ -0,0 +1,29 @@
+{
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2CrossBrandMotion.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/compile.json
new file mode 100644
index 0000000..2863696
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2Roundtrip",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 1,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/post-report.json
new file mode 100644
index 0000000..3290428
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/post-report.json
@@ -0,0 +1,27 @@
+{
+ "filenames": [
+ "W2Roundtrip.mod",
+ "W2Roundtrip.ls",
+ "W2Roundtrip.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/roundtrip.json
new file mode 100644
index 0000000..a9f636c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/roundtrip.json
@@ -0,0 +1,29 @@
+{
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2Roundtrip.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/report.html b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/report.html
new file mode 100644
index 0000000..6e1bc90
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/report.html
@@ -0,0 +1,40 @@
+
+
+
+
+ W2-JOB-20260628024709-51484d62
+
+
+
+ W2-JOB-20260628024709-51484d62
+ Suite working2-abb120-spec / Robot abb_irb120_3_58
+ Covered sections: 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25
+
+ | Program | Layer | Status | Diagnostics |
+ | W2_00_MinimalModule | Runtime | pass | 0 |
+| W2_10_DataTargetToolFrame | Runtime | pass | 8 |
+| W2_20_ExpressionMath | Runtime | pass | 0 |
+| W2_30_MotionAllTypes | Runtime | pass | 8 |
+| W2_40_PathEvents | Runtime | pass | 0 |
+| W2_50_OperationProcess | Runtime | pass | 0 |
+| W2_60_IOWaitPulse | Runtime | pass | 0 |
+| W2_70_ControlFlow | Runtime | pass | 45 |
+| W2_80_ProcFuncCall | Runtime | pass | 6 |
+| W2_90_ExceptionAlarm | Runtime | pass | 13 |
+| W2_99_FullSpecExample | Runtime | pass | 4 |
+| W2_E10_ExpressionDiagnostics | Static | diagnostic | 13 |
+| W2_E20_SemanticDiagnostics | Static | diagnostic | 6 |
+| W2_E30_MotionDiagnostics | Static | diagnostic | 4 |
+| W2_E40_ControlFlowDiagnostics | Static | diagnostic | 9 |
+| W2_E50_RuntimeTimeout | Runtime | diagnostic | 1 |
+| W2_P10_BrandHints | Post | pass | 10 |
+| W2_P20_CrossBrandMotion | Post | pass | 6 |
+| W2_P30_Roundtrip | Post | pass | 7 |
+
+
+
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/report.json
new file mode 100644
index 0000000..f2a2aa2
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/report.json
@@ -0,0 +1,1409 @@
+{
+ "job_id": "W2-JOB-20260628024709-51484d62",
+ "suite_id": "working2-abb120-spec",
+ "robot_id": "abb_irb120_3_58",
+ "coverage": {
+ "specSections": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25
+ ],
+ "coveredSections": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25
+ ],
+ "missingSections": [],
+ "runtimePrograms": 12,
+ "staticPrograms": 4,
+ "postPrograms": 3
+ },
+ "summary": {
+ "programs": 19,
+ "pass": 14,
+ "diagnostic": 5,
+ "fail": 0
+ },
+ "diagnostics": [
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 37,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 37,
+ "column": 14
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 38,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 38,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_speed preserved as raw IR",
+ "sourceMap": {
+ "line": 39,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement vl preserved as raw IR",
+ "sourceMap": {
+ "line": 39,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_zone preserved as raw IR",
+ "sourceMap": {
+ "line": 40,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement z5 preserved as raw IR",
+ "sourceMap": {
+ "line": 40,
+ "column": 14
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 14
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_speed preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement vl preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_zone preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement z10 preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 14
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 18
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 24
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 31
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement elseif preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fault preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 12
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement == preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 18
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement true preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 21
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement FAULT preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"fault\" preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 19
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement else preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement NOT_READY preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"not ready\" preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 23
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement retry preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement = preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 1 preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement continue preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 18
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 24
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 31
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement case preserved as raw IR",
+ "sourceMap": {
+ "line": 26,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 1 preserved as raw IR",
+ "sourceMap": {
+ "line": 26,
+ "column": 12
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement MODE1 preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"mode 1\" preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 21
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement break preserved as raw IR",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement case preserved as raw IR",
+ "sourceMap": {
+ "line": 29,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 2 preserved as raw IR",
+ "sourceMap": {
+ "line": 29,
+ "column": 12
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 9
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 20
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 28
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 33
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement default preserved as raw IR",
+ "sourceMap": {
+ "line": 31,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 9
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement MODE_OTHER preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"mode other\" preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 18
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 24
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 31
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "warning",
+ "code": "GRL_P1_UNIMPLEMENTED",
+ "message": "trap recover_trap is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 6,
+ "column": 3
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "warning",
+ "code": "GRL_P1_UNIMPLEMENTED",
+ "message": "task background is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 9,
+ "column": 3
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement raise preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement E_PICK_FAILED preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement E_PICK_FAILED preserved as raw IR",
+ "sourceMap": {
+ "line": 17,
+ "column": 11
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement RECOVER preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"recovering\" preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 21
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement severity preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 34
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement warning preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 43
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement CLEANUP preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"cleanup\" preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 21
+ }
+ },
+ {
+ "program_id": "W2_99_FullSpecExample",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 74,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_99_FullSpecExample",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 74,
+ "column": 14
+ }
+ },
+ {
+ "program_id": "W2_99_FullSpecExample",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 75,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_99_FullSpecExample",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 75,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_SYMBOL",
+ "message": "Unknown constant missing_symbol",
+ "sourceMap": {
+ "line": 4,
+ "column": 41
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_SYMBOL",
+ "message": "Unknown constant missing_symbol",
+ "sourceMap": {
+ "line": 4,
+ "column": 41
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_FUNCTION",
+ "message": "Unknown function no_such_function",
+ "sourceMap": {
+ "line": 5,
+ "column": 43
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_ARITY",
+ "message": "atan2 expects 2 argument(s)",
+ "sourceMap": {
+ "line": 6,
+ "column": 36
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_DOMAIN",
+ "message": "Function argument is below domain",
+ "sourceMap": {
+ "line": 7,
+ "column": 33
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_DIV_ZERO",
+ "message": "Division by zero",
+ "sourceMap": {
+ "line": 8,
+ "column": 35
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_UNIT_MISMATCH",
+ "message": "Cannot combine length and time",
+ "sourceMap": {
+ "line": 9,
+ "column": 25
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_SYMBOL",
+ "message": "Unknown constant missing_symbol",
+ "sourceMap": {
+ "line": 4,
+ "column": 41
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_FUNCTION",
+ "message": "Unknown function no_such_function",
+ "sourceMap": {
+ "line": 5,
+ "column": 43
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_ARITY",
+ "message": "atan2 expects 2 argument(s)",
+ "sourceMap": {
+ "line": 6,
+ "column": 36
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_DOMAIN",
+ "message": "Function argument is below domain",
+ "sourceMap": {
+ "line": 7,
+ "column": 33
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_DIV_ZERO",
+ "message": "Division by zero",
+ "sourceMap": {
+ "line": 8,
+ "column": 35
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_UNIT_MISMATCH",
+ "message": "Cannot combine length and time",
+ "sourceMap": {
+ "line": 9,
+ "column": 25
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "severity": "error",
+ "code": "GRL_ARGUMENT_NOT_LVALUE",
+ "message": "out argument done must be a writable lvalue",
+ "sourceMap": {
+ "line": 15,
+ "column": 19
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "severity": "error",
+ "code": "GRL_SYMBOL_DUPLICATE",
+ "message": "Duplicate symbol v",
+ "sourceMap": {
+ "line": 4,
+ "column": 3
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "severity": "error",
+ "code": "GRL_ARGUMENT_NOT_LVALUE",
+ "message": "out argument done must be a writable lvalue",
+ "sourceMap": {
+ "line": 15,
+ "column": 19
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "severity": "error",
+ "code": "GRL_FUNC_SIDE_EFFECT",
+ "message": "Function bad_func cannot execute wait",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "severity": "error",
+ "code": "GRL_CALL_TARGET_NOT_FOUND",
+ "message": "Unknown call target missing_proc",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "severity": "error",
+ "code": "GRL_TARGET_NOT_FOUND",
+ "message": "Unknown target missing_target"
+ },
+ {
+ "program_id": "W2_E30_MotionDiagnostics",
+ "severity": "error",
+ "code": "GRL_PATH_EMPTY",
+ "message": "Path empty_path must contain at least one point"
+ },
+ {
+ "program_id": "W2_E30_MotionDiagnostics",
+ "severity": "error",
+ "code": "GRL_PATH_EMPTY",
+ "message": "Path empty_path must contain at least one point"
+ },
+ {
+ "program_id": "W2_E30_MotionDiagnostics",
+ "severity": "error",
+ "code": "KDL_JOINT_LIMIT",
+ "message": "joint_1 exceeds fixture limit",
+ "segmentId": "main:MOVEJ",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E30_MotionDiagnostics",
+ "severity": "error",
+ "code": "KDL_TARGET_UNREACHABLE",
+ "message": "Target main:MOVEL is outside ABB120 fixture workspace",
+ "segmentId": "main:MOVEL",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_CONTINUE_OUTSIDE_LOOP",
+ "message": "continue is only valid inside loop",
+ "sourceMap": {
+ "line": 6,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_SWITCH_CASE_DUPLICATE",
+ "message": "Duplicate switch case 1",
+ "sourceMap": {
+ "line": 14,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_SWITCH_CASE_NOT_CONSTANT",
+ "message": "switch case must be a constant expression",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_LABEL_NOT_FOUND",
+ "message": "Unknown label missing",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_JUMP_INTO_BLOCK",
+ "message": "jump cannot enter a nested or sibling block"
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E50_RuntimeTimeout",
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint fanuc ignored for abb",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint kuka ignored for abb",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint kuka ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint fanuc ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2BrandHints.mod",
+ "line": 3
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2CrossBrandMotion.mod",
+ "line": 3
+ }
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2Roundtrip.mod",
+ "line": 3
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/job.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/job.json
new file mode 100644
index 0000000..6d8be36
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/job.json
@@ -0,0 +1,24632 @@
+{
+ "job_id": "W2-JOB-20260628082622-51484d62",
+ "suite_id": "working2-abb120-spec",
+ "robot_id": "abb_irb120_3_58",
+ "robot": {
+ "robotId": "abb_irb120_3_58",
+ "urdf": "\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n",
+ "loadOptions": {
+ "robotId": "abb_irb120_3_58",
+ "baseLink": "base_link",
+ "tipLink": "tool0"
+ },
+ "source": {
+ "repository": "https://github.com/ros-industrial/abb",
+ "branch": "noetic-devel",
+ "entrypoint": "abb_irb120_support/urdf/irb120_3_58.xacro",
+ "macro": "abb_irb120_support/urdf/irb120_3_58_macro.xacro"
+ },
+ "standardJoints": {
+ "home": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "approach": [
+ 0,
+ -0.4,
+ 0.5,
+ 0,
+ 0.2,
+ 0
+ ],
+ "pick": [
+ 0.2,
+ -0.35,
+ 0.45,
+ 0.1,
+ -0.2,
+ 0.3
+ ],
+ "place": [
+ -0.35,
+ -0.25,
+ 0.35,
+ -0.25,
+ 0.15,
+ -0.4
+ ]
+ }
+ },
+ "git_revision": "working-tree",
+ "manifest_hash": "ead98b6d28dd4ef6718c82ed930805c021547a79c74dd2fe5413d85f8896d67a",
+ "coverage": {
+ "specSections": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25
+ ],
+ "coveredSections": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25
+ ],
+ "missingSections": [],
+ "runtimePrograms": 12,
+ "staticPrograms": 4,
+ "postPrograms": 3
+ },
+ "programs": [
+ {
+ "program_id": "W2_00_MinimalModule",
+ "file": "runtime/W2_00_MinimalModule.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "4eae9a20aaf3becd68f0577a1a98c52ff25ec9dfdea700919e9920bd94945f59",
+ "spec_sections": [
+ 4,
+ 5,
+ 6,
+ 9,
+ 10,
+ 23
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628082622-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/compile.json",
+ "controllerJson": "W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/controller.json",
+ "motionQueueJson": "W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/motion-queue.json",
+ "traceJson": "W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/trace.json",
+ "ioJson": "W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/io.json",
+ "trajectoryJson": "W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/trajectory.json",
+ "postReportJson": "W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/post-report.json",
+ "roundtripJson": "W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/roundtrip.json",
+ "reportJson": "W2-JOB-20260628082622-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628082622-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2MinimalModule",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 1,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 4,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MinimalModule",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MinimalModule"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_00_MinimalModule-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MinimalModule",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MinimalModule"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_00_MinimalModule-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "frames": [
+ {
+ "index": 0,
+ "time": 0,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 1,
+ "time": 0.08,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 2,
+ "time": 0.16,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 3,
+ "time": 0.24,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "diagnostics": []
+ }
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2MinimalModule.mod",
+ "W2MinimalModule.ls",
+ "W2MinimalModule.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "file": "runtime/W2_10_DataTargetToolFrame.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "6e7480a7195f219554aa1463e3fe832830d9af027a0c3748a740ff48936d1e3d",
+ "spec_sections": [
+ 6,
+ 8,
+ 9
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 37,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 37,
+ "column": 14
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 38,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 38,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_speed preserved as raw IR",
+ "sourceMap": {
+ "line": 39,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement vl preserved as raw IR",
+ "sourceMap": {
+ "line": 39,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_zone preserved as raw IR",
+ "sourceMap": {
+ "line": 40,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement z5 preserved as raw IR",
+ "sourceMap": {
+ "line": 40,
+ "column": 14
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628082622-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/compile.json",
+ "controllerJson": "W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/controller.json",
+ "motionQueueJson": "W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/motion-queue.json",
+ "traceJson": "W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/trace.json",
+ "ioJson": "W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/io.json",
+ "trajectoryJson": "W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/trajectory.json",
+ "postReportJson": "W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/post-report.json",
+ "roundtripJson": "W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/roundtrip.json",
+ "reportJson": "W2-JOB-20260628082622-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628082622-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2DataTargetToolFrame",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 19,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2DataTargetToolFrame",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2DataTargetToolFrame"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_10_DataTargetToolFrame-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2DataTargetToolFrame",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2DataTargetToolFrame"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_10_DataTargetToolFrame-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.5,
+ 0.03,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "frames": [
+ {
+ "index": 0,
+ "time": 0,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 1,
+ "time": 0.08,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 2,
+ "time": 0.16,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 3,
+ "time": 0.24,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 4,
+ "time": 0.24,
+ "motion": "MOVEJ",
+ "segmentId": "motion_2",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 5,
+ "time": 0.32,
+ "motion": "MOVEJ",
+ "segmentId": "motion_2",
+ "joints": [
+ 0,
+ -0.133333,
+ 0.166667,
+ 0,
+ 0.066667,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 6,
+ "time": 0.4,
+ "motion": "MOVEJ",
+ "segmentId": "motion_2",
+ "joints": [
+ 0,
+ -0.266667,
+ 0.333333,
+ 0,
+ 0.133333,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 7,
+ "time": 0.48,
+ "motion": "MOVEJ",
+ "segmentId": "motion_2",
+ "joints": [
+ 0,
+ -0.4,
+ 0.5,
+ 0,
+ 0.2,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 8,
+ "time": 0.48,
+ "motion": "MOVEL",
+ "segmentId": "motion_3",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 9,
+ "time": 0.56,
+ "motion": "MOVEL",
+ "segmentId": "motion_3",
+ "joints": [
+ 0.166667,
+ 0.01,
+ -0.166667,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 10,
+ "time": 0.64,
+ "motion": "MOVEL",
+ "segmentId": "motion_3",
+ "joints": [
+ 0.333333,
+ 0.02,
+ -0.333333,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 11,
+ "time": 0.72,
+ "motion": "MOVEL",
+ "segmentId": "motion_3",
+ "joints": [
+ 0.5,
+ 0.03,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "diagnostics": []
+ }
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2DataTargetToolFrame.mod",
+ "W2DataTargetToolFrame.ls",
+ "W2DataTargetToolFrame.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_20_ExpressionMath",
+ "file": "runtime/W2_20_ExpressionMath.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "2e1afb8beaa60b2666056b1d6594a58da50a006c761e76ef131c9cfdd40c29b3",
+ "spec_sections": [
+ 7,
+ 9,
+ 13
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628082622-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/compile.json",
+ "controllerJson": "W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/controller.json",
+ "motionQueueJson": "W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/motion-queue.json",
+ "traceJson": "W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/trace.json",
+ "ioJson": "W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/io.json",
+ "trajectoryJson": "W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/trajectory.json",
+ "postReportJson": "W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/post-report.json",
+ "roundtripJson": "W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/roundtrip.json",
+ "reportJson": "W2-JOB-20260628082622-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628082622-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2ExpressionMath",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 2,
+ "kdlPathRequests": 0,
+ "symbolCount": 9,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:2": 0
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExpressionMath",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExpressionMath"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_20_ExpressionMath-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExpressionMath",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExpressionMath"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_20_ExpressionMath-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 8,
+ "duration": 0.48,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.45,
+ 0.04,
+ -0.2,
+ 0,
+ 0,
+ 0
+ ],
+ "frames": [
+ {
+ "index": 0,
+ "time": 0,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 1,
+ "time": 0.08,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0.087266,
+ -0.174533,
+ 0,
+ 0.087266,
+ 0.017453
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 2,
+ "time": 0.16,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0.174533,
+ -0.349066,
+ 0,
+ 0.174533,
+ 0.034907
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 3,
+ "time": 0.24,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0.261799,
+ -0.523599,
+ 0,
+ 0.261799,
+ 0.05236
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 4,
+ "time": 0.24,
+ "motion": "MOVEL",
+ "segmentId": "motion_2",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 5,
+ "time": 0.32,
+ "motion": "MOVEL",
+ "segmentId": "motion_2",
+ "joints": [
+ 0.15,
+ 0.013333,
+ -0.066667,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 6,
+ "time": 0.4,
+ "motion": "MOVEL",
+ "segmentId": "motion_2",
+ "joints": [
+ 0.3,
+ 0.026667,
+ -0.133333,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 7,
+ "time": 0.48,
+ "motion": "MOVEL",
+ "segmentId": "motion_2",
+ "joints": [
+ 0.45,
+ 0.04,
+ -0.2,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "diagnostics": []
+ }
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2ExpressionMath.mod",
+ "W2ExpressionMath.ls",
+ "W2ExpressionMath.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "file": "runtime/W2_30_MotionAllTypes.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "f851346e7e008aa85718895b6ba97010f3071027f6c3cd920dc5920c7cd6020c",
+ "spec_sections": [
+ 8,
+ 9,
+ 10
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 14
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_speed preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement vl preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_zone preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement z10 preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 14
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628082622-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/compile.json",
+ "controllerJson": "W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/controller.json",
+ "motionQueueJson": "W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/motion-queue.json",
+ "traceJson": "W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/trace.json",
+ "ioJson": "W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/io.json",
+ "trajectoryJson": "W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/trajectory.json",
+ "postReportJson": "W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/post-report.json",
+ "roundtripJson": "W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/roundtrip.json",
+ "reportJson": "W2-JOB-20260628082622-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628082622-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2MotionAllTypes",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 10,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MotionAllTypes",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MotionAllTypes"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_30_MotionAllTypes-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MotionAllTypes",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MotionAllTypes"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_30_MotionAllTypes-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.6,
+ 0,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "frames": [
+ {
+ "index": 0,
+ "time": 0,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 1,
+ "time": 0.08,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 2,
+ "time": 0.16,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 3,
+ "time": 0.24,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 4,
+ "time": 0.24,
+ "motion": "MOVEL",
+ "segmentId": "motion_2",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 5,
+ "time": 0.32,
+ "motion": "MOVEL",
+ "segmentId": "motion_2",
+ "joints": [
+ 0.166667,
+ 0,
+ -0.166667,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 6,
+ "time": 0.4,
+ "motion": "MOVEL",
+ "segmentId": "motion_2",
+ "joints": [
+ 0.333333,
+ 0,
+ -0.333333,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 7,
+ "time": 0.48,
+ "motion": "MOVEL",
+ "segmentId": "motion_2",
+ "joints": [
+ 0.5,
+ 0,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 8,
+ "time": 0.48,
+ "motion": "MOVEC",
+ "segmentId": "motion_3",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 9,
+ "time": 0.56,
+ "motion": "MOVEC",
+ "segmentId": "motion_3",
+ "joints": [
+ 0.2,
+ 0,
+ -0.166667,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 10,
+ "time": 0.64,
+ "motion": "MOVEC",
+ "segmentId": "motion_3",
+ "joints": [
+ 0.4,
+ 0,
+ -0.333333,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 11,
+ "time": 0.72,
+ "motion": "MOVEC",
+ "segmentId": "motion_3",
+ "joints": [
+ 0.6,
+ 0,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "diagnostics": []
+ }
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2MotionAllTypes.mod",
+ "W2MotionAllTypes.ls",
+ "W2MotionAllTypes.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_40_PathEvents",
+ "file": "runtime/W2_40_PathEvents.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "86770c6d548271a2ae9f332b6bd4b84e52b513d41647df37f62b7e49a4b11942",
+ "spec_sections": [
+ 11,
+ 13,
+ 19
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628082622-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/compile.json",
+ "controllerJson": "W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/controller.json",
+ "motionQueueJson": "W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/motion-queue.json",
+ "traceJson": "W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/trace.json",
+ "ioJson": "W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/io.json",
+ "trajectoryJson": "W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/trajectory.json",
+ "postReportJson": "W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/post-report.json",
+ "roundtripJson": "W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/roundtrip.json",
+ "reportJson": "W2-JOB-20260628082622-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628082622-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2PathEvents",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 7,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2PathEvents",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2PathEvents"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "generated_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "generated_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "generated_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p_home",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_pick",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0.20000000169966334,
+ -0.3500000029744108,
+ 0.4500000038242425,
+ 0.10000000084983167,
+ -0.20000000169966334,
+ 0.300000002549495
+ ],
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_place",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.1500000012747475,
+ -0.4000000033993267
+ ],
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "before",
+ "pointId": "p_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 17,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 10 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 703,
+ "line": 17,
+ "column": 25
+ },
+ "end": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ },
+ "end": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ },
+ "end": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ },
+ "end": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ },
+ "end": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ },
+ "end": {
+ "offset": 712,
+ "line": 17,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 713,
+ "line": 17,
+ "column": 35
+ },
+ "end": {
+ "offset": 714,
+ "line": 17,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 715,
+ "line": 17,
+ "column": 37
+ },
+ "end": {
+ "offset": 719,
+ "line": 17,
+ "column": 41
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "p_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 19,
+ "column": 24
+ },
+ "data": {
+ "statement": "wait io . di [ 10 ] == true timeout 2 s on_timeout alarm \"pick sensor timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 780,
+ "line": 19,
+ "column": 24
+ },
+ "end": {
+ "offset": 784,
+ "line": 19,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 785,
+ "line": 19,
+ "column": 29
+ },
+ "end": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ },
+ "end": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ },
+ "end": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ },
+ "end": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ },
+ "end": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ },
+ "end": {
+ "offset": 794,
+ "line": 19,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 795,
+ "line": 19,
+ "column": 39
+ },
+ "end": {
+ "offset": 797,
+ "line": 19,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 798,
+ "line": 19,
+ "column": 42
+ },
+ "end": {
+ "offset": 802,
+ "line": 19,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 803,
+ "line": 19,
+ "column": 47
+ },
+ "end": {
+ "offset": 810,
+ "line": 19,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 811,
+ "line": 19,
+ "column": 55
+ },
+ "end": {
+ "offset": 814,
+ "line": 19,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 815,
+ "line": 19,
+ "column": 59
+ },
+ "end": {
+ "offset": 825,
+ "line": 19,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 826,
+ "line": 19,
+ "column": 70
+ },
+ "end": {
+ "offset": 831,
+ "line": 19,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"pick sensor timeout\"",
+ "value": "pick sensor timeout",
+ "range": {
+ "start": {
+ "offset": 832,
+ "line": 19,
+ "column": 76
+ },
+ "end": {
+ "offset": 853,
+ "line": 19,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_2",
+ "timing": "at",
+ "pointId": "p_place",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 21,
+ "column": 37
+ },
+ "data": {
+ "statement": "pulse io . do [ 11 ] duration 100 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 929,
+ "line": 21,
+ "column": 37
+ },
+ "end": {
+ "offset": 934,
+ "line": 21,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 935,
+ "line": 21,
+ "column": 43
+ },
+ "end": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ },
+ "end": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ },
+ "end": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ },
+ "end": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "11",
+ "value": 11,
+ "range": {
+ "start": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ },
+ "end": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ },
+ "end": {
+ "offset": 944,
+ "line": 21,
+ "column": 52
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 945,
+ "line": 21,
+ "column": 53
+ },
+ "end": {
+ "offset": 953,
+ "line": 21,
+ "column": 61
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "100 ms",
+ "value": 100,
+ "range": {
+ "start": {
+ "offset": 954,
+ "line": 21,
+ "column": 62
+ },
+ "end": {
+ "offset": 960,
+ "line": 21,
+ "column": 68
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.1
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_40_PathEvents-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "generated_path"
+ ],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "generated_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "generated_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "generated_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p_home",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_pick",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0.20000000169966334,
+ -0.3500000029744108,
+ 0.4500000038242425,
+ 0.10000000084983167,
+ -0.20000000169966334,
+ 0.300000002549495
+ ],
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_place",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.1500000012747475,
+ -0.4000000033993267
+ ],
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "before",
+ "pointId": "p_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 17,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 10 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 703,
+ "line": 17,
+ "column": 25
+ },
+ "end": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ },
+ "end": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ },
+ "end": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ },
+ "end": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ },
+ "end": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ },
+ "end": {
+ "offset": 712,
+ "line": 17,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 713,
+ "line": 17,
+ "column": 35
+ },
+ "end": {
+ "offset": 714,
+ "line": 17,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 715,
+ "line": 17,
+ "column": 37
+ },
+ "end": {
+ "offset": 719,
+ "line": 17,
+ "column": 41
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "p_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 19,
+ "column": 24
+ },
+ "data": {
+ "statement": "wait io . di [ 10 ] == true timeout 2 s on_timeout alarm \"pick sensor timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 780,
+ "line": 19,
+ "column": 24
+ },
+ "end": {
+ "offset": 784,
+ "line": 19,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 785,
+ "line": 19,
+ "column": 29
+ },
+ "end": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ },
+ "end": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ },
+ "end": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ },
+ "end": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ },
+ "end": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ },
+ "end": {
+ "offset": 794,
+ "line": 19,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 795,
+ "line": 19,
+ "column": 39
+ },
+ "end": {
+ "offset": 797,
+ "line": 19,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 798,
+ "line": 19,
+ "column": 42
+ },
+ "end": {
+ "offset": 802,
+ "line": 19,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 803,
+ "line": 19,
+ "column": 47
+ },
+ "end": {
+ "offset": 810,
+ "line": 19,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 811,
+ "line": 19,
+ "column": 55
+ },
+ "end": {
+ "offset": 814,
+ "line": 19,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 815,
+ "line": 19,
+ "column": 59
+ },
+ "end": {
+ "offset": 825,
+ "line": 19,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 826,
+ "line": 19,
+ "column": 70
+ },
+ "end": {
+ "offset": 831,
+ "line": 19,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"pick sensor timeout\"",
+ "value": "pick sensor timeout",
+ "range": {
+ "start": {
+ "offset": 832,
+ "line": 19,
+ "column": 76
+ },
+ "end": {
+ "offset": 853,
+ "line": 19,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_2",
+ "timing": "at",
+ "pointId": "p_place",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 21,
+ "column": 37
+ },
+ "data": {
+ "statement": "pulse io . do [ 11 ] duration 100 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 929,
+ "line": 21,
+ "column": 37
+ },
+ "end": {
+ "offset": 934,
+ "line": 21,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 935,
+ "line": 21,
+ "column": 43
+ },
+ "end": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ },
+ "end": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ },
+ "end": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ },
+ "end": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "11",
+ "value": 11,
+ "range": {
+ "start": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ },
+ "end": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ },
+ "end": {
+ "offset": 944,
+ "line": 21,
+ "column": 52
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 945,
+ "line": 21,
+ "column": 53
+ },
+ "end": {
+ "offset": 953,
+ "line": 21,
+ "column": 61
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "100 ms",
+ "value": 100,
+ "range": {
+ "start": {
+ "offset": 954,
+ "line": 21,
+ "column": 62
+ },
+ "end": {
+ "offset": 960,
+ "line": 21,
+ "column": 68
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.1
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2PathEvents",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2PathEvents"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_40_PathEvents-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.15000000127474747,
+ -0.4000000033993266
+ ],
+ "frames": [
+ {
+ "index": 0,
+ "time": 0,
+ "motion": "MOVEJ",
+ "segmentId": "p_home",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 1,
+ "time": 0.08,
+ "motion": "MOVEJ",
+ "segmentId": "p_home",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 2,
+ "time": 0.16,
+ "motion": "MOVEJ",
+ "segmentId": "p_home",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 3,
+ "time": 0.24,
+ "motion": "MOVEJ",
+ "segmentId": "p_home",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 4,
+ "time": 0,
+ "motion": "MOVEJ",
+ "segmentId": "p_pick",
+ "targetId": "pick",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 5,
+ "time": 0.08,
+ "motion": "MOVEJ",
+ "segmentId": "p_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.066667,
+ -0.116667,
+ 0.15,
+ 0.033333,
+ -0.066667,
+ 0.1
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 6,
+ "time": 0.16,
+ "motion": "MOVEJ",
+ "segmentId": "p_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.133333,
+ -0.233333,
+ 0.3,
+ 0.066667,
+ -0.133333,
+ 0.2
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 7,
+ "time": 0.24,
+ "motion": "MOVEJ",
+ "segmentId": "p_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.2,
+ -0.35,
+ 0.45,
+ 0.1,
+ -0.2,
+ 0.3
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 8,
+ "time": 0,
+ "motion": "MOVEJ",
+ "segmentId": "p_place",
+ "targetId": "place",
+ "joints": [
+ 0.2,
+ -0.35,
+ 0.45,
+ 0.1,
+ -0.2,
+ 0.3
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 9,
+ "time": 0.08,
+ "motion": "MOVEJ",
+ "segmentId": "p_place",
+ "targetId": "place",
+ "joints": [
+ 0.016667,
+ -0.316667,
+ 0.416667,
+ -0.016667,
+ -0.083333,
+ 0.066667
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 10,
+ "time": 0.16,
+ "motion": "MOVEJ",
+ "segmentId": "p_place",
+ "targetId": "place",
+ "joints": [
+ -0.166667,
+ -0.283333,
+ 0.383333,
+ -0.133333,
+ 0.033333,
+ -0.166667
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 11,
+ "time": 0.24,
+ "motion": "MOVEJ",
+ "segmentId": "p_place",
+ "targetId": "place",
+ "joints": [
+ -0.35,
+ -0.25,
+ 0.35,
+ -0.25,
+ 0.15,
+ -0.4
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "diagnostics": []
+ }
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2PathEvents.mod",
+ "W2PathEvents.ls",
+ "W2PathEvents.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_50_OperationProcess",
+ "file": "runtime/W2_50_OperationProcess.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "01b2232a6f30383d441f7cc73020fc44d0e752e807ff07f92af0ed9132afa1c6",
+ "spec_sections": [
+ 12,
+ 13
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628082622-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/compile.json",
+ "controllerJson": "W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/controller.json",
+ "motionQueueJson": "W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/motion-queue.json",
+ "traceJson": "W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/trace.json",
+ "ioJson": "W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/io.json",
+ "trajectoryJson": "W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/trajectory.json",
+ "postReportJson": "W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/post-report.json",
+ "roundtripJson": "W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/roundtrip.json",
+ "reportJson": "W2-JOB-20260628082622-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628082622-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2OperationProcess",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 6,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 1
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2OperationProcess",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2OperationProcess"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "start_action",
+ "statement": "io . do [ 1 ] = true",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "op_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "op_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "op_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "end_action",
+ "statement": "io . do [ 1 ] = false",
+ "sourceMap": {
+ "line": 21,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_50_OperationProcess-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "op_path"
+ ],
+ "operationIds": [
+ "pick_op"
+ ],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "start_action",
+ "statement": "io . do [ 1 ] = true",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "op_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "op_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "op_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "end_action",
+ "statement": "io . do [ 1 ] = false",
+ "sourceMap": {
+ "line": 21,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2OperationProcess",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2OperationProcess"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_50_OperationProcess-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "frames": [
+ {
+ "index": 0,
+ "time": 0,
+ "motion": "MOVEJ",
+ "segmentId": "p0",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 1,
+ "time": 0.08,
+ "motion": "MOVEJ",
+ "segmentId": "p0",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 2,
+ "time": 0.16,
+ "motion": "MOVEJ",
+ "segmentId": "p0",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 3,
+ "time": 0.24,
+ "motion": "MOVEJ",
+ "segmentId": "p0",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ },
+ "diagnostics": []
+ }
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2OperationProcess.mod",
+ "W2OperationProcess.ls",
+ "W2OperationProcess.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_60_IOWaitPulse",
+ "file": "runtime/W2_60_IOWaitPulse.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "b473d3fcbc92ba0e6d34790d12ff1367bfc89452744ae540ffd9b301fc7f2636",
+ "spec_sections": [
+ 13
+ ],
+ "diagnostics": [],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628082622-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/compile.json",
+ "controllerJson": "W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/controller.json",
+ "motionQueueJson": "W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/motion-queue.json",
+ "traceJson": "W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/trace.json",
+ "ioJson": "W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/io.json",
+ "trajectoryJson": "W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/trajectory.json",
+ "postReportJson": "W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/post-report.json",
+ "roundtripJson": "W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/roundtrip.json",
+ "reportJson": "W2-JOB-20260628082622-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628082622-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2IOWaitPulse",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 12,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 5,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 10,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 10
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:3": 0,
+ "$wait:main:4": 0,
+ "$wait:main:5": 0.1,
+ "$wait:main:6": 0.1,
+ "$wait:main:7": 0.1
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2IOWaitPulse",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2IOWaitPulse"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 11
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 12
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 13
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 14
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 15
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 16
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 17
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 18
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 19
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ]
+ },
+ "id": 20
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 21
+ },
+ {
+ "time": 0.1,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 22
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 10,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 23
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "io_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "io_path",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "io_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "at",
+ "pointId": "p0",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 9,
+ "column": 35
+ },
+ "data": {
+ "statement": "pulse io . do [ 20 ] duration 50 + 50 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 286,
+ "line": 9,
+ "column": 35
+ },
+ "end": {
+ "offset": 291,
+ "line": 9,
+ "column": 40
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 292,
+ "line": 9,
+ "column": 41
+ },
+ "end": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ },
+ "end": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ },
+ "end": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ },
+ "end": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "20",
+ "value": 20,
+ "range": {
+ "start": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ },
+ "end": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ },
+ "end": {
+ "offset": 301,
+ "line": 9,
+ "column": 50
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 302,
+ "line": 9,
+ "column": 51
+ },
+ "end": {
+ "offset": 310,
+ "line": 9,
+ "column": 59
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 311,
+ "line": 9,
+ "column": 60
+ },
+ "end": {
+ "offset": 313,
+ "line": 9,
+ "column": 62
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "+",
+ "value": "+",
+ "range": {
+ "start": {
+ "offset": 314,
+ "line": 9,
+ "column": 63
+ },
+ "end": {
+ "offset": 315,
+ "line": 9,
+ "column": 64
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50 ms",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 316,
+ "line": 9,
+ "column": 65
+ },
+ "end": {
+ "offset": 321,
+ "line": 9,
+ "column": 70
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.05
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75,
+ "io.do[1]": true,
+ "io.ao[1]": 0.75,
+ "io.go[1]": 3,
+ "io.do[2]": true
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ },
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ },
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ },
+ {
+ "id": 13,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 14,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 15,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_60_IOWaitPulse-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "io_path"
+ ],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "io_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "io_path",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "io_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "at",
+ "pointId": "p0",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 9,
+ "column": 35
+ },
+ "data": {
+ "statement": "pulse io . do [ 20 ] duration 50 + 50 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 286,
+ "line": 9,
+ "column": 35
+ },
+ "end": {
+ "offset": 291,
+ "line": 9,
+ "column": 40
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 292,
+ "line": 9,
+ "column": 41
+ },
+ "end": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ },
+ "end": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ },
+ "end": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ },
+ "end": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "20",
+ "value": 20,
+ "range": {
+ "start": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ },
+ "end": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ },
+ "end": {
+ "offset": 301,
+ "line": 9,
+ "column": 50
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 302,
+ "line": 9,
+ "column": 51
+ },
+ "end": {
+ "offset": 310,
+ "line": 9,
+ "column": 59
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 311,
+ "line": 9,
+ "column": 60
+ },
+ "end": {
+ "offset": 313,
+ "line": 9,
+ "column": 62
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "+",
+ "value": "+",
+ "range": {
+ "start": {
+ "offset": 314,
+ "line": 9,
+ "column": 63
+ },
+ "end": {
+ "offset": 315,
+ "line": 9,
+ "column": 64
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50 ms",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 316,
+ "line": 9,
+ "column": 65
+ },
+ "end": {
+ "offset": 321,
+ "line": 9,
+ "column": 70
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.05
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2IOWaitPulse",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2IOWaitPulse"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 11
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 12
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 13
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 14
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 15
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 16
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 17
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 18
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 19
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ]
+ },
+ "id": 20
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 21
+ },
+ {
+ "time": 0.1,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 22
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 10,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 23
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75,
+ "io.do[1]": true,
+ "io.ao[1]": 0.75,
+ "io.go[1]": 3,
+ "io.do[2]": true
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ },
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ },
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ },
+ {
+ "id": 13,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 14,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 15,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_60_IOWaitPulse-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "frames": [
+ {
+ "index": 0,
+ "time": 0,
+ "motion": "MOVEJ",
+ "segmentId": "p0",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 1,
+ "time": 0.08,
+ "motion": "MOVEJ",
+ "segmentId": "p0",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 2,
+ "time": 0.16,
+ "motion": "MOVEJ",
+ "segmentId": "p0",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 3,
+ "time": 0.24,
+ "motion": "MOVEJ",
+ "segmentId": "p0",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ },
+ "diagnostics": []
+ }
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2IOWaitPulse.mod",
+ "W2IOWaitPulse.ls",
+ "W2IOWaitPulse.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "file": "runtime/W2_70_ControlFlow.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "516fe162d1032f7a3d65c2b632ea10bafb95b10b38ccb15f77db79f86f0aaa7c",
+ "spec_sections": [
+ 14
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 18
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 24
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 26
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 31
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement elseif preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fault preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 12
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement == preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 18
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement true preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 21
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement FAULT preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"fault\" preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 19
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement else preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement NOT_READY preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"not ready\" preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 23
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement retry preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement = preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 1 preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement continue preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 18
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 24
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 26
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 31
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement case preserved as raw IR",
+ "sourceMap": {
+ "line": 26,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 1 preserved as raw IR",
+ "sourceMap": {
+ "line": 26,
+ "column": 12
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement MODE1 preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"mode 1\" preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 21
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement break preserved as raw IR",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement case preserved as raw IR",
+ "sourceMap": {
+ "line": 29,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 2 preserved as raw IR",
+ "sourceMap": {
+ "line": 29,
+ "column": 12
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 9
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 20
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 26
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 28
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 33
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement default preserved as raw IR",
+ "sourceMap": {
+ "line": 31,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 9
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement MODE_OTHER preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 15
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"mode other\" preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 26
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628082622-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/compile.json",
+ "controllerJson": "W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/controller.json",
+ "motionQueueJson": "W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/motion-queue.json",
+ "traceJson": "W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/trace.json",
+ "ioJson": "W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/io.json",
+ "trajectoryJson": "W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/trajectory.json",
+ "postReportJson": "W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/post-report.json",
+ "roundtripJson": "W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/roundtrip.json",
+ "reportJson": "W2-JOB-20260628082622-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628082622-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2ControlFlow",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 14,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 8,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 8
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ },
+ {
+ "id": "else:0",
+ "variables": {
+ "i": 1
+ }
+ },
+ {
+ "id": "for:3",
+ "variables": {}
+ },
+ {
+ "id": "switch:5",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "NOT_READY",
+ "message": "not ready",
+ "severity": "error",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "time": 0
+ },
+ {
+ "id": "MODE1",
+ "message": "mode 1",
+ "severity": "error",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "time": 0.1
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ControlFlow",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ControlFlow"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 1,
+ "message": "not ready",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "NOT_READY",
+ "severity": "error"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "EXEC_WHILE",
+ "source": {
+ "kind": "EXEC_WHILE",
+ "id": "main:EXEC_WHILE:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "EXEC_FOR",
+ "source": {
+ "kind": "EXEC_FOR",
+ "id": "main:EXEC_FOR:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:23:7",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "EXEC_SWITCH",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "BREAK",
+ "source": {
+ "kind": "BREAK",
+ "id": "main:BREAK:28:9",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "info",
+ "code": "VC_BREAK",
+ "message": "BREAK reached",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ "id": 11
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 7,
+ "message": "mode 1",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "MODE1",
+ "severity": "error"
+ },
+ "id": 12
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "id": 13
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_70_ControlFlow-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ControlFlow",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ControlFlow"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 1,
+ "message": "not ready",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "NOT_READY",
+ "severity": "error"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "EXEC_WHILE",
+ "source": {
+ "kind": "EXEC_WHILE",
+ "id": "main:EXEC_WHILE:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "EXEC_FOR",
+ "source": {
+ "kind": "EXEC_FOR",
+ "id": "main:EXEC_FOR:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:23:7",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "EXEC_SWITCH",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "BREAK",
+ "source": {
+ "kind": "BREAK",
+ "id": "main:BREAK:28:9",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "info",
+ "code": "VC_BREAK",
+ "message": "BREAK reached",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ "id": 11
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 7,
+ "message": "mode 1",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "MODE1",
+ "severity": "error"
+ },
+ "id": 12
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "id": 13
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_70_ControlFlow-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "frames": [],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2ControlFlow.mod",
+ "W2ControlFlow.ls",
+ "W2ControlFlow.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "file": "runtime/W2_80_ProcFuncCall.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "701334663d6a215852dbe4c78b3025ebcda5e318513a1e73ab0e6518c49788d5",
+ "spec_sections": [
+ 15
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 18
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 24
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 26
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 31
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628082622-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/compile.json",
+ "controllerJson": "W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/controller.json",
+ "motionQueueJson": "W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/motion-queue.json",
+ "traceJson": "W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/trace.json",
+ "ioJson": "W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/io.json",
+ "trajectoryJson": "W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/trajectory.json",
+ "postReportJson": "W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/post-report.json",
+ "roundtripJson": "W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/roundtrip.json",
+ "reportJson": "W2-JOB-20260628082622-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628082622-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2ProcFuncCall",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 9,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 8,
+ "procedureCount": 3,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 5,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 5
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ProcFuncCall",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ProcFuncCall"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call read_part",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "read_part:RAW_STATEMENT:8:5",
+ "sourceMap": {
+ "line": 8,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 3,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "CALL",
+ "id": "main:CALL:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call increment_retry",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 8
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "increment_retry:RAW_STATEMENT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RETURN",
+ "source": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 11
+ }
+ ],
+ "currentSource": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "completed": true
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_80_ProcFuncCall-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ProcFuncCall",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ProcFuncCall"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call read_part",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "read_part:RAW_STATEMENT:8:5",
+ "sourceMap": {
+ "line": 8,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 3,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "CALL",
+ "id": "main:CALL:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call increment_retry",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 8
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "increment_retry:RAW_STATEMENT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RETURN",
+ "source": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 11
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_80_ProcFuncCall-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "frames": [],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2ProcFuncCall.mod",
+ "W2ProcFuncCall.ls",
+ "W2ProcFuncCall.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "file": "runtime/W2_90_ExceptionAlarm.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "494455105f84d035ce785747ee5dde77d85db6fb2bd907d1774d1de14e61a6a0",
+ "spec_sections": [
+ 16,
+ 17
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "GRL_P1_UNIMPLEMENTED",
+ "message": "trap recover_trap is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 6,
+ "column": 3
+ }
+ },
+ {
+ "severity": "warning",
+ "code": "GRL_P1_UNIMPLEMENTED",
+ "message": "task background is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 9,
+ "column": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement raise preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement E_PICK_FAILED preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement E_PICK_FAILED preserved as raw IR",
+ "sourceMap": {
+ "line": 17,
+ "column": 11
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement RECOVER preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"recovering\" preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 21
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement severity preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 34
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement warning preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 43
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 7
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement CLEANUP preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 13
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"cleanup\" preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 21
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628082622-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/compile.json",
+ "controllerJson": "W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/controller.json",
+ "motionQueueJson": "W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/motion-queue.json",
+ "traceJson": "W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/trace.json",
+ "ioJson": "W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/io.json",
+ "trajectoryJson": "W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/trajectory.json",
+ "postReportJson": "W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/post-report.json",
+ "roundtripJson": "W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/roundtrip.json",
+ "reportJson": "W2-JOB-20260628082622-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628082622-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2ExceptionAlarm",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 5,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 6,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 5,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 5
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "START",
+ "message": "start",
+ "severity": "info",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "time": 0
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExceptionAlarm",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExceptionAlarm"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "start",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "START",
+ "severity": "info"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "enable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ }
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:23:5",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "disable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ }
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 10
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_90_ExceptionAlarm-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExceptionAlarm",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExceptionAlarm"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "start",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "START",
+ "severity": "info"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "enable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ }
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:23:5",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "disable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ }
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 10
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_90_ExceptionAlarm-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "frames": [
+ {
+ "index": 0,
+ "time": 0,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 1,
+ "time": 0.08,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 2,
+ "time": 0.16,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 3,
+ "time": 0.24,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "diagnostics": []
+ }
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2ExceptionAlarm.mod",
+ "W2ExceptionAlarm.ls",
+ "W2ExceptionAlarm.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_99_FullSpecExample",
+ "file": "runtime/W2_99_FullSpecExample.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "cd08e3c9c9c522b75f37f404b4fb915b4af8477ccca5d2f5fc1bed61c9c66024",
+ "spec_sections": [
+ 24
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 74,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 74,
+ "column": 14
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 75,
+ "column": 5
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 75,
+ "column": 15
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628082622-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/compile.json",
+ "controllerJson": "W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/controller.json",
+ "motionQueueJson": "W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/motion-queue.json",
+ "traceJson": "W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/trace.json",
+ "ioJson": "W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/io.json",
+ "trajectoryJson": "W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/trajectory.json",
+ "postReportJson": "W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/post-report.json",
+ "roundtripJson": "W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/roundtrip.json",
+ "reportJson": "W2-JOB-20260628082622-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628082622-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2FullSpecExample",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 14,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 2,
+ "symbolCount": 13,
+ "procedureCount": 1,
+ "pathCount": 2,
+ "operationCount": 2
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2FullSpecExample",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2FullSpecExample"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:78:5",
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:78:5",
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "pick_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "pick_path",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "pick_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "approach",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 39,
+ "column": 20
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "above_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.4
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 40,
+ "column": 22
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "at_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.3
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.3297802811774664e-17,
+ 4.3297802811774664e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 19
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "leave_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.4
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 44,
+ "column": 22
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "after",
+ "pointId": "at_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 42,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 1 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1160,
+ "line": 42,
+ "column": 25
+ },
+ "end": {
+ "offset": 1162,
+ "line": 42,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1162,
+ "line": 42,
+ "column": 27
+ },
+ "end": {
+ "offset": 1163,
+ "line": 42,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 1163,
+ "line": 42,
+ "column": 28
+ },
+ "end": {
+ "offset": 1165,
+ "line": 42,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1165,
+ "line": 42,
+ "column": 30
+ },
+ "end": {
+ "offset": 1166,
+ "line": 42,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1166,
+ "line": 42,
+ "column": 31
+ },
+ "end": {
+ "offset": 1167,
+ "line": 42,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1167,
+ "line": 42,
+ "column": 32
+ },
+ "end": {
+ "offset": 1168,
+ "line": 42,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 1169,
+ "line": 42,
+ "column": 34
+ },
+ "end": {
+ "offset": 1170,
+ "line": 42,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1171,
+ "line": 42,
+ "column": 36
+ },
+ "end": {
+ "offset": 1175,
+ "line": 42,
+ "column": 40
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "at_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 43,
+ "column": 25
+ },
+ "data": {
+ "statement": "wait io . di [ 1 ] == true timeout 2 s on_timeout alarm \"Clamp close timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 1200,
+ "line": 43,
+ "column": 25
+ },
+ "end": {
+ "offset": 1204,
+ "line": 43,
+ "column": 29
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1205,
+ "line": 43,
+ "column": 30
+ },
+ "end": {
+ "offset": 1207,
+ "line": 43,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1207,
+ "line": 43,
+ "column": 32
+ },
+ "end": {
+ "offset": 1208,
+ "line": 43,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 1208,
+ "line": 43,
+ "column": 33
+ },
+ "end": {
+ "offset": 1210,
+ "line": 43,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1210,
+ "line": 43,
+ "column": 35
+ },
+ "end": {
+ "offset": 1211,
+ "line": 43,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1211,
+ "line": 43,
+ "column": 36
+ },
+ "end": {
+ "offset": 1212,
+ "line": 43,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1212,
+ "line": 43,
+ "column": 37
+ },
+ "end": {
+ "offset": 1213,
+ "line": 43,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 1214,
+ "line": 43,
+ "column": 39
+ },
+ "end": {
+ "offset": 1216,
+ "line": 43,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1217,
+ "line": 43,
+ "column": 42
+ },
+ "end": {
+ "offset": 1221,
+ "line": 43,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 1222,
+ "line": 43,
+ "column": 47
+ },
+ "end": {
+ "offset": 1229,
+ "line": 43,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1230,
+ "line": 43,
+ "column": 55
+ },
+ "end": {
+ "offset": 1233,
+ "line": 43,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 1234,
+ "line": 43,
+ "column": 59
+ },
+ "end": {
+ "offset": 1244,
+ "line": 43,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 1245,
+ "line": 43,
+ "column": 70
+ },
+ "end": {
+ "offset": 1250,
+ "line": 43,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"Clamp close timeout\"",
+ "value": "Clamp close timeout",
+ "range": {
+ "start": {
+ "offset": 1251,
+ "line": 43,
+ "column": 76
+ },
+ "end": {
+ "offset": 1272,
+ "line": 43,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "place_path",
+ "operationId": "place_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "place_path",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "place_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "above_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.42000000000000004
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 53,
+ "column": 23
+ }
+ },
+ {
+ "id": "at_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.32
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.3297802811774664e-17,
+ 4.3297802811774664e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 54,
+ "column": 20
+ }
+ },
+ {
+ "id": "leave_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.42000000000000004
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 57,
+ "column": 23
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "after",
+ "pointId": "at_place",
+ "kind": "io",
+ "sourceMap": {
+ "line": 55,
+ "column": 26
+ },
+ "data": {
+ "statement": "io . do [ 1 ] = false",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1565,
+ "line": 55,
+ "column": 26
+ },
+ "end": {
+ "offset": 1567,
+ "line": 55,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1567,
+ "line": 55,
+ "column": 28
+ },
+ "end": {
+ "offset": 1568,
+ "line": 55,
+ "column": 29
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 1568,
+ "line": 55,
+ "column": 29
+ },
+ "end": {
+ "offset": 1570,
+ "line": 55,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1570,
+ "line": 55,
+ "column": 31
+ },
+ "end": {
+ "offset": 1571,
+ "line": 55,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1571,
+ "line": 55,
+ "column": 32
+ },
+ "end": {
+ "offset": 1572,
+ "line": 55,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1572,
+ "line": 55,
+ "column": 33
+ },
+ "end": {
+ "offset": 1573,
+ "line": 55,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 1574,
+ "line": 55,
+ "column": 35
+ },
+ "end": {
+ "offset": 1575,
+ "line": 55,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "false",
+ "value": "false",
+ "range": {
+ "start": {
+ "offset": 1576,
+ "line": 55,
+ "column": 37
+ },
+ "end": {
+ "offset": 1581,
+ "line": 55,
+ "column": 42
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "at_place",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 56,
+ "column": 26
+ },
+ "data": {
+ "statement": "wait io . di [ 2 ] == true timeout 2 s on_timeout alarm \"Clamp open timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 1607,
+ "line": 56,
+ "column": 26
+ },
+ "end": {
+ "offset": 1611,
+ "line": 56,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1612,
+ "line": 56,
+ "column": 31
+ },
+ "end": {
+ "offset": 1614,
+ "line": 56,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1614,
+ "line": 56,
+ "column": 33
+ },
+ "end": {
+ "offset": 1615,
+ "line": 56,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 1615,
+ "line": 56,
+ "column": 34
+ },
+ "end": {
+ "offset": 1617,
+ "line": 56,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1617,
+ "line": 56,
+ "column": 36
+ },
+ "end": {
+ "offset": 1618,
+ "line": 56,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1618,
+ "line": 56,
+ "column": 37
+ },
+ "end": {
+ "offset": 1619,
+ "line": 56,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1619,
+ "line": 56,
+ "column": 38
+ },
+ "end": {
+ "offset": 1620,
+ "line": 56,
+ "column": 39
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 1621,
+ "line": 56,
+ "column": 40
+ },
+ "end": {
+ "offset": 1623,
+ "line": 56,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1624,
+ "line": 56,
+ "column": 43
+ },
+ "end": {
+ "offset": 1628,
+ "line": 56,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 1629,
+ "line": 56,
+ "column": 48
+ },
+ "end": {
+ "offset": 1636,
+ "line": 56,
+ "column": 55
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1637,
+ "line": 56,
+ "column": 56
+ },
+ "end": {
+ "offset": 1640,
+ "line": 56,
+ "column": 59
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 1641,
+ "line": 56,
+ "column": 60
+ },
+ "end": {
+ "offset": 1651,
+ "line": 56,
+ "column": 70
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 1652,
+ "line": 56,
+ "column": 71
+ },
+ "end": {
+ "offset": 1657,
+ "line": 56,
+ "column": 76
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"Clamp open timeout\"",
+ "value": "Clamp open timeout",
+ "range": {
+ "start": {
+ "offset": 1658,
+ "line": 56,
+ "column": 77
+ },
+ "end": {
+ "offset": 1678,
+ "line": 56,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_99_FullSpecExample-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "pick_path",
+ "place_path"
+ ],
+ "operationIds": [
+ "pick_op",
+ "place_op"
+ ],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "pick_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "pick_path",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "pick_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "approach",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 39,
+ "column": 20
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "above_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.4
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 40,
+ "column": 22
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "at_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.3
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.3297802811774664e-17,
+ 4.3297802811774664e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 19
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "leave_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.4
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 44,
+ "column": 22
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "after",
+ "pointId": "at_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 42,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 1 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1160,
+ "line": 42,
+ "column": 25
+ },
+ "end": {
+ "offset": 1162,
+ "line": 42,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1162,
+ "line": 42,
+ "column": 27
+ },
+ "end": {
+ "offset": 1163,
+ "line": 42,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 1163,
+ "line": 42,
+ "column": 28
+ },
+ "end": {
+ "offset": 1165,
+ "line": 42,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1165,
+ "line": 42,
+ "column": 30
+ },
+ "end": {
+ "offset": 1166,
+ "line": 42,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1166,
+ "line": 42,
+ "column": 31
+ },
+ "end": {
+ "offset": 1167,
+ "line": 42,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1167,
+ "line": 42,
+ "column": 32
+ },
+ "end": {
+ "offset": 1168,
+ "line": 42,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 1169,
+ "line": 42,
+ "column": 34
+ },
+ "end": {
+ "offset": 1170,
+ "line": 42,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1171,
+ "line": 42,
+ "column": 36
+ },
+ "end": {
+ "offset": 1175,
+ "line": 42,
+ "column": 40
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "at_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 43,
+ "column": 25
+ },
+ "data": {
+ "statement": "wait io . di [ 1 ] == true timeout 2 s on_timeout alarm \"Clamp close timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 1200,
+ "line": 43,
+ "column": 25
+ },
+ "end": {
+ "offset": 1204,
+ "line": 43,
+ "column": 29
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1205,
+ "line": 43,
+ "column": 30
+ },
+ "end": {
+ "offset": 1207,
+ "line": 43,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1207,
+ "line": 43,
+ "column": 32
+ },
+ "end": {
+ "offset": 1208,
+ "line": 43,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 1208,
+ "line": 43,
+ "column": 33
+ },
+ "end": {
+ "offset": 1210,
+ "line": 43,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1210,
+ "line": 43,
+ "column": 35
+ },
+ "end": {
+ "offset": 1211,
+ "line": 43,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1211,
+ "line": 43,
+ "column": 36
+ },
+ "end": {
+ "offset": 1212,
+ "line": 43,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1212,
+ "line": 43,
+ "column": 37
+ },
+ "end": {
+ "offset": 1213,
+ "line": 43,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 1214,
+ "line": 43,
+ "column": 39
+ },
+ "end": {
+ "offset": 1216,
+ "line": 43,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1217,
+ "line": 43,
+ "column": 42
+ },
+ "end": {
+ "offset": 1221,
+ "line": 43,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 1222,
+ "line": 43,
+ "column": 47
+ },
+ "end": {
+ "offset": 1229,
+ "line": 43,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1230,
+ "line": 43,
+ "column": 55
+ },
+ "end": {
+ "offset": 1233,
+ "line": 43,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 1234,
+ "line": 43,
+ "column": 59
+ },
+ "end": {
+ "offset": 1244,
+ "line": 43,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 1245,
+ "line": 43,
+ "column": 70
+ },
+ "end": {
+ "offset": 1250,
+ "line": 43,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"Clamp close timeout\"",
+ "value": "Clamp close timeout",
+ "range": {
+ "start": {
+ "offset": 1251,
+ "line": 43,
+ "column": 76
+ },
+ "end": {
+ "offset": 1272,
+ "line": 43,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "place_path",
+ "operationId": "place_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "place_path",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "place_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "above_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.42000000000000004
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 53,
+ "column": 23
+ }
+ },
+ {
+ "id": "at_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.32
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.3297802811774664e-17,
+ 4.3297802811774664e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 54,
+ "column": 20
+ }
+ },
+ {
+ "id": "leave_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.42000000000000004
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 57,
+ "column": 23
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "after",
+ "pointId": "at_place",
+ "kind": "io",
+ "sourceMap": {
+ "line": 55,
+ "column": 26
+ },
+ "data": {
+ "statement": "io . do [ 1 ] = false",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1565,
+ "line": 55,
+ "column": 26
+ },
+ "end": {
+ "offset": 1567,
+ "line": 55,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1567,
+ "line": 55,
+ "column": 28
+ },
+ "end": {
+ "offset": 1568,
+ "line": 55,
+ "column": 29
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 1568,
+ "line": 55,
+ "column": 29
+ },
+ "end": {
+ "offset": 1570,
+ "line": 55,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1570,
+ "line": 55,
+ "column": 31
+ },
+ "end": {
+ "offset": 1571,
+ "line": 55,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1571,
+ "line": 55,
+ "column": 32
+ },
+ "end": {
+ "offset": 1572,
+ "line": 55,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1572,
+ "line": 55,
+ "column": 33
+ },
+ "end": {
+ "offset": 1573,
+ "line": 55,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 1574,
+ "line": 55,
+ "column": 35
+ },
+ "end": {
+ "offset": 1575,
+ "line": 55,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "false",
+ "value": "false",
+ "range": {
+ "start": {
+ "offset": 1576,
+ "line": 55,
+ "column": 37
+ },
+ "end": {
+ "offset": 1581,
+ "line": 55,
+ "column": 42
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "at_place",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 56,
+ "column": 26
+ },
+ "data": {
+ "statement": "wait io . di [ 2 ] == true timeout 2 s on_timeout alarm \"Clamp open timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 1607,
+ "line": 56,
+ "column": 26
+ },
+ "end": {
+ "offset": 1611,
+ "line": 56,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1612,
+ "line": 56,
+ "column": 31
+ },
+ "end": {
+ "offset": 1614,
+ "line": 56,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1614,
+ "line": 56,
+ "column": 33
+ },
+ "end": {
+ "offset": 1615,
+ "line": 56,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 1615,
+ "line": 56,
+ "column": 34
+ },
+ "end": {
+ "offset": 1617,
+ "line": 56,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1617,
+ "line": 56,
+ "column": 36
+ },
+ "end": {
+ "offset": 1618,
+ "line": 56,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1618,
+ "line": 56,
+ "column": 37
+ },
+ "end": {
+ "offset": 1619,
+ "line": 56,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1619,
+ "line": 56,
+ "column": 38
+ },
+ "end": {
+ "offset": 1620,
+ "line": 56,
+ "column": 39
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 1621,
+ "line": 56,
+ "column": 40
+ },
+ "end": {
+ "offset": 1623,
+ "line": 56,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1624,
+ "line": 56,
+ "column": 43
+ },
+ "end": {
+ "offset": 1628,
+ "line": 56,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 1629,
+ "line": 56,
+ "column": 48
+ },
+ "end": {
+ "offset": 1636,
+ "line": 56,
+ "column": 55
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1637,
+ "line": 56,
+ "column": 56
+ },
+ "end": {
+ "offset": 1640,
+ "line": 56,
+ "column": 59
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 1641,
+ "line": 56,
+ "column": 60
+ },
+ "end": {
+ "offset": 1651,
+ "line": 56,
+ "column": 70
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 1652,
+ "line": 56,
+ "column": 71
+ },
+ "end": {
+ "offset": 1657,
+ "line": 56,
+ "column": 76
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"Clamp open timeout\"",
+ "value": "Clamp open timeout",
+ "range": {
+ "start": {
+ "offset": 1658,
+ "line": 56,
+ "column": 77
+ },
+ "end": {
+ "offset": 1678,
+ "line": 56,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2FullSpecExample",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2FullSpecExample"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:78:5",
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:78:5",
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_99_FullSpecExample-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "trajectory": {
+ "sampleCount": 32,
+ "duration": 1.92,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "frames": [
+ {
+ "index": 0,
+ "time": 0,
+ "motion": "MOVEJ",
+ "segmentId": "approach",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 39,
+ "column": 20
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 1,
+ "time": 0.08,
+ "motion": "MOVEJ",
+ "segmentId": "approach",
+ "targetId": "home",
+ "joints": [
+ 0,
+ -0.116355,
+ 0.232711,
+ 0,
+ 0.174533,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 39,
+ "column": 20
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 2,
+ "time": 0.16,
+ "motion": "MOVEJ",
+ "segmentId": "approach",
+ "targetId": "home",
+ "joints": [
+ 0,
+ -0.232711,
+ 0.465421,
+ 0,
+ 0.349066,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 39,
+ "column": 20
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 3,
+ "time": 0.24,
+ "motion": "MOVEJ",
+ "segmentId": "approach",
+ "targetId": "home",
+ "joints": [
+ 0,
+ -0.349066,
+ 0.698132,
+ 0,
+ 0.523599,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 39,
+ "column": 20
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 4,
+ "time": 0,
+ "motion": "MOVEL",
+ "segmentId": "above_pick",
+ "targetId": "pick",
+ "joints": [
+ 0,
+ -0.349066,
+ 0.698132,
+ 0,
+ 0.523599,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 40,
+ "column": 22
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 5,
+ "time": 0.08,
+ "motion": "MOVEL",
+ "segmentId": "above_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.166667,
+ -0.192711,
+ 0.432088,
+ 0,
+ 0.349066,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 40,
+ "column": 22
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 6,
+ "time": 0.16,
+ "motion": "MOVEL",
+ "segmentId": "above_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.333333,
+ -0.036355,
+ 0.166044,
+ 0,
+ 0.174533,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 40,
+ "column": 22
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 7,
+ "time": 0.24,
+ "motion": "MOVEL",
+ "segmentId": "above_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.5,
+ 0.12,
+ -0.1,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 40,
+ "column": 22
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 8,
+ "time": 0,
+ "motion": "MOVEL",
+ "segmentId": "at_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.5,
+ 0.12,
+ -0.1,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 19
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 9,
+ "time": 0.08,
+ "motion": "MOVEL",
+ "segmentId": "at_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.5,
+ 0.12,
+ -0.133333,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 19
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 10,
+ "time": 0.16,
+ "motion": "MOVEL",
+ "segmentId": "at_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.5,
+ 0.12,
+ -0.166667,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 19
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 11,
+ "time": 0.24,
+ "motion": "MOVEL",
+ "segmentId": "at_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.5,
+ 0.12,
+ -0.2,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 19
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 12,
+ "time": 0,
+ "motion": "MOVEL",
+ "segmentId": "leave_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.5,
+ 0.12,
+ -0.2,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 44,
+ "column": 22
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 13,
+ "time": 0.08,
+ "motion": "MOVEL",
+ "segmentId": "leave_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.5,
+ 0.12,
+ -0.166667,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 44,
+ "column": 22
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 14,
+ "time": 0.16,
+ "motion": "MOVEL",
+ "segmentId": "leave_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.5,
+ 0.12,
+ -0.133333,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 44,
+ "column": 22
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 15,
+ "time": 0.24,
+ "motion": "MOVEL",
+ "segmentId": "leave_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.5,
+ 0.12,
+ -0.1,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 44,
+ "column": 22
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 16,
+ "time": 0.96,
+ "motion": "MOVEL",
+ "segmentId": "above_place",
+ "targetId": "place",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 53,
+ "column": 23
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 17,
+ "time": 1.04,
+ "motion": "MOVEL",
+ "segmentId": "above_place",
+ "targetId": "place",
+ "joints": [
+ 0.216667,
+ -0.033333,
+ -0.026667,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 53,
+ "column": 23
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 18,
+ "time": 1.12,
+ "motion": "MOVEL",
+ "segmentId": "above_place",
+ "targetId": "place",
+ "joints": [
+ 0.433333,
+ -0.066667,
+ -0.053333,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 53,
+ "column": 23
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 19,
+ "time": 1.2,
+ "motion": "MOVEL",
+ "segmentId": "above_place",
+ "targetId": "place",
+ "joints": [
+ 0.65,
+ -0.1,
+ -0.08,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 53,
+ "column": 23
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 20,
+ "time": 0.96,
+ "motion": "MOVEL",
+ "segmentId": "at_place",
+ "targetId": "place",
+ "joints": [
+ 0.65,
+ -0.1,
+ -0.08,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 54,
+ "column": 20
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 21,
+ "time": 1.04,
+ "motion": "MOVEL",
+ "segmentId": "at_place",
+ "targetId": "place",
+ "joints": [
+ 0.65,
+ -0.1,
+ -0.113333,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 54,
+ "column": 20
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 22,
+ "time": 1.12,
+ "motion": "MOVEL",
+ "segmentId": "at_place",
+ "targetId": "place",
+ "joints": [
+ 0.65,
+ -0.1,
+ -0.146667,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 54,
+ "column": 20
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 23,
+ "time": 1.2,
+ "motion": "MOVEL",
+ "segmentId": "at_place",
+ "targetId": "place",
+ "joints": [
+ 0.65,
+ -0.1,
+ -0.18,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 54,
+ "column": 20
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 24,
+ "time": 0.96,
+ "motion": "MOVEL",
+ "segmentId": "leave_place",
+ "targetId": "place",
+ "joints": [
+ 0.65,
+ -0.1,
+ -0.18,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 57,
+ "column": 23
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 25,
+ "time": 1.04,
+ "motion": "MOVEL",
+ "segmentId": "leave_place",
+ "targetId": "place",
+ "joints": [
+ 0.65,
+ -0.1,
+ -0.146667,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 57,
+ "column": 23
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 26,
+ "time": 1.12,
+ "motion": "MOVEL",
+ "segmentId": "leave_place",
+ "targetId": "place",
+ "joints": [
+ 0.65,
+ -0.1,
+ -0.113333,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 57,
+ "column": 23
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 27,
+ "time": 1.2,
+ "motion": "MOVEL",
+ "segmentId": "leave_place",
+ "targetId": "place",
+ "joints": [
+ 0.65,
+ -0.1,
+ -0.08,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 57,
+ "column": 23
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 28,
+ "time": 1.68,
+ "motion": "MOVEJ",
+ "segmentId": "motion_3",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 29,
+ "time": 1.76,
+ "motion": "MOVEJ",
+ "segmentId": "motion_3",
+ "joints": [
+ 0,
+ -0.116355,
+ 0.232711,
+ 0,
+ 0.174533,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 30,
+ "time": 1.84,
+ "motion": "MOVEJ",
+ "segmentId": "motion_3",
+ "joints": [
+ 0,
+ -0.232711,
+ 0.465421,
+ 0,
+ 0.349066,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 31,
+ "time": 1.92,
+ "motion": "MOVEJ",
+ "segmentId": "motion_3",
+ "joints": [
+ 0,
+ -0.349066,
+ 0.698132,
+ 0,
+ 0.523599,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "diagnostics": []
+ }
+ ],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2FullSpecExample.mod",
+ "W2FullSpecExample.ls",
+ "W2FullSpecExample.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "file": "static/W2_E10_ExpressionDiagnostics.grl",
+ "coverage_level": "Static",
+ "expected_status": "diagnostic",
+ "status": "diagnostic",
+ "input_hash": "c08db186d16a8bc3f0ecb4731abb6601d8c69348fd08ca6b21b8848f32df2347",
+ "spec_sections": [
+ 7,
+ 22
+ ],
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_SYMBOL",
+ "message": "Unknown constant missing_symbol",
+ "sourceMap": {
+ "line": 4,
+ "column": 41
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_SYMBOL",
+ "message": "Unknown constant missing_symbol",
+ "sourceMap": {
+ "line": 4,
+ "column": 41
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_FUNCTION",
+ "message": "Unknown function no_such_function",
+ "sourceMap": {
+ "line": 5,
+ "column": 43
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_ARITY",
+ "message": "atan2 expects 2 argument(s)",
+ "sourceMap": {
+ "line": 6,
+ "column": 36
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_DOMAIN",
+ "message": "Function argument is below domain",
+ "sourceMap": {
+ "line": 7,
+ "column": 33
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_DIV_ZERO",
+ "message": "Division by zero",
+ "sourceMap": {
+ "line": 8,
+ "column": 35
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_UNIT_MISMATCH",
+ "message": "Cannot combine length and time",
+ "sourceMap": {
+ "line": 9,
+ "column": 25
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_SYMBOL",
+ "message": "Unknown constant missing_symbol",
+ "sourceMap": {
+ "line": 4,
+ "column": 41
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_FUNCTION",
+ "message": "Unknown function no_such_function",
+ "sourceMap": {
+ "line": 5,
+ "column": 43
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_ARITY",
+ "message": "atan2 expects 2 argument(s)",
+ "sourceMap": {
+ "line": 6,
+ "column": 36
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_DOMAIN",
+ "message": "Function argument is below domain",
+ "sourceMap": {
+ "line": 7,
+ "column": 33
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_DIV_ZERO",
+ "message": "Division by zero",
+ "sourceMap": {
+ "line": 8,
+ "column": 35
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_EXPR_UNIT_MISMATCH",
+ "message": "Cannot combine length and time",
+ "sourceMap": {
+ "line": 9,
+ "column": 25
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628082622-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/compile.json",
+ "controllerJson": "W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/controller.json",
+ "motionQueueJson": "W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/motion-queue.json",
+ "traceJson": "W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/trace.json",
+ "ioJson": "W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/io.json",
+ "trajectoryJson": "W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/trajectory.json",
+ "postReportJson": "W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/post-report.json",
+ "roundtripJson": "W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/roundtrip.json",
+ "reportJson": "W2-JOB-20260628082622-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628082622-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "file": "static/W2_E20_SemanticDiagnostics.grl",
+ "coverage_level": "Static",
+ "expected_status": "diagnostic",
+ "status": "diagnostic",
+ "input_hash": "98750f73027e3272a3f1e86f90ea6066d67387e7ffef190441893fff38012ed5",
+ "spec_sections": [
+ 6,
+ 15,
+ 22
+ ],
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "GRL_ARGUMENT_NOT_LVALUE",
+ "message": "out argument done must be a writable lvalue",
+ "sourceMap": {
+ "line": 15,
+ "column": 19
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_SYMBOL_DUPLICATE",
+ "message": "Duplicate symbol v",
+ "sourceMap": {
+ "line": 4,
+ "column": 3
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_ARGUMENT_NOT_LVALUE",
+ "message": "out argument done must be a writable lvalue",
+ "sourceMap": {
+ "line": 15,
+ "column": 19
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_FUNC_SIDE_EFFECT",
+ "message": "Function bad_func cannot execute wait",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_CALL_TARGET_NOT_FOUND",
+ "message": "Unknown call target missing_proc",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_TARGET_NOT_FOUND",
+ "message": "Unknown target missing_target"
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628082622-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/compile.json",
+ "controllerJson": "W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/controller.json",
+ "motionQueueJson": "W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/motion-queue.json",
+ "traceJson": "W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/trace.json",
+ "ioJson": "W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/io.json",
+ "trajectoryJson": "W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/trajectory.json",
+ "postReportJson": "W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/post-report.json",
+ "roundtripJson": "W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/roundtrip.json",
+ "reportJson": "W2-JOB-20260628082622-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628082622-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+ }
+ },
+ {
+ "program_id": "W2_E30_MotionDiagnostics",
+ "file": "error/W2_E30_MotionDiagnostics.grl",
+ "coverage_level": "Static",
+ "expected_status": "diagnostic",
+ "status": "diagnostic",
+ "input_hash": "19f8c9f8a1ba6f6cfa8dde62207f8ee1797267e9addf7bbdbfbe941d8734b543",
+ "spec_sections": [
+ 8,
+ 9,
+ 10,
+ 11,
+ 22
+ ],
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "GRL_PATH_EMPTY",
+ "message": "Path empty_path must contain at least one point"
+ },
+ {
+ "severity": "error",
+ "code": "GRL_PATH_EMPTY",
+ "message": "Path empty_path must contain at least one point"
+ },
+ {
+ "severity": "error",
+ "code": "KDL_JOINT_LIMIT",
+ "message": "joint_1 exceeds fixture limit",
+ "segmentId": "main:MOVEJ",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ }
+ },
+ {
+ "severity": "error",
+ "code": "KDL_TARGET_UNREACHABLE",
+ "message": "Target main:MOVEL is outside ABB120 fixture workspace",
+ "segmentId": "main:MOVEL",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628082622-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/compile.json",
+ "controllerJson": "W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/controller.json",
+ "motionQueueJson": "W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/motion-queue.json",
+ "traceJson": "W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/trace.json",
+ "ioJson": "W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/io.json",
+ "trajectoryJson": "W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/trajectory.json",
+ "postReportJson": "W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/post-report.json",
+ "roundtripJson": "W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/roundtrip.json",
+ "reportJson": "W2-JOB-20260628082622-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628082622-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "file": "static/W2_E40_ControlFlowDiagnostics.grl",
+ "coverage_level": "Static",
+ "expected_status": "diagnostic",
+ "status": "diagnostic",
+ "input_hash": "3ba920eda8d0932b260b9875ce395803d55ebb6a48ecb3c8857b2a4ef1478fea",
+ "spec_sections": [
+ 14,
+ 22
+ ],
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_CONTINUE_OUTSIDE_LOOP",
+ "message": "continue is only valid inside loop",
+ "sourceMap": {
+ "line": 6,
+ "column": 5
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_SWITCH_CASE_DUPLICATE",
+ "message": "Duplicate switch case 1",
+ "sourceMap": {
+ "line": 14,
+ "column": 7
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_SWITCH_CASE_NOT_CONSTANT",
+ "message": "switch case must be a constant expression",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_LABEL_NOT_FOUND",
+ "message": "Unknown label missing",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ {
+ "severity": "error",
+ "code": "GRL_JUMP_INTO_BLOCK",
+ "message": "jump cannot enter a nested or sibling block"
+ },
+ {
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628082622-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/compile.json",
+ "controllerJson": "W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/controller.json",
+ "motionQueueJson": "W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json",
+ "traceJson": "W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/trace.json",
+ "ioJson": "W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/io.json",
+ "trajectoryJson": "W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/trajectory.json",
+ "postReportJson": "W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/post-report.json",
+ "roundtripJson": "W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json",
+ "reportJson": "W2-JOB-20260628082622-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628082622-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+ }
+ },
+ {
+ "program_id": "W2_E50_RuntimeTimeout",
+ "file": "error/W2_E50_RuntimeTimeout.grl",
+ "coverage_level": "Runtime",
+ "expected_status": "diagnostic",
+ "status": "diagnostic",
+ "input_hash": "2d5b41bef4b80c8a22f48697abe3b1a335779f439741f52376388091d8ea4fb6",
+ "spec_sections": [
+ 13,
+ 16
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628082622-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/compile.json",
+ "controllerJson": "W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/controller.json",
+ "motionQueueJson": "W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/motion-queue.json",
+ "traceJson": "W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/trace.json",
+ "ioJson": "W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/io.json",
+ "trajectoryJson": "W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/trajectory.json",
+ "postReportJson": "W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/post-report.json",
+ "roundtripJson": "W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/roundtrip.json",
+ "reportJson": "W2-JOB-20260628082622-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628082622-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2RuntimeTimeout",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 5,
+ "procedureCount": 2,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "controller": {
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "running",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:0": 0,
+ "$wait:main:1": 0.1
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "DI99 timeout",
+ "message": "DI99 timeout",
+ "severity": "warning",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "time": 0.1
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2RuntimeTimeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2RuntimeTimeout"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 4
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "timeout",
+ "elapsed": 0.1
+ },
+ "id": 5
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "DI99 timeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "DI99 timeout",
+ "severity": "warning"
+ },
+ "id": 6
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 8
+ }
+ ],
+ "currentSource": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "completed": false
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": false,
+ "io.di[6]": true,
+ "io.di[7]": false,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "scripts": []
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+ },
+ "motionQueue": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2RuntimeTimeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2RuntimeTimeout"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 4
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "timeout",
+ "elapsed": 0.1
+ },
+ "id": 5
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "DI99 timeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "DI99 timeout",
+ "severity": "warning"
+ },
+ "id": 6
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 8
+ }
+ ],
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": false,
+ "io.di[6]": true,
+ "io.di[7]": false,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "scripts": []
+ },
+ "trajectory": {
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "frames": [],
+ "diagnostics": []
+ },
+ "post": {
+ "filenames": [
+ "W2RuntimeTimeout.mod",
+ "W2RuntimeTimeout.ls",
+ "W2RuntimeTimeout.src"
+ ],
+ "report": []
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "file": "post/W2_P10_BrandHints.grl",
+ "coverage_level": "Post",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "0b0b7f523d6afa37eb7b33db69fc8dc8eef910799030e24a13b87344bb0a7f80",
+ "spec_sections": [
+ 18,
+ 20
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint fanuc ignored for abb",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint kuka ignored for abb",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint kuka ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint fanuc ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2BrandHints.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628082622-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/compile.json",
+ "controllerJson": "W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/controller.json",
+ "motionQueueJson": "W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/motion-queue.json",
+ "traceJson": "W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/trace.json",
+ "ioJson": "W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/io.json",
+ "trajectoryJson": "W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/trajectory.json",
+ "postReportJson": "W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/post-report.json",
+ "roundtripJson": "W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/roundtrip.json",
+ "reportJson": "W2-JOB-20260628082622-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628082622-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2BrandHints",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 1,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 7,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "post": {
+ "filenames": [
+ "W2BrandHints.mod",
+ "W2BrandHints.ls",
+ "W2BrandHints.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint fanuc ignored for abb",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint kuka ignored for abb",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint kuka ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for kuka",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint fanuc ignored for kuka",
+ "brand": "kuka"
+ }
+ ]
+ },
+ "roundtrip": {
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2BrandHints.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "file": "post/W2_P20_CrossBrandMotion.grl",
+ "coverage_level": "Post",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "25574be5f4073c18281213d73b72e386f93b1ec57fe21490a9097f8050ce68eb",
+ "spec_sections": [
+ 20
+ ],
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2CrossBrandMotion.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628082622-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/compile.json",
+ "controllerJson": "W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/controller.json",
+ "motionQueueJson": "W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/motion-queue.json",
+ "traceJson": "W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/trace.json",
+ "ioJson": "W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/io.json",
+ "trajectoryJson": "W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/trajectory.json",
+ "postReportJson": "W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/post-report.json",
+ "roundtripJson": "W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/roundtrip.json",
+ "reportJson": "W2-JOB-20260628082622-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628082622-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2CrossBrandMotion",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 6,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 10,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+ },
+ "post": {
+ "filenames": [
+ "W2CrossBrandMotion.mod",
+ "W2CrossBrandMotion.ls",
+ "W2CrossBrandMotion.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for kuka",
+ "brand": "kuka"
+ }
+ ]
+ },
+ "roundtrip": {
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2CrossBrandMotion.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "file": "post/W2_P30_Roundtrip.grl",
+ "coverage_level": "Post",
+ "expected_status": "pass",
+ "status": "pass",
+ "input_hash": "ffef36ecf9e77bceff45b3438905861f7007365b608525e14f18561e58d2e6cf",
+ "spec_sections": [
+ 19,
+ 20,
+ 21
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2Roundtrip.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ],
+ "artifacts": {
+ "jobJson": "W2-JOB-20260628082622-51484d62/job.json",
+ "compileJson": "W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/compile.json",
+ "controllerJson": "W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/controller.json",
+ "motionQueueJson": "W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/motion-queue.json",
+ "traceJson": "W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/trace.json",
+ "ioJson": "W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/io.json",
+ "trajectoryJson": "W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/trajectory.json",
+ "postReportJson": "W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/post-report.json",
+ "roundtripJson": "W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/roundtrip.json",
+ "reportJson": "W2-JOB-20260628082622-51484d62/report.json",
+ "reportHtml": "W2-JOB-20260628082622-51484d62/report.html"
+ },
+ "compile": {
+ "parsed": true,
+ "moduleName": "W2Roundtrip",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 1,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 1
+ },
+ "post": {
+ "filenames": [
+ "W2Roundtrip.mod",
+ "W2Roundtrip.ls",
+ "W2Roundtrip.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+ },
+ "roundtrip": {
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2Roundtrip.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+ }
+ }
+ ],
+ "artifacts": {
+ "root": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62",
+ "manifestJson": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/manifest.json",
+ "jobJson": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/job.json",
+ "reportJson": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/report.json",
+ "reportHtml": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/report.html",
+ "desktopScreenshot": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/screenshots/virtual-controller-desktop.png",
+ "mobileScreenshot": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/screenshots/virtual-controller-mobile.png",
+ "uiEvidenceJson": "kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/screenshots/evidence.json"
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/manifest.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/manifest.json
new file mode 100644
index 0000000..f6d8cfd
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/manifest.json
@@ -0,0 +1,451 @@
+{
+ "suite_id": "working2-abb120-spec",
+ "robot_id": "abb_irb120_3_58",
+ "spec_source": "work/doc/通用机器人编程语法规范.md",
+ "program_root": "kdl-wasm/web/tests/fixtures/abb120/spec-programs",
+ "runtime_commands": [
+ "loadProgram",
+ "start",
+ "stepInto",
+ "hold",
+ "resume",
+ "stepMotion",
+ "stop",
+ "resetFault"
+ ],
+ "programs": [
+ {
+ "program_id": "W2_00_MinimalModule",
+ "file": "runtime/W2_00_MinimalModule.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 4,
+ 5,
+ 6,
+ 9,
+ 10,
+ 23
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "file": "runtime/W2_10_DataTargetToolFrame.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 6,
+ 8,
+ 9
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_20_ExpressionMath",
+ "file": "runtime/W2_20_ExpressionMath.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 7,
+ 9,
+ 13
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "file": "runtime/W2_30_MotionAllTypes.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 8,
+ 9,
+ 10
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_40_PathEvents",
+ "file": "runtime/W2_40_PathEvents.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 11,
+ 13,
+ 19
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_50_OperationProcess",
+ "file": "runtime/W2_50_OperationProcess.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 12,
+ 13
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_60_IOWaitPulse",
+ "file": "runtime/W2_60_IOWaitPulse.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 13
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "file": "runtime/W2_70_ControlFlow.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 14
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "file": "runtime/W2_80_ProcFuncCall.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 15
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "file": "runtime/W2_90_ExceptionAlarm.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 16,
+ 17
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": [
+ "GRL_P1_UNIMPLEMENTED"
+ ]
+ },
+ {
+ "program_id": "W2_99_FullSpecExample",
+ "file": "runtime/W2_99_FullSpecExample.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 24
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "file": "static/W2_E10_ExpressionDiagnostics.grl",
+ "coverage_level": "Static",
+ "spec_sections": [
+ 7,
+ 22
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "GRL_EXPR_UNKNOWN_SYMBOL",
+ "GRL_EXPR_UNKNOWN_FUNCTION",
+ "GRL_EXPR_ARITY",
+ "GRL_EXPR_DOMAIN",
+ "GRL_EXPR_DIV_ZERO",
+ "GRL_EXPR_UNIT_MISMATCH"
+ ]
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "file": "static/W2_E20_SemanticDiagnostics.grl",
+ "coverage_level": "Static",
+ "spec_sections": [
+ 6,
+ 15,
+ 22
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "GRL_SYMBOL_DUPLICATE",
+ "GRL_ARGUMENT_NOT_LVALUE",
+ "GRL_CALL_TARGET_NOT_FOUND",
+ "GRL_FUNC_SIDE_EFFECT",
+ "GRL_TARGET_NOT_FOUND"
+ ]
+ },
+ {
+ "program_id": "W2_E30_MotionDiagnostics",
+ "file": "error/W2_E30_MotionDiagnostics.grl",
+ "coverage_level": "Static",
+ "spec_sections": [
+ 8,
+ 9,
+ 10,
+ 11,
+ 22
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "KDL_JOINT_LIMIT",
+ "KDL_TARGET_UNREACHABLE",
+ "GRL_PATH_EMPTY"
+ ]
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "file": "static/W2_E40_ControlFlowDiagnostics.grl",
+ "coverage_level": "Static",
+ "spec_sections": [
+ 14,
+ 22
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "GRL_BREAK_OUTSIDE_FLOW",
+ "GRL_CONTINUE_OUTSIDE_LOOP",
+ "GRL_JUMP_INTO_BLOCK",
+ "GRL_SWITCH_CASE_DUPLICATE",
+ "GRL_SWITCH_CASE_NOT_CONSTANT",
+ "GRL_LABEL_NOT_FOUND"
+ ]
+ },
+ {
+ "program_id": "W2_E50_RuntimeTimeout",
+ "file": "error/W2_E50_RuntimeTimeout.grl",
+ "coverage_level": "Runtime",
+ "spec_sections": [
+ 13,
+ 16
+ ],
+ "expected_status": "diagnostic",
+ "expected_diagnostics": [
+ "VC_WAIT_TIMEOUT"
+ ]
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "file": "post/W2_P10_BrandHints.grl",
+ "coverage_level": "Post",
+ "spec_sections": [
+ 18,
+ 20
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": [
+ "GRL_POST_HINT_IGNORED"
+ ]
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "file": "post/W2_P20_CrossBrandMotion.grl",
+ "coverage_level": "Post",
+ "spec_sections": [
+ 20
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "file": "post/W2_P30_Roundtrip.grl",
+ "coverage_level": "Post",
+ "spec_sections": [
+ 19,
+ 20,
+ 21
+ ],
+ "expected_status": "pass",
+ "expected_diagnostics": []
+ }
+ ],
+ "coverage_matrix": [
+ {
+ "spec_section": 4,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_00_MinimalModule"
+ ]
+ },
+ {
+ "spec_section": 5,
+ "coverage_level": "Runtime",
+ "program_ids": [
+ "W2_00_MinimalModule"
+ ]
+ },
+ {
+ "spec_section": 6,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_10_DataTargetToolFrame",
+ "W2_E20_SemanticDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 7,
+ "coverage_level": "Runtime/Static/Post",
+ "program_ids": [
+ "W2_20_ExpressionMath",
+ "W2_E10_ExpressionDiagnostics",
+ "W2_P20_CrossBrandMotion"
+ ]
+ },
+ {
+ "spec_section": 8,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_10_DataTargetToolFrame",
+ "W2_E30_MotionDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 9,
+ "coverage_level": "Runtime/Post",
+ "program_ids": [
+ "W2_20_ExpressionMath",
+ "W2_30_MotionAllTypes",
+ "W2_P20_CrossBrandMotion"
+ ]
+ },
+ {
+ "spec_section": 10,
+ "coverage_level": "Runtime/Static/Post",
+ "program_ids": [
+ "W2_30_MotionAllTypes",
+ "W2_E30_MotionDiagnostics",
+ "W2_P20_CrossBrandMotion"
+ ]
+ },
+ {
+ "spec_section": 11,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_40_PathEvents",
+ "W2_E30_MotionDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 12,
+ "coverage_level": "Runtime/Post",
+ "program_ids": [
+ "W2_50_OperationProcess",
+ "W2_P30_Roundtrip"
+ ]
+ },
+ {
+ "spec_section": 13,
+ "coverage_level": "Runtime",
+ "program_ids": [
+ "W2_60_IOWaitPulse",
+ "W2_E50_RuntimeTimeout"
+ ]
+ },
+ {
+ "spec_section": 14,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_70_ControlFlow",
+ "W2_E40_ControlFlowDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 15,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_80_ProcFuncCall",
+ "W2_E20_SemanticDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 16,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_90_ExceptionAlarm",
+ "W2_E50_RuntimeTimeout"
+ ]
+ },
+ {
+ "spec_section": 17,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_90_ExceptionAlarm"
+ ]
+ },
+ {
+ "spec_section": 18,
+ "coverage_level": "Post",
+ "program_ids": [
+ "W2_P10_BrandHints"
+ ]
+ },
+ {
+ "spec_section": 19,
+ "coverage_level": "Post",
+ "program_ids": [
+ "W2_P30_Roundtrip"
+ ]
+ },
+ {
+ "spec_section": 20,
+ "coverage_level": "Post",
+ "program_ids": [
+ "W2_P20_CrossBrandMotion"
+ ]
+ },
+ {
+ "spec_section": 21,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_00_MinimalModule",
+ "W2_E10_ExpressionDiagnostics"
+ ]
+ },
+ {
+ "spec_section": 22,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_E10_ExpressionDiagnostics",
+ "W2_E20_SemanticDiagnostics",
+ "W2_E30_MotionDiagnostics",
+ "W2_E40_ControlFlowDiagnostics",
+ "W2_E50_RuntimeTimeout"
+ ]
+ },
+ {
+ "spec_section": 23,
+ "coverage_level": "Runtime/Static",
+ "program_ids": [
+ "W2_00_MinimalModule"
+ ]
+ },
+ {
+ "spec_section": 24,
+ "coverage_level": "Runtime/Post",
+ "program_ids": [
+ "W2_99_FullSpecExample",
+ "W2_P30_Roundtrip"
+ ]
+ },
+ {
+ "spec_section": 25,
+ "coverage_level": "Runtime/Static/Post",
+ "program_ids": [
+ "W2_00_MinimalModule",
+ "W2_10_DataTargetToolFrame",
+ "W2_20_ExpressionMath",
+ "W2_30_MotionAllTypes",
+ "W2_40_PathEvents",
+ "W2_50_OperationProcess",
+ "W2_60_IOWaitPulse",
+ "W2_70_ControlFlow",
+ "W2_80_ProcFuncCall",
+ "W2_90_ExceptionAlarm",
+ "W2_P20_CrossBrandMotion"
+ ]
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/compile.json
new file mode 100644
index 0000000..b21d4dd
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2MinimalModule",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 1,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 4,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/controller.json
new file mode 100644
index 0000000..eb27052
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/controller.json
@@ -0,0 +1,455 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MinimalModule",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MinimalModule"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_00_MinimalModule-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/io.json
new file mode 100644
index 0000000..a9a6139
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_00_MinimalModule-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/motion-queue.json
new file mode 100644
index 0000000..4c4fa93
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/motion-queue.json
@@ -0,0 +1,82 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/post-report.json
new file mode 100644
index 0000000..2b435af
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2MinimalModule.mod",
+ "W2MinimalModule.ls",
+ "W2MinimalModule.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/trace.json
new file mode 100644
index 0000000..b260ea8
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/trace.json
@@ -0,0 +1,72 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MinimalModule",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MinimalModule"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:7:5",
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/trajectory.json
new file mode 100644
index 0000000..f483f30
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/trajectory.json
@@ -0,0 +1,151 @@
+{
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "frames": [
+ {
+ "index": 0,
+ "time": 0,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 1,
+ "time": 0.08,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 2,
+ "time": 0.16,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 3,
+ "time": 0.24,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 7,
+ "column": 5
+ },
+ "diagnostics": []
+ }
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/compile.json
new file mode 100644
index 0000000..a66b72a
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2DataTargetToolFrame",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 19,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/controller.json
new file mode 100644
index 0000000..4677666
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/controller.json
@@ -0,0 +1,872 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2DataTargetToolFrame",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2DataTargetToolFrame"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_10_DataTargetToolFrame-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/io.json
new file mode 100644
index 0000000..4c885c5
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_10_DataTargetToolFrame-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/motion-queue.json
new file mode 100644
index 0000000..ffd4169
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/motion-queue.json
@@ -0,0 +1,416 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.4000000033993267,
+ 0.5000000042491584,
+ 0,
+ 0.20000000169966334,
+ 0
+ ],
+ "id": "approach"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.4
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.03,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick_q"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.12
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.005
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.1
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/post-report.json
new file mode 100644
index 0000000..62c1345
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2DataTargetToolFrame.mod",
+ "W2DataTargetToolFrame.ls",
+ "W2DataTargetToolFrame.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/trace.json
new file mode 100644
index 0000000..eddbe65
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/trace.json
@@ -0,0 +1,155 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2DataTargetToolFrame",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2DataTargetToolFrame"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:41:5",
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:42:5",
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:43:5",
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/trajectory.json
new file mode 100644
index 0000000..33d5fba
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/trajectory.json
@@ -0,0 +1,407 @@
+{
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.5,
+ 0.03,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "frames": [
+ {
+ "index": 0,
+ "time": 0,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 1,
+ "time": 0.08,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 2,
+ "time": 0.16,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 3,
+ "time": 0.24,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 4,
+ "time": 0.24,
+ "motion": "MOVEJ",
+ "segmentId": "motion_2",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 5,
+ "time": 0.32,
+ "motion": "MOVEJ",
+ "segmentId": "motion_2",
+ "joints": [
+ 0,
+ -0.133333,
+ 0.166667,
+ 0,
+ 0.066667,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 6,
+ "time": 0.4,
+ "motion": "MOVEJ",
+ "segmentId": "motion_2",
+ "joints": [
+ 0,
+ -0.266667,
+ 0.333333,
+ 0,
+ 0.133333,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 7,
+ "time": 0.48,
+ "motion": "MOVEJ",
+ "segmentId": "motion_2",
+ "joints": [
+ 0,
+ -0.4,
+ 0.5,
+ 0,
+ 0.2,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 42,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 8,
+ "time": 0.48,
+ "motion": "MOVEL",
+ "segmentId": "motion_3",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 9,
+ "time": 0.56,
+ "motion": "MOVEL",
+ "segmentId": "motion_3",
+ "joints": [
+ 0.166667,
+ 0.01,
+ -0.166667,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 10,
+ "time": 0.64,
+ "motion": "MOVEL",
+ "segmentId": "motion_3",
+ "joints": [
+ 0.333333,
+ 0.02,
+ -0.333333,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 11,
+ "time": 0.72,
+ "motion": "MOVEL",
+ "segmentId": "motion_3",
+ "joints": [
+ 0.5,
+ 0.03,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 43,
+ "column": 5
+ },
+ "diagnostics": []
+ }
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/compile.json
new file mode 100644
index 0000000..2f9bd02
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2ExpressionMath",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 2,
+ "kdlPathRequests": 0,
+ "symbolCount": 9,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/controller.json
new file mode 100644
index 0000000..237450e
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/controller.json
@@ -0,0 +1,631 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:2": 0
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExpressionMath",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExpressionMath"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_20_ExpressionMath-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/io.json
new file mode 100644
index 0000000..f239c92
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_20_ExpressionMath-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/motion-queue.json
new file mode 100644
index 0000000..cb5539e
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/motion-queue.json
@@ -0,0 +1,172 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0.2617993877991494,
+ -0.5235987755982988,
+ 0,
+ 0.2617993877991494,
+ 0.05235987755982989
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.45,
+ 0.04,
+ 0.3
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0.3826834323650897,
+ 0.9238795325112867
+ ]
+ },
+ "id": "pick"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15000000000000002
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/post-report.json
new file mode 100644
index 0000000..b9a1299
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2ExpressionMath.mod",
+ "W2ExpressionMath.ls",
+ "W2ExpressionMath.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/trace.json
new file mode 100644
index 0000000..d834175
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/trace.json
@@ -0,0 +1,156 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExpressionMath",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExpressionMath"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/trajectory.json
new file mode 100644
index 0000000..40790b7
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/trajectory.json
@@ -0,0 +1,279 @@
+{
+ "sampleCount": 8,
+ "duration": 0.48,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.45,
+ 0.04,
+ -0.2,
+ 0,
+ 0,
+ 0
+ ],
+ "frames": [
+ {
+ "index": 0,
+ "time": 0,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 1,
+ "time": 0.08,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0.087266,
+ -0.174533,
+ 0,
+ 0.087266,
+ 0.017453
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 2,
+ "time": 0.16,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0.174533,
+ -0.349066,
+ 0,
+ 0.174533,
+ 0.034907
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 3,
+ "time": 0.24,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0.261799,
+ -0.523599,
+ 0,
+ 0.261799,
+ 0.05236
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 4,
+ "time": 0.24,
+ "motion": "MOVEL",
+ "segmentId": "motion_2",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 5,
+ "time": 0.32,
+ "motion": "MOVEL",
+ "segmentId": "motion_2",
+ "joints": [
+ 0.15,
+ 0.013333,
+ -0.066667,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 6,
+ "time": 0.4,
+ "motion": "MOVEL",
+ "segmentId": "motion_2",
+ "joints": [
+ 0.3,
+ 0.026667,
+ -0.133333,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 7,
+ "time": 0.48,
+ "motion": "MOVEL",
+ "segmentId": "motion_2",
+ "joints": [
+ 0.45,
+ 0.04,
+ -0.2,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "diagnostics": []
+ }
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/compile.json
new file mode 100644
index 0000000..0a93c5d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2MotionAllTypes",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 3,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 10,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/controller.json
new file mode 100644
index 0000000..3123338
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/controller.json
@@ -0,0 +1,936 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MotionAllTypes",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MotionAllTypes"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_30_MotionAllTypes-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/io.json
new file mode 100644
index 0000000..498441f
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_30_MotionAllTypes-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/motion-queue.json
new file mode 100644
index 0000000..b627627
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/motion-queue.json
@@ -0,0 +1,480 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.45
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_2",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "start"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.15
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEC",
+ "target": {
+ "pose": {
+ "position": [
+ 0.6,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "finish"
+ },
+ "via": {
+ "pose": {
+ "position": [
+ 0.55,
+ 0.05,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "mid"
+ },
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.1
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.08
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/post-report.json
new file mode 100644
index 0000000..3634288
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2MotionAllTypes.mod",
+ "W2MotionAllTypes.ls",
+ "W2MotionAllTypes.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/trace.json
new file mode 100644
index 0000000..5fac72a
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/trace.json
@@ -0,0 +1,155 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2MotionAllTypes",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2MotionAllTypes"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEL",
+ "source": {
+ "kind": "MOVEL",
+ "id": "main:MOVEL:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEC",
+ "source": {
+ "kind": "MOVEC",
+ "id": "main:MOVEC:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/trajectory.json
new file mode 100644
index 0000000..fb9ecb0
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/trajectory.json
@@ -0,0 +1,407 @@
+{
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0.6,
+ 0,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "frames": [
+ {
+ "index": 0,
+ "time": 0,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 1,
+ "time": 0.08,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 2,
+ "time": 0.16,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 3,
+ "time": 0.24,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 4,
+ "time": 0.24,
+ "motion": "MOVEL",
+ "segmentId": "motion_2",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 5,
+ "time": 0.32,
+ "motion": "MOVEL",
+ "segmentId": "motion_2",
+ "joints": [
+ 0.166667,
+ 0,
+ -0.166667,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 6,
+ "time": 0.4,
+ "motion": "MOVEL",
+ "segmentId": "motion_2",
+ "joints": [
+ 0.333333,
+ 0,
+ -0.333333,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 7,
+ "time": 0.48,
+ "motion": "MOVEL",
+ "segmentId": "motion_2",
+ "joints": [
+ 0.5,
+ 0,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 8,
+ "time": 0.48,
+ "motion": "MOVEC",
+ "segmentId": "motion_3",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 9,
+ "time": 0.56,
+ "motion": "MOVEC",
+ "segmentId": "motion_3",
+ "joints": [
+ 0.2,
+ 0,
+ -0.166667,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 10,
+ "time": 0.64,
+ "motion": "MOVEC",
+ "segmentId": "motion_3",
+ "joints": [
+ 0.4,
+ 0,
+ -0.333333,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 11,
+ "time": 0.72,
+ "motion": "MOVEC",
+ "segmentId": "motion_3",
+ "joints": [
+ 0.6,
+ 0,
+ -0.5,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "diagnostics": []
+ }
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/compile.json
new file mode 100644
index 0000000..5e98362
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2PathEvents",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 7,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/controller.json
new file mode 100644
index 0000000..f80f32e
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/controller.json
@@ -0,0 +1,1106 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2PathEvents",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2PathEvents"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "generated_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "generated_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "generated_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p_home",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_pick",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0.20000000169966334,
+ -0.3500000029744108,
+ 0.4500000038242425,
+ 0.10000000084983167,
+ -0.20000000169966334,
+ 0.300000002549495
+ ],
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_place",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.1500000012747475,
+ -0.4000000033993267
+ ],
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "before",
+ "pointId": "p_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 17,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 10 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 703,
+ "line": 17,
+ "column": 25
+ },
+ "end": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ },
+ "end": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ },
+ "end": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ },
+ "end": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ },
+ "end": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ },
+ "end": {
+ "offset": 712,
+ "line": 17,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 713,
+ "line": 17,
+ "column": 35
+ },
+ "end": {
+ "offset": 714,
+ "line": 17,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 715,
+ "line": 17,
+ "column": 37
+ },
+ "end": {
+ "offset": 719,
+ "line": 17,
+ "column": 41
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "p_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 19,
+ "column": 24
+ },
+ "data": {
+ "statement": "wait io . di [ 10 ] == true timeout 2 s on_timeout alarm \"pick sensor timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 780,
+ "line": 19,
+ "column": 24
+ },
+ "end": {
+ "offset": 784,
+ "line": 19,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 785,
+ "line": 19,
+ "column": 29
+ },
+ "end": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ },
+ "end": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ },
+ "end": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ },
+ "end": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ },
+ "end": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ },
+ "end": {
+ "offset": 794,
+ "line": 19,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 795,
+ "line": 19,
+ "column": 39
+ },
+ "end": {
+ "offset": 797,
+ "line": 19,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 798,
+ "line": 19,
+ "column": 42
+ },
+ "end": {
+ "offset": 802,
+ "line": 19,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 803,
+ "line": 19,
+ "column": 47
+ },
+ "end": {
+ "offset": 810,
+ "line": 19,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 811,
+ "line": 19,
+ "column": 55
+ },
+ "end": {
+ "offset": 814,
+ "line": 19,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 815,
+ "line": 19,
+ "column": 59
+ },
+ "end": {
+ "offset": 825,
+ "line": 19,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 826,
+ "line": 19,
+ "column": 70
+ },
+ "end": {
+ "offset": 831,
+ "line": 19,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"pick sensor timeout\"",
+ "value": "pick sensor timeout",
+ "range": {
+ "start": {
+ "offset": 832,
+ "line": 19,
+ "column": 76
+ },
+ "end": {
+ "offset": 853,
+ "line": 19,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_2",
+ "timing": "at",
+ "pointId": "p_place",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 21,
+ "column": 37
+ },
+ "data": {
+ "statement": "pulse io . do [ 11 ] duration 100 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 929,
+ "line": 21,
+ "column": 37
+ },
+ "end": {
+ "offset": 934,
+ "line": 21,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 935,
+ "line": 21,
+ "column": 43
+ },
+ "end": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ },
+ "end": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ },
+ "end": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ },
+ "end": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "11",
+ "value": 11,
+ "range": {
+ "start": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ },
+ "end": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ },
+ "end": {
+ "offset": 944,
+ "line": 21,
+ "column": 52
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 945,
+ "line": 21,
+ "column": 53
+ },
+ "end": {
+ "offset": 953,
+ "line": 21,
+ "column": 61
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "100 ms",
+ "value": 100,
+ "range": {
+ "start": {
+ "offset": 954,
+ "line": 21,
+ "column": 62
+ },
+ "end": {
+ "offset": 960,
+ "line": 21,
+ "column": 68
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.1
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_40_PathEvents-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "generated_path"
+ ],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/io.json
new file mode 100644
index 0000000..2d8957a
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_40_PathEvents-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/motion-queue.json
new file mode 100644
index 0000000..7fbb840
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/motion-queue.json
@@ -0,0 +1,731 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "generated_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "generated_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "generated_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p_home",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_pick",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0.20000000169966334,
+ -0.3500000029744108,
+ 0.4500000038242425,
+ 0.10000000084983167,
+ -0.20000000169966334,
+ 0.300000002549495
+ ],
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ {
+ "id": "p_place",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.1500000012747475,
+ -0.4000000033993267
+ ],
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "before",
+ "pointId": "p_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 17,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 10 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 703,
+ "line": 17,
+ "column": 25
+ },
+ "end": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 705,
+ "line": 17,
+ "column": 27
+ },
+ "end": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 706,
+ "line": 17,
+ "column": 28
+ },
+ "end": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 708,
+ "line": 17,
+ "column": 30
+ },
+ "end": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 709,
+ "line": 17,
+ "column": 31
+ },
+ "end": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 711,
+ "line": 17,
+ "column": 33
+ },
+ "end": {
+ "offset": 712,
+ "line": 17,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 713,
+ "line": 17,
+ "column": 35
+ },
+ "end": {
+ "offset": 714,
+ "line": 17,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 715,
+ "line": 17,
+ "column": 37
+ },
+ "end": {
+ "offset": 719,
+ "line": 17,
+ "column": 41
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "p_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 19,
+ "column": 24
+ },
+ "data": {
+ "statement": "wait io . di [ 10 ] == true timeout 2 s on_timeout alarm \"pick sensor timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 780,
+ "line": 19,
+ "column": 24
+ },
+ "end": {
+ "offset": 784,
+ "line": 19,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 785,
+ "line": 19,
+ "column": 29
+ },
+ "end": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 787,
+ "line": 19,
+ "column": 31
+ },
+ "end": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 788,
+ "line": 19,
+ "column": 32
+ },
+ "end": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 790,
+ "line": 19,
+ "column": 34
+ },
+ "end": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "10",
+ "value": 10,
+ "range": {
+ "start": {
+ "offset": 791,
+ "line": 19,
+ "column": 35
+ },
+ "end": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 793,
+ "line": 19,
+ "column": 37
+ },
+ "end": {
+ "offset": 794,
+ "line": 19,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 795,
+ "line": 19,
+ "column": 39
+ },
+ "end": {
+ "offset": 797,
+ "line": 19,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 798,
+ "line": 19,
+ "column": 42
+ },
+ "end": {
+ "offset": 802,
+ "line": 19,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 803,
+ "line": 19,
+ "column": 47
+ },
+ "end": {
+ "offset": 810,
+ "line": 19,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 811,
+ "line": 19,
+ "column": 55
+ },
+ "end": {
+ "offset": 814,
+ "line": 19,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 815,
+ "line": 19,
+ "column": 59
+ },
+ "end": {
+ "offset": 825,
+ "line": 19,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 826,
+ "line": 19,
+ "column": 70
+ },
+ "end": {
+ "offset": 831,
+ "line": 19,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"pick sensor timeout\"",
+ "value": "pick sensor timeout",
+ "range": {
+ "start": {
+ "offset": 832,
+ "line": 19,
+ "column": 76
+ },
+ "end": {
+ "offset": 853,
+ "line": 19,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_2",
+ "timing": "at",
+ "pointId": "p_place",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 21,
+ "column": 37
+ },
+ "data": {
+ "statement": "pulse io . do [ 11 ] duration 100 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 929,
+ "line": 21,
+ "column": 37
+ },
+ "end": {
+ "offset": 934,
+ "line": 21,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 935,
+ "line": 21,
+ "column": 43
+ },
+ "end": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 937,
+ "line": 21,
+ "column": 45
+ },
+ "end": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 938,
+ "line": 21,
+ "column": 46
+ },
+ "end": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 940,
+ "line": 21,
+ "column": 48
+ },
+ "end": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "11",
+ "value": 11,
+ "range": {
+ "start": {
+ "offset": 941,
+ "line": 21,
+ "column": 49
+ },
+ "end": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 943,
+ "line": 21,
+ "column": 51
+ },
+ "end": {
+ "offset": 944,
+ "line": 21,
+ "column": 52
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 945,
+ "line": 21,
+ "column": 53
+ },
+ "end": {
+ "offset": 953,
+ "line": 21,
+ "column": 61
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "100 ms",
+ "value": 100,
+ "range": {
+ "start": {
+ "offset": 954,
+ "line": 21,
+ "column": 62
+ },
+ "end": {
+ "offset": 960,
+ "line": 21,
+ "column": 68
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.1
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "cad_curve",
+ "id": "edge_032",
+ "sample_distance": 0.005
+ }
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/post-report.json
new file mode 100644
index 0000000..1799726
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/post-report.json
@@ -0,0 +1,27 @@
+{
+ "filenames": [
+ "W2PathEvents.mod",
+ "W2PathEvents.ls",
+ "W2PathEvents.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/trace.json
new file mode 100644
index 0000000..74a552c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/trace.json
@@ -0,0 +1,72 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2PathEvents",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2PathEvents"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/trajectory.json
new file mode 100644
index 0000000..2675ba8
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/trajectory.json
@@ -0,0 +1,419 @@
+{
+ "sampleCount": 12,
+ "duration": 0.72,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ -0.3500000029744108,
+ -0.2500000021245792,
+ 0.3500000029744108,
+ -0.2500000021245792,
+ 0.15000000127474747,
+ -0.4000000033993266
+ ],
+ "frames": [
+ {
+ "index": 0,
+ "time": 0,
+ "motion": "MOVEJ",
+ "segmentId": "p_home",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 1,
+ "time": 0.08,
+ "motion": "MOVEJ",
+ "segmentId": "p_home",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 2,
+ "time": 0.16,
+ "motion": "MOVEJ",
+ "segmentId": "p_home",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 3,
+ "time": 0.24,
+ "motion": "MOVEJ",
+ "segmentId": "p_home",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 16,
+ "column": 18
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 4,
+ "time": 0,
+ "motion": "MOVEJ",
+ "segmentId": "p_pick",
+ "targetId": "pick",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 5,
+ "time": 0.08,
+ "motion": "MOVEJ",
+ "segmentId": "p_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.066667,
+ -0.116667,
+ 0.15,
+ 0.033333,
+ -0.066667,
+ 0.1
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 6,
+ "time": 0.16,
+ "motion": "MOVEJ",
+ "segmentId": "p_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.133333,
+ -0.233333,
+ 0.3,
+ 0.066667,
+ -0.133333,
+ 0.2
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 7,
+ "time": 0.24,
+ "motion": "MOVEJ",
+ "segmentId": "p_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.2,
+ -0.35,
+ 0.45,
+ 0.1,
+ -0.2,
+ 0.3
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 18,
+ "column": 18
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 8,
+ "time": 0,
+ "motion": "MOVEJ",
+ "segmentId": "p_place",
+ "targetId": "place",
+ "joints": [
+ 0.2,
+ -0.35,
+ 0.45,
+ 0.1,
+ -0.2,
+ 0.3
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 9,
+ "time": 0.08,
+ "motion": "MOVEJ",
+ "segmentId": "p_place",
+ "targetId": "place",
+ "joints": [
+ 0.016667,
+ -0.316667,
+ 0.416667,
+ -0.016667,
+ -0.083333,
+ 0.066667
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 10,
+ "time": 0.16,
+ "motion": "MOVEJ",
+ "segmentId": "p_place",
+ "targetId": "place",
+ "joints": [
+ -0.166667,
+ -0.283333,
+ 0.383333,
+ -0.133333,
+ 0.033333,
+ -0.166667
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 11,
+ "time": 0.24,
+ "motion": "MOVEJ",
+ "segmentId": "p_place",
+ "targetId": "place",
+ "joints": [
+ -0.35,
+ -0.25,
+ 0.35,
+ -0.25,
+ 0.15,
+ -0.4
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 20,
+ "column": 19
+ },
+ "diagnostics": []
+ }
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/compile.json
new file mode 100644
index 0000000..4ad1d93
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2OperationProcess",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 6,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/controller.json
new file mode 100644
index 0000000..6520e77
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/controller.json
@@ -0,0 +1,500 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2OperationProcess",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2OperationProcess"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "start_action",
+ "statement": "io . do [ 1 ] = true",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "op_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "op_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "op_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "end_action",
+ "statement": "io . do [ 1 ] = false",
+ "sourceMap": {
+ "line": 21,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_50_OperationProcess-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "op_path"
+ ],
+ "operationIds": [
+ "pick_op"
+ ],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/io.json
new file mode 100644
index 0000000..67ae792
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_50_OperationProcess-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/motion-queue.json
new file mode 100644
index 0000000..6b8ce58
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/motion-queue.json
@@ -0,0 +1,123 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "start_action",
+ "statement": "io . do [ 1 ] = true",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "op_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "op_path",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "op_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "action",
+ "status": "done",
+ "source": {
+ "kind": "action",
+ "operationId": "pick_op",
+ "actionKind": "end_action",
+ "statement": "io . do [ 1 ] = false",
+ "sourceMap": {
+ "line": 21,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": []
+ }
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/post-report.json
new file mode 100644
index 0000000..b22568b
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/post-report.json
@@ -0,0 +1,27 @@
+{
+ "filenames": [
+ "W2OperationProcess.mod",
+ "W2OperationProcess.ls",
+ "W2OperationProcess.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/trace.json
new file mode 100644
index 0000000..e16ed9a
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/trace.json
@@ -0,0 +1,72 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2OperationProcess",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2OperationProcess"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/trajectory.json
new file mode 100644
index 0000000..7f629e0
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/trajectory.json
@@ -0,0 +1,155 @@
+{
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "frames": [
+ {
+ "index": 0,
+ "time": 0,
+ "motion": "MOVEJ",
+ "segmentId": "p0",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 1,
+ "time": 0.08,
+ "motion": "MOVEJ",
+ "segmentId": "p0",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 2,
+ "time": 0.16,
+ "motion": "MOVEJ",
+ "segmentId": "p0",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 3,
+ "time": 0.24,
+ "motion": "MOVEJ",
+ "segmentId": "p0",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ },
+ "diagnostics": []
+ }
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/compile.json
new file mode 100644
index 0000000..a051026
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2IOWaitPulse",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 12,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 1,
+ "symbolCount": 5,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/controller.json
new file mode 100644
index 0000000..63159c3
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/controller.json
@@ -0,0 +1,1139 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 10,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 10
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:3": 0,
+ "$wait:main:4": 0,
+ "$wait:main:5": 0.1,
+ "$wait:main:6": 0.1,
+ "$wait:main:7": 0.1
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2IOWaitPulse",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2IOWaitPulse"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 11
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 12
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 13
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 14
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 15
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 16
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 17
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 18
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 19
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ]
+ },
+ "id": 20
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 21
+ },
+ {
+ "time": 0.1,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 22
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 10,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 23
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "io_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "io_path",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "io_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "at",
+ "pointId": "p0",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 9,
+ "column": 35
+ },
+ "data": {
+ "statement": "pulse io . do [ 20 ] duration 50 + 50 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 286,
+ "line": 9,
+ "column": 35
+ },
+ "end": {
+ "offset": 291,
+ "line": 9,
+ "column": 40
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 292,
+ "line": 9,
+ "column": 41
+ },
+ "end": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ },
+ "end": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ },
+ "end": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ },
+ "end": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "20",
+ "value": 20,
+ "range": {
+ "start": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ },
+ "end": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ },
+ "end": {
+ "offset": 301,
+ "line": 9,
+ "column": 50
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 302,
+ "line": 9,
+ "column": 51
+ },
+ "end": {
+ "offset": 310,
+ "line": 9,
+ "column": 59
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 311,
+ "line": 9,
+ "column": 60
+ },
+ "end": {
+ "offset": 313,
+ "line": 9,
+ "column": 62
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "+",
+ "value": "+",
+ "range": {
+ "start": {
+ "offset": 314,
+ "line": 9,
+ "column": 63
+ },
+ "end": {
+ "offset": 315,
+ "line": 9,
+ "column": 64
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50 ms",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 316,
+ "line": 9,
+ "column": 65
+ },
+ "end": {
+ "offset": 321,
+ "line": 9,
+ "column": 70
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.05
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75,
+ "io.do[1]": true,
+ "io.ao[1]": 0.75,
+ "io.go[1]": 3,
+ "io.do[2]": true
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ },
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ },
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ },
+ {
+ "id": 13,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 14,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 15,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_60_IOWaitPulse-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "io_path"
+ ],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/io.json
new file mode 100644
index 0000000..20e3541
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/io.json
@@ -0,0 +1,253 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75,
+ "io.do[1]": true,
+ "io.ao[1]": 0.75,
+ "io.go[1]": 3,
+ "io.do[2]": true
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ },
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ },
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ },
+ {
+ "id": 13,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 14,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 15,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_60_IOWaitPulse-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/motion-queue.json
new file mode 100644
index 0000000..f9168f2
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/motion-queue.json
@@ -0,0 +1,279 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "io_path",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "io_path",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "io_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "p0",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.35000000000000003
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "at",
+ "pointId": "p0",
+ "distance": 0.01,
+ "kind": "pulse",
+ "sourceMap": {
+ "line": 9,
+ "column": 35
+ },
+ "data": {
+ "statement": "pulse io . do [ 20 ] duration 50 + 50 ms",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "pulse",
+ "value": "pulse",
+ "range": {
+ "start": {
+ "offset": 286,
+ "line": 9,
+ "column": 35
+ },
+ "end": {
+ "offset": 291,
+ "line": 9,
+ "column": 40
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 292,
+ "line": 9,
+ "column": 41
+ },
+ "end": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 294,
+ "line": 9,
+ "column": 43
+ },
+ "end": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 295,
+ "line": 9,
+ "column": 44
+ },
+ "end": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 297,
+ "line": 9,
+ "column": 46
+ },
+ "end": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "20",
+ "value": 20,
+ "range": {
+ "start": {
+ "offset": 298,
+ "line": 9,
+ "column": 47
+ },
+ "end": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 300,
+ "line": 9,
+ "column": 49
+ },
+ "end": {
+ "offset": 301,
+ "line": 9,
+ "column": 50
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "duration",
+ "value": "duration",
+ "range": {
+ "start": {
+ "offset": 302,
+ "line": 9,
+ "column": 51
+ },
+ "end": {
+ "offset": 310,
+ "line": 9,
+ "column": 59
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 311,
+ "line": 9,
+ "column": 60
+ },
+ "end": {
+ "offset": 313,
+ "line": 9,
+ "column": 62
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "+",
+ "value": "+",
+ "range": {
+ "start": {
+ "offset": 314,
+ "line": 9,
+ "column": 63
+ },
+ "end": {
+ "offset": 315,
+ "line": 9,
+ "column": 64
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "50 ms",
+ "value": 50,
+ "range": {
+ "start": {
+ "offset": 316,
+ "line": 9,
+ "column": 65
+ },
+ "end": {
+ "offset": 321,
+ "line": 9,
+ "column": 70
+ }
+ },
+ "unit": {
+ "raw": "ms",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 0.05
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/post-report.json
new file mode 100644
index 0000000..ae4ab05
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/post-report.json
@@ -0,0 +1,27 @@
+{
+ "filenames": [
+ "W2IOWaitPulse.mod",
+ "W2IOWaitPulse.ls",
+ "W2IOWaitPulse.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_PATH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/trace.json
new file mode 100644
index 0000000..41e0322
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/trace.json
@@ -0,0 +1,493 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2IOWaitPulse",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2IOWaitPulse"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 10,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 1,
+ "raw": "io.do[1]"
+ },
+ "value": true,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:12:5",
+ "sourceMap": {
+ "line": 12,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 11,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "ao",
+ "index": 1,
+ "raw": "io.ao[1]"
+ },
+ "value": 0.75,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 12,
+ "time": 0,
+ "writer": "program",
+ "target": {
+ "domain": "go",
+ "index": 1,
+ "raw": "io.go[1]"
+ },
+ "value": 3,
+ "kind": "write"
+ }
+ ]
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "IO_WRITE",
+ "source": {
+ "kind": "IO_WRITE",
+ "id": "main:IO_WRITE:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:15:5",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 11
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:16:5",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 12
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 13
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 14
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 15
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 16
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 17
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "satisfied",
+ "elapsed": 0
+ },
+ "id": 18
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:19:5",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 19
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "result": [
+ {
+ "id": 16,
+ "time": 0.1,
+ "writer": "program",
+ "target": {
+ "domain": "do",
+ "index": 2,
+ "raw": "io.do[2]"
+ },
+ "value": true,
+ "kind": "pulse_set"
+ }
+ ]
+ },
+ "id": 20
+ },
+ {
+ "time": 0.1,
+ "kind": "io",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "PULSE",
+ "source": {
+ "kind": "PULSE",
+ "id": "main:PULSE:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 21
+ },
+ {
+ "time": 0.1,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 9,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 22
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 10,
+ "instructionKind": "RUN_PATH",
+ "source": {
+ "kind": "RUN_PATH",
+ "id": "main:RUN_PATH:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 23
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/trajectory.json
new file mode 100644
index 0000000..7f629e0
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/trajectory.json
@@ -0,0 +1,155 @@
+{
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "frames": [
+ {
+ "index": 0,
+ "time": 0,
+ "motion": "MOVEJ",
+ "segmentId": "p0",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 1,
+ "time": 0.08,
+ "motion": "MOVEJ",
+ "segmentId": "p0",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 2,
+ "time": 0.16,
+ "motion": "MOVEJ",
+ "segmentId": "p0",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 3,
+ "time": 0.24,
+ "motion": "MOVEJ",
+ "segmentId": "p0",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 8,
+ "column": 14
+ },
+ "diagnostics": []
+ }
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/compile.json
new file mode 100644
index 0000000..28b7c9c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2ControlFlow",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 14,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/controller.json
new file mode 100644
index 0000000..5c3d7e6
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/controller.json
@@ -0,0 +1,610 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 8,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 8
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ },
+ {
+ "id": "else:0",
+ "variables": {
+ "i": 1
+ }
+ },
+ {
+ "id": "for:3",
+ "variables": {}
+ },
+ {
+ "id": "switch:5",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "NOT_READY",
+ "message": "not ready",
+ "severity": "error",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "time": 0
+ },
+ {
+ "id": "MODE1",
+ "message": "mode 1",
+ "severity": "error",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "time": 0.1
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ControlFlow",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ControlFlow"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 1,
+ "message": "not ready",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "NOT_READY",
+ "severity": "error"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "EXEC_WHILE",
+ "source": {
+ "kind": "EXEC_WHILE",
+ "id": "main:EXEC_WHILE:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "EXEC_FOR",
+ "source": {
+ "kind": "EXEC_FOR",
+ "id": "main:EXEC_FOR:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:23:7",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "EXEC_SWITCH",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "BREAK",
+ "source": {
+ "kind": "BREAK",
+ "id": "main:BREAK:28:9",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "info",
+ "code": "VC_BREAK",
+ "message": "BREAK reached",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ "id": 11
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 7,
+ "message": "mode 1",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "MODE1",
+ "severity": "error"
+ },
+ "id": 12
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "id": 13
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_70_ControlFlow-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/io.json
new file mode 100644
index 0000000..67c50b6
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_70_ControlFlow-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/motion-queue.json
new file mode 100644
index 0000000..57085bb
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/motion-queue.json
@@ -0,0 +1,5 @@
+{
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/post-report.json
new file mode 100644
index 0000000..4e58295
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/post-report.json
@@ -0,0 +1,153 @@
+{
+ "filenames": [
+ "W2ControlFlow.mod",
+ "W2ControlFlow.ls",
+ "W2ControlFlow.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_WHILE is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_FOR is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_SWITCH is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "BREAK is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/trace.json
new file mode 100644
index 0000000..f70bed5
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/trace.json
@@ -0,0 +1,253 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ControlFlow",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ControlFlow"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 1,
+ "message": "not ready",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "NOT_READY",
+ "severity": "error"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:16:7",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "EXEC_WHILE",
+ "source": {
+ "kind": "EXEC_WHILE",
+ "id": "main:EXEC_WHILE:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "EXEC_FOR",
+ "source": {
+ "kind": "EXEC_FOR",
+ "id": "main:EXEC_FOR:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:23:7",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 6,
+ "instructionKind": "EXEC_SWITCH",
+ "source": {
+ "kind": "EXEC_SWITCH",
+ "id": "main:EXEC_SWITCH:25:5",
+ "sourceMap": {
+ "line": 25,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 7,
+ "instructionKind": "BREAK",
+ "source": {
+ "kind": "BREAK",
+ "id": "main:BREAK:28:9",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "info",
+ "code": "VC_BREAK",
+ "message": "BREAK reached",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ "id": 11
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 7,
+ "message": "mode 1",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "MODE1",
+ "severity": "error"
+ },
+ "id": 12
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 8,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:27:9",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ },
+ "procedureId": "main"
+ },
+ "id": 13
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/trajectory.json
new file mode 100644
index 0000000..4315263
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/trajectory.json
@@ -0,0 +1,22 @@
+{
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "frames": [],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/compile.json
new file mode 100644
index 0000000..e582d30
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2ProcFuncCall",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 9,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 8,
+ "procedureCount": 3,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/controller.json
new file mode 100644
index 0000000..3db47f6
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/controller.json
@@ -0,0 +1,523 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 5,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 5
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ProcFuncCall",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ProcFuncCall"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call read_part",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "read_part:RAW_STATEMENT:8:5",
+ "sourceMap": {
+ "line": 8,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 3,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "CALL",
+ "id": "main:CALL:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call increment_retry",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 8
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "increment_retry:RAW_STATEMENT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RETURN",
+ "source": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 11
+ }
+ ],
+ "currentSource": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "completed": true
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_80_ProcFuncCall-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/io.json
new file mode 100644
index 0000000..222cd29
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_80_ProcFuncCall-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/motion-queue.json
new file mode 100644
index 0000000..57085bb
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/motion-queue.json
@@ -0,0 +1,5 @@
+{
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/post-report.json
new file mode 100644
index 0000000..44ff58d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/post-report.json
@@ -0,0 +1,117 @@
+{
+ "filenames": [
+ "W2ProcFuncCall.mod",
+ "W2ProcFuncCall.ls",
+ "W2ProcFuncCall.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "CALL is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "EXEC_IF is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RETURN is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/trace.json
new file mode 100644
index 0000000..fd70e4b
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/trace.json
@@ -0,0 +1,202 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ProcFuncCall",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ProcFuncCall"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:17:5",
+ "sourceMap": {
+ "line": 17,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:18:5",
+ "sourceMap": {
+ "line": 18,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call read_part",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "read_part",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "read_part:RAW_STATEMENT:8:5",
+ "sourceMap": {
+ "line": 8,
+ "column": 5
+ },
+ "procedureId": "read_part"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 3,
+ "message": "Execution exceeded 3 steps",
+ "source": {
+ "kind": "CALL",
+ "id": "main:CALL:20:5",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 0,
+ "instructionKind": "CALL",
+ "message": "Call increment_retry",
+ "source": {
+ "kind": "CALL",
+ "sourceMap": {
+ "line": 20,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 8
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "increment_retry",
+ "pc": 1,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "increment_retry:RAW_STATEMENT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "increment_retry"
+ },
+ "id": 9
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "EXEC_IF",
+ "source": {
+ "kind": "EXEC_IF",
+ "id": "main:EXEC_IF:21:5",
+ "sourceMap": {
+ "line": 21,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 10
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "RETURN",
+ "source": {
+ "kind": "RETURN",
+ "id": "main:RETURN:24:5",
+ "sourceMap": {
+ "line": 24,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 11
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/trajectory.json
new file mode 100644
index 0000000..4315263
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/trajectory.json
@@ -0,0 +1,22 @@
+{
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "frames": [],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/compile.json
new file mode 100644
index 0000000..c8515aa
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2ExceptionAlarm",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 5,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 6,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/controller.json
new file mode 100644
index 0000000..64d6d9b
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/controller.json
@@ -0,0 +1,606 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 5,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 5
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "START",
+ "message": "start",
+ "severity": "info",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "time": 0
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExceptionAlarm",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExceptionAlarm"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "start",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "START",
+ "severity": "info"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "enable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ }
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:23:5",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "disable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ }
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 10
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_90_ExceptionAlarm-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/io.json
new file mode 100644
index 0000000..f36d75c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_90_ExceptionAlarm-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/motion-queue.json
new file mode 100644
index 0000000..f6cb95e
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/motion-queue.json
@@ -0,0 +1,82 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_1",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.3
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/post-report.json
new file mode 100644
index 0000000..6c7c328
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/post-report.json
@@ -0,0 +1,81 @@
+{
+ "filenames": [
+ "W2ExceptionAlarm.mod",
+ "W2ExceptionAlarm.ls",
+ "W2ExceptionAlarm.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "ALARM is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RAW_STATEMENT is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "UNSUPPORTED_RUNTIME is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/trace.json
new file mode 100644
index 0000000..a2c2108
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/trace.json
@@ -0,0 +1,201 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2ExceptionAlarm",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2ExceptionAlarm"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "start",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "START",
+ "severity": "info"
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "ALARM",
+ "source": {
+ "kind": "ALARM",
+ "id": "main:ALARM:13:5",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RAW_STATEMENT",
+ "source": {
+ "kind": "RAW_STATEMENT",
+ "id": "main:RAW_STATEMENT:14:5",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:15:7",
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 4,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:22:5",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "enable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 22,
+ "column": 5
+ }
+ },
+ "id": 8
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "instructionKind": "UNSUPPORTED_RUNTIME",
+ "source": {
+ "kind": "UNSUPPORTED_RUNTIME",
+ "id": "main:UNSUPPORTED_RUNTIME:23:5",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "warning",
+ "code": "VC_UNSUPPORTED_RUNTIME",
+ "message": "disable interrupt is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 23,
+ "column": 5
+ }
+ },
+ "id": 9
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 5,
+ "message": "Execution exceeded 3 steps",
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 3 steps"
+ },
+ "id": 10
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/trajectory.json
new file mode 100644
index 0000000..5bcd27e
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/trajectory.json
@@ -0,0 +1,151 @@
+{
+ "sampleCount": 4,
+ "duration": 0.24,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "frames": [
+ {
+ "index": 0,
+ "time": 0,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 1,
+ "time": 0.08,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 2,
+ "time": 0.16,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 3,
+ "time": 0.24,
+ "motion": "MOVEJ",
+ "segmentId": "motion_1",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 15,
+ "column": 7
+ },
+ "diagnostics": []
+ }
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/compile.json
new file mode 100644
index 0000000..ea23e7d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2FullSpecExample",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 14,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 2,
+ "symbolCount": 13,
+ "procedureCount": 1,
+ "pathCount": 2,
+ "operationCount": 2
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/controller.json
new file mode 100644
index 0000000..d938f8e
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/controller.json
@@ -0,0 +1,1983 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": [
+ {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ }
+ ]
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "executed",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "stopped",
+ "result": "completed",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "paused",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 3,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 3
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {}
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2FullSpecExample",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2FullSpecExample"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:78:5",
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:78:5",
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+ ],
+ "completed": true
+ },
+ "motion": {
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "pick_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "pick_path",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "pick_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "approach",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 39,
+ "column": 20
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "above_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.4
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 40,
+ "column": 22
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "at_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.3
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.3297802811774664e-17,
+ 4.3297802811774664e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 19
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "leave_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.4
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 44,
+ "column": 22
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "after",
+ "pointId": "at_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 42,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 1 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1160,
+ "line": 42,
+ "column": 25
+ },
+ "end": {
+ "offset": 1162,
+ "line": 42,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1162,
+ "line": 42,
+ "column": 27
+ },
+ "end": {
+ "offset": 1163,
+ "line": 42,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 1163,
+ "line": 42,
+ "column": 28
+ },
+ "end": {
+ "offset": 1165,
+ "line": 42,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1165,
+ "line": 42,
+ "column": 30
+ },
+ "end": {
+ "offset": 1166,
+ "line": 42,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1166,
+ "line": 42,
+ "column": 31
+ },
+ "end": {
+ "offset": 1167,
+ "line": 42,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1167,
+ "line": 42,
+ "column": 32
+ },
+ "end": {
+ "offset": 1168,
+ "line": 42,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 1169,
+ "line": 42,
+ "column": 34
+ },
+ "end": {
+ "offset": 1170,
+ "line": 42,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1171,
+ "line": 42,
+ "column": 36
+ },
+ "end": {
+ "offset": 1175,
+ "line": 42,
+ "column": 40
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "at_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 43,
+ "column": 25
+ },
+ "data": {
+ "statement": "wait io . di [ 1 ] == true timeout 2 s on_timeout alarm \"Clamp close timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 1200,
+ "line": 43,
+ "column": 25
+ },
+ "end": {
+ "offset": 1204,
+ "line": 43,
+ "column": 29
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1205,
+ "line": 43,
+ "column": 30
+ },
+ "end": {
+ "offset": 1207,
+ "line": 43,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1207,
+ "line": 43,
+ "column": 32
+ },
+ "end": {
+ "offset": 1208,
+ "line": 43,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 1208,
+ "line": 43,
+ "column": 33
+ },
+ "end": {
+ "offset": 1210,
+ "line": 43,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1210,
+ "line": 43,
+ "column": 35
+ },
+ "end": {
+ "offset": 1211,
+ "line": 43,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1211,
+ "line": 43,
+ "column": 36
+ },
+ "end": {
+ "offset": 1212,
+ "line": 43,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1212,
+ "line": 43,
+ "column": 37
+ },
+ "end": {
+ "offset": 1213,
+ "line": 43,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 1214,
+ "line": 43,
+ "column": 39
+ },
+ "end": {
+ "offset": 1216,
+ "line": 43,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1217,
+ "line": 43,
+ "column": 42
+ },
+ "end": {
+ "offset": 1221,
+ "line": 43,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 1222,
+ "line": 43,
+ "column": 47
+ },
+ "end": {
+ "offset": 1229,
+ "line": 43,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1230,
+ "line": 43,
+ "column": 55
+ },
+ "end": {
+ "offset": 1233,
+ "line": 43,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 1234,
+ "line": 43,
+ "column": 59
+ },
+ "end": {
+ "offset": 1244,
+ "line": 43,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 1245,
+ "line": 43,
+ "column": 70
+ },
+ "end": {
+ "offset": 1250,
+ "line": 43,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"Clamp close timeout\"",
+ "value": "Clamp close timeout",
+ "range": {
+ "start": {
+ "offset": 1251,
+ "line": 43,
+ "column": 76
+ },
+ "end": {
+ "offset": 1272,
+ "line": 43,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "place_path",
+ "operationId": "place_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "place_path",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "place_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "above_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.42000000000000004
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 53,
+ "column": 23
+ }
+ },
+ {
+ "id": "at_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.32
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.3297802811774664e-17,
+ 4.3297802811774664e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 54,
+ "column": 20
+ }
+ },
+ {
+ "id": "leave_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.42000000000000004
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 57,
+ "column": 23
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "after",
+ "pointId": "at_place",
+ "kind": "io",
+ "sourceMap": {
+ "line": 55,
+ "column": 26
+ },
+ "data": {
+ "statement": "io . do [ 1 ] = false",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1565,
+ "line": 55,
+ "column": 26
+ },
+ "end": {
+ "offset": 1567,
+ "line": 55,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1567,
+ "line": 55,
+ "column": 28
+ },
+ "end": {
+ "offset": 1568,
+ "line": 55,
+ "column": 29
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 1568,
+ "line": 55,
+ "column": 29
+ },
+ "end": {
+ "offset": 1570,
+ "line": 55,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1570,
+ "line": 55,
+ "column": 31
+ },
+ "end": {
+ "offset": 1571,
+ "line": 55,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1571,
+ "line": 55,
+ "column": 32
+ },
+ "end": {
+ "offset": 1572,
+ "line": 55,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1572,
+ "line": 55,
+ "column": 33
+ },
+ "end": {
+ "offset": 1573,
+ "line": 55,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 1574,
+ "line": 55,
+ "column": 35
+ },
+ "end": {
+ "offset": 1575,
+ "line": 55,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "false",
+ "value": "false",
+ "range": {
+ "start": {
+ "offset": 1576,
+ "line": 55,
+ "column": 37
+ },
+ "end": {
+ "offset": 1581,
+ "line": 55,
+ "column": 42
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "at_place",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 56,
+ "column": 26
+ },
+ "data": {
+ "statement": "wait io . di [ 2 ] == true timeout 2 s on_timeout alarm \"Clamp open timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 1607,
+ "line": 56,
+ "column": 26
+ },
+ "end": {
+ "offset": 1611,
+ "line": 56,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1612,
+ "line": 56,
+ "column": 31
+ },
+ "end": {
+ "offset": 1614,
+ "line": 56,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1614,
+ "line": 56,
+ "column": 33
+ },
+ "end": {
+ "offset": 1615,
+ "line": 56,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 1615,
+ "line": 56,
+ "column": 34
+ },
+ "end": {
+ "offset": 1617,
+ "line": 56,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1617,
+ "line": 56,
+ "column": 36
+ },
+ "end": {
+ "offset": 1618,
+ "line": 56,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1618,
+ "line": 56,
+ "column": 37
+ },
+ "end": {
+ "offset": 1619,
+ "line": 56,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1619,
+ "line": 56,
+ "column": 38
+ },
+ "end": {
+ "offset": 1620,
+ "line": 56,
+ "column": 39
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 1621,
+ "line": 56,
+ "column": 40
+ },
+ "end": {
+ "offset": 1623,
+ "line": 56,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1624,
+ "line": 56,
+ "column": 43
+ },
+ "end": {
+ "offset": 1628,
+ "line": 56,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 1629,
+ "line": 56,
+ "column": 48
+ },
+ "end": {
+ "offset": 1636,
+ "line": 56,
+ "column": 55
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1637,
+ "line": 56,
+ "column": 56
+ },
+ "end": {
+ "offset": 1640,
+ "line": 56,
+ "column": 59
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 1641,
+ "line": 56,
+ "column": 60
+ },
+ "end": {
+ "offset": 1651,
+ "line": 56,
+ "column": 70
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 1652,
+ "line": 56,
+ "column": 71
+ },
+ "end": {
+ "offset": 1657,
+ "line": 56,
+ "column": 76
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"Clamp open timeout\"",
+ "value": "Clamp open timeout",
+ "range": {
+ "start": {
+ "offset": 1658,
+ "line": 56,
+ "column": 77
+ },
+ "end": {
+ "offset": 1678,
+ "line": 56,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_99_FullSpecExample-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+ },
+ "bridge": {
+ "pathIds": [
+ "pick_path",
+ "place_path"
+ ],
+ "operationIds": [
+ "pick_op",
+ "place_op"
+ ],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/io.json
new file mode 100644
index 0000000..8b73019
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/io.json
@@ -0,0 +1,201 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": true,
+ "io.di[6]": false,
+ "io.di[7]": true,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ },
+ {
+ "id": 10,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 11,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "previous": true,
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 12,
+ "time": 0.1,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "previous": false,
+ "value": true,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [],
+ "scripts": [
+ {
+ "name": "W2_99_FullSpecExample-edge-script",
+ "nextIndex": 3,
+ "elapsed": 0.1,
+ "steps": [
+ {
+ "delay": 0.02,
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": true
+ },
+ {
+ "delay": 0.04,
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": false
+ },
+ {
+ "delay": 0.06,
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": true
+ }
+ ],
+ "done": true
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/motion-queue.json
new file mode 100644
index 0000000..338f793
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/motion-queue.json
@@ -0,0 +1,1521 @@
+{
+ "items": [
+ {
+ "id": "mq_1",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "pick_path",
+ "operationId": "pick_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "pick_path",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "pick_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "approach",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "targetId": "home",
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 39,
+ "column": 20
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "above_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.4
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 40,
+ "column": 22
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "at_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.3
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.3297802811774664e-17,
+ 4.3297802811774664e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 19
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ {
+ "id": "leave_pick",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.5,
+ 0.12,
+ 0.4
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "pick"
+ },
+ "targetId": "pick",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 44,
+ "column": 22
+ },
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "after",
+ "pointId": "at_pick",
+ "kind": "io",
+ "sourceMap": {
+ "line": 42,
+ "column": 25
+ },
+ "data": {
+ "statement": "io . do [ 1 ] = true",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1160,
+ "line": 42,
+ "column": 25
+ },
+ "end": {
+ "offset": 1162,
+ "line": 42,
+ "column": 27
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1162,
+ "line": 42,
+ "column": 27
+ },
+ "end": {
+ "offset": 1163,
+ "line": 42,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 1163,
+ "line": 42,
+ "column": 28
+ },
+ "end": {
+ "offset": 1165,
+ "line": 42,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1165,
+ "line": 42,
+ "column": 30
+ },
+ "end": {
+ "offset": 1166,
+ "line": 42,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1166,
+ "line": 42,
+ "column": 31
+ },
+ "end": {
+ "offset": 1167,
+ "line": 42,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1167,
+ "line": 42,
+ "column": 32
+ },
+ "end": {
+ "offset": 1168,
+ "line": 42,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 1169,
+ "line": 42,
+ "column": 34
+ },
+ "end": {
+ "offset": 1170,
+ "line": 42,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1171,
+ "line": 42,
+ "column": 36
+ },
+ "end": {
+ "offset": 1175,
+ "line": 42,
+ "column": 40
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "at_pick",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 43,
+ "column": 25
+ },
+ "data": {
+ "statement": "wait io . di [ 1 ] == true timeout 2 s on_timeout alarm \"Clamp close timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 1200,
+ "line": 43,
+ "column": 25
+ },
+ "end": {
+ "offset": 1204,
+ "line": 43,
+ "column": 29
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1205,
+ "line": 43,
+ "column": 30
+ },
+ "end": {
+ "offset": 1207,
+ "line": 43,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1207,
+ "line": 43,
+ "column": 32
+ },
+ "end": {
+ "offset": 1208,
+ "line": 43,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 1208,
+ "line": 43,
+ "column": 33
+ },
+ "end": {
+ "offset": 1210,
+ "line": 43,
+ "column": 35
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1210,
+ "line": 43,
+ "column": 35
+ },
+ "end": {
+ "offset": 1211,
+ "line": 43,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1211,
+ "line": 43,
+ "column": 36
+ },
+ "end": {
+ "offset": 1212,
+ "line": 43,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1212,
+ "line": 43,
+ "column": 37
+ },
+ "end": {
+ "offset": 1213,
+ "line": 43,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 1214,
+ "line": 43,
+ "column": 39
+ },
+ "end": {
+ "offset": 1216,
+ "line": 43,
+ "column": 41
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1217,
+ "line": 43,
+ "column": 42
+ },
+ "end": {
+ "offset": 1221,
+ "line": 43,
+ "column": 46
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 1222,
+ "line": 43,
+ "column": 47
+ },
+ "end": {
+ "offset": 1229,
+ "line": 43,
+ "column": 54
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1230,
+ "line": 43,
+ "column": 55
+ },
+ "end": {
+ "offset": 1233,
+ "line": 43,
+ "column": 58
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 1234,
+ "line": 43,
+ "column": 59
+ },
+ "end": {
+ "offset": 1244,
+ "line": 43,
+ "column": 69
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 1245,
+ "line": 43,
+ "column": 70
+ },
+ "end": {
+ "offset": 1250,
+ "line": 43,
+ "column": 75
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"Clamp close timeout\"",
+ "value": "Clamp close timeout",
+ "range": {
+ "start": {
+ "offset": 1251,
+ "line": 43,
+ "column": 76
+ },
+ "end": {
+ "offset": 1272,
+ "line": 43,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02,
+ "source": {
+ "type": "generated_example",
+ "id": "pick_path"
+ }
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_2",
+ "kind": "path",
+ "source": {
+ "kind": "path",
+ "pathId": "place_path",
+ "operationId": "place_op",
+ "instruction": {
+ "kind": "RUN_PATH",
+ "pathId": "place_path",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ }
+ },
+ "request": {
+ "pathId": "place_path",
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "segments": [
+ {
+ "id": "above_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.42000000000000004
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 53,
+ "column": 23
+ }
+ },
+ {
+ "id": "at_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.32
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.3297802811774664e-17,
+ 4.3297802811774664e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 54,
+ "column": 20
+ }
+ },
+ {
+ "id": "leave_place",
+ "motion": "MOVEL",
+ "target": {
+ "pose": {
+ "position": [
+ 0.65,
+ -0.1,
+ 0.42000000000000004
+ ],
+ "quaternion": [
+ 0.7071067811865476,
+ 0.7071067811865475,
+ 4.329780281177465e-17,
+ 4.329780281177465e-17
+ ]
+ },
+ "config": {
+ "shoulder": 0,
+ "elbow": 0,
+ "wrist": 1
+ },
+ "tool": {
+ "id": "gripper"
+ },
+ "frame": {
+ "id": "fixture"
+ },
+ "id": "place"
+ },
+ "targetId": "place",
+ "speed": {
+ "kind": "linear",
+ "velocity": 0.18
+ },
+ "zone": {
+ "kind": "distance",
+ "value": 0.01
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 57,
+ "column": 23
+ }
+ }
+ ],
+ "events": [
+ {
+ "id": "event_0",
+ "timing": "after",
+ "pointId": "at_place",
+ "kind": "io",
+ "sourceMap": {
+ "line": 55,
+ "column": 26
+ },
+ "data": {
+ "statement": "io . do [ 1 ] = false",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1565,
+ "line": 55,
+ "column": 26
+ },
+ "end": {
+ "offset": 1567,
+ "line": 55,
+ "column": 28
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1567,
+ "line": 55,
+ "column": 28
+ },
+ "end": {
+ "offset": 1568,
+ "line": 55,
+ "column": 29
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "do",
+ "value": "do",
+ "range": {
+ "start": {
+ "offset": 1568,
+ "line": 55,
+ "column": 29
+ },
+ "end": {
+ "offset": 1570,
+ "line": 55,
+ "column": 31
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1570,
+ "line": 55,
+ "column": 31
+ },
+ "end": {
+ "offset": 1571,
+ "line": 55,
+ "column": 32
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "1",
+ "value": 1,
+ "range": {
+ "start": {
+ "offset": 1571,
+ "line": 55,
+ "column": 32
+ },
+ "end": {
+ "offset": 1572,
+ "line": 55,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1572,
+ "line": 55,
+ "column": 33
+ },
+ "end": {
+ "offset": 1573,
+ "line": 55,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "=",
+ "value": "=",
+ "range": {
+ "start": {
+ "offset": 1574,
+ "line": 55,
+ "column": 35
+ },
+ "end": {
+ "offset": 1575,
+ "line": 55,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "false",
+ "value": "false",
+ "range": {
+ "start": {
+ "offset": 1576,
+ "line": 55,
+ "column": 37
+ },
+ "end": {
+ "offset": 1581,
+ "line": 55,
+ "column": 42
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "id": "event_1",
+ "timing": "after",
+ "pointId": "at_place",
+ "kind": "wait",
+ "sourceMap": {
+ "line": 56,
+ "column": 26
+ },
+ "data": {
+ "statement": "wait io . di [ 2 ] == true timeout 2 s on_timeout alarm \"Clamp open timeout\"",
+ "tokens": [
+ {
+ "kind": "keyword",
+ "raw": "wait",
+ "value": "wait",
+ "range": {
+ "start": {
+ "offset": 1607,
+ "line": 56,
+ "column": 26
+ },
+ "end": {
+ "offset": 1611,
+ "line": 56,
+ "column": 30
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "io",
+ "value": "io",
+ "range": {
+ "start": {
+ "offset": 1612,
+ "line": 56,
+ "column": 31
+ },
+ "end": {
+ "offset": 1614,
+ "line": 56,
+ "column": 33
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": ".",
+ "value": ".",
+ "range": {
+ "start": {
+ "offset": 1614,
+ "line": 56,
+ "column": 33
+ },
+ "end": {
+ "offset": 1615,
+ "line": 56,
+ "column": 34
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "di",
+ "value": "di",
+ "range": {
+ "start": {
+ "offset": 1615,
+ "line": 56,
+ "column": 34
+ },
+ "end": {
+ "offset": 1617,
+ "line": 56,
+ "column": 36
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "[",
+ "value": "[",
+ "range": {
+ "start": {
+ "offset": 1617,
+ "line": 56,
+ "column": 36
+ },
+ "end": {
+ "offset": 1618,
+ "line": 56,
+ "column": 37
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1618,
+ "line": 56,
+ "column": 37
+ },
+ "end": {
+ "offset": 1619,
+ "line": 56,
+ "column": 38
+ }
+ }
+ },
+ {
+ "kind": "punctuation",
+ "raw": "]",
+ "value": "]",
+ "range": {
+ "start": {
+ "offset": 1619,
+ "line": 56,
+ "column": 38
+ },
+ "end": {
+ "offset": 1620,
+ "line": 56,
+ "column": 39
+ }
+ }
+ },
+ {
+ "kind": "operator",
+ "raw": "==",
+ "value": "==",
+ "range": {
+ "start": {
+ "offset": 1621,
+ "line": 56,
+ "column": 40
+ },
+ "end": {
+ "offset": 1623,
+ "line": 56,
+ "column": 42
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "true",
+ "value": "true",
+ "range": {
+ "start": {
+ "offset": 1624,
+ "line": 56,
+ "column": 43
+ },
+ "end": {
+ "offset": 1628,
+ "line": 56,
+ "column": 47
+ }
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "timeout",
+ "value": "timeout",
+ "range": {
+ "start": {
+ "offset": 1629,
+ "line": 56,
+ "column": 48
+ },
+ "end": {
+ "offset": 1636,
+ "line": 56,
+ "column": 55
+ }
+ }
+ },
+ {
+ "kind": "number",
+ "raw": "2 s",
+ "value": 2,
+ "range": {
+ "start": {
+ "offset": 1637,
+ "line": 56,
+ "column": 56
+ },
+ "end": {
+ "offset": 1640,
+ "line": 56,
+ "column": 59
+ }
+ },
+ "unit": {
+ "raw": "s",
+ "kind": "time",
+ "siUnit": "s",
+ "normalizedValue": 2
+ }
+ },
+ {
+ "kind": "identifier",
+ "raw": "on_timeout",
+ "value": "on_timeout",
+ "range": {
+ "start": {
+ "offset": 1641,
+ "line": 56,
+ "column": 60
+ },
+ "end": {
+ "offset": 1651,
+ "line": 56,
+ "column": 70
+ }
+ }
+ },
+ {
+ "kind": "keyword",
+ "raw": "alarm",
+ "value": "alarm",
+ "range": {
+ "start": {
+ "offset": 1652,
+ "line": 56,
+ "column": 71
+ },
+ "end": {
+ "offset": 1657,
+ "line": 56,
+ "column": 76
+ }
+ }
+ },
+ {
+ "kind": "string",
+ "raw": "\"Clamp open timeout\"",
+ "value": "Clamp open timeout",
+ "range": {
+ "start": {
+ "offset": 1658,
+ "line": 56,
+ "column": 77
+ },
+ "end": {
+ "offset": 1678,
+ "line": 56,
+ "column": 97
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "sampleTime": 0.02
+ },
+ "status": "queued"
+ },
+ {
+ "id": "mq_3",
+ "kind": "motion",
+ "source": {
+ "kind": "instruction",
+ "instruction": {
+ "kind": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ },
+ "request": {
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "sampleTime": 0.02,
+ "segments": [
+ {
+ "id": "motion_3",
+ "motion": "MOVEJ",
+ "target": {
+ "joints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "id": "home"
+ },
+ "speed": {
+ "kind": "joint_percent",
+ "value": 0.55
+ },
+ "zone": {
+ "kind": "fine"
+ },
+ "tool": {
+ "position": [
+ 0,
+ 0,
+ 0.12
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "frame": {
+ "position": [
+ 0.8,
+ 0,
+ 0.2
+ ],
+ "quaternion": [
+ 0,
+ 0,
+ 0,
+ 1
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ }
+ }
+ ]
+ },
+ "status": "queued"
+ }
+ ],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/post-report.json
new file mode 100644
index 0000000..0db5c5f
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/post-report.json
@@ -0,0 +1,45 @@
+{
+ "filenames": [
+ "W2FullSpecExample.mod",
+ "W2FullSpecExample.ls",
+ "W2FullSpecExample.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/trace.json
new file mode 100644
index 0000000..1fca576
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/trace.json
@@ -0,0 +1,155 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2FullSpecExample",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2FullSpecExample"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:76:5",
+ "sourceMap": {
+ "line": 76,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "diagnostic",
+ "procedure": "main",
+ "pc": 1,
+ "message": "Execution exceeded 1 steps",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "diagnostic": {
+ "severity": "error",
+ "code": "VC_STEP_LIMIT_EXCEEDED",
+ "message": "Execution exceeded 1 steps"
+ },
+ "id": 4
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 5
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "RUN_OPERATION",
+ "source": {
+ "kind": "RUN_OPERATION",
+ "id": "main:RUN_OPERATION:77:5",
+ "sourceMap": {
+ "line": 77,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 6
+ },
+ {
+ "time": 0,
+ "kind": "motion",
+ "procedure": "main",
+ "pc": 2,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:78:5",
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "queued": true
+ },
+ "id": 7
+ },
+ {
+ "time": 0,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 3,
+ "instructionKind": "MOVEJ",
+ "source": {
+ "kind": "MOVEJ",
+ "id": "main:MOVEJ:78:5",
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 8
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/trajectory.json
new file mode 100644
index 0000000..d822aaf
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/trajectory.json
@@ -0,0 +1,1075 @@
+{
+ "sampleCount": 32,
+ "duration": 1.92,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ -0.3490658503988659,
+ 0.6981317007977318,
+ 0,
+ 0.5235987755982988,
+ 0
+ ],
+ "frames": [
+ {
+ "index": 0,
+ "time": 0,
+ "motion": "MOVEJ",
+ "segmentId": "approach",
+ "targetId": "home",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 39,
+ "column": 20
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 1,
+ "time": 0.08,
+ "motion": "MOVEJ",
+ "segmentId": "approach",
+ "targetId": "home",
+ "joints": [
+ 0,
+ -0.116355,
+ 0.232711,
+ 0,
+ 0.174533,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 39,
+ "column": 20
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 2,
+ "time": 0.16,
+ "motion": "MOVEJ",
+ "segmentId": "approach",
+ "targetId": "home",
+ "joints": [
+ 0,
+ -0.232711,
+ 0.465421,
+ 0,
+ 0.349066,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 39,
+ "column": 20
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 3,
+ "time": 0.24,
+ "motion": "MOVEJ",
+ "segmentId": "approach",
+ "targetId": "home",
+ "joints": [
+ 0,
+ -0.349066,
+ 0.698132,
+ 0,
+ 0.523599,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 39,
+ "column": 20
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 4,
+ "time": 0,
+ "motion": "MOVEL",
+ "segmentId": "above_pick",
+ "targetId": "pick",
+ "joints": [
+ 0,
+ -0.349066,
+ 0.698132,
+ 0,
+ 0.523599,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 40,
+ "column": 22
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 5,
+ "time": 0.08,
+ "motion": "MOVEL",
+ "segmentId": "above_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.166667,
+ -0.192711,
+ 0.432088,
+ 0,
+ 0.349066,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 40,
+ "column": 22
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 6,
+ "time": 0.16,
+ "motion": "MOVEL",
+ "segmentId": "above_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.333333,
+ -0.036355,
+ 0.166044,
+ 0,
+ 0.174533,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 40,
+ "column": 22
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 7,
+ "time": 0.24,
+ "motion": "MOVEL",
+ "segmentId": "above_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.5,
+ 0.12,
+ -0.1,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 40,
+ "column": 22
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 8,
+ "time": 0,
+ "motion": "MOVEL",
+ "segmentId": "at_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.5,
+ 0.12,
+ -0.1,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 19
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 9,
+ "time": 0.08,
+ "motion": "MOVEL",
+ "segmentId": "at_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.5,
+ 0.12,
+ -0.133333,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 19
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 10,
+ "time": 0.16,
+ "motion": "MOVEL",
+ "segmentId": "at_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.5,
+ 0.12,
+ -0.166667,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 19
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 11,
+ "time": 0.24,
+ "motion": "MOVEL",
+ "segmentId": "at_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.5,
+ 0.12,
+ -0.2,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 41,
+ "column": 19
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 12,
+ "time": 0,
+ "motion": "MOVEL",
+ "segmentId": "leave_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.5,
+ 0.12,
+ -0.2,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 44,
+ "column": 22
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 13,
+ "time": 0.08,
+ "motion": "MOVEL",
+ "segmentId": "leave_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.5,
+ 0.12,
+ -0.166667,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 44,
+ "column": 22
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 14,
+ "time": 0.16,
+ "motion": "MOVEL",
+ "segmentId": "leave_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.5,
+ 0.12,
+ -0.133333,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 44,
+ "column": 22
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 15,
+ "time": 0.24,
+ "motion": "MOVEL",
+ "segmentId": "leave_pick",
+ "targetId": "pick",
+ "joints": [
+ 0.5,
+ 0.12,
+ -0.1,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 44,
+ "column": 22
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 16,
+ "time": 0.96,
+ "motion": "MOVEL",
+ "segmentId": "above_place",
+ "targetId": "place",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 53,
+ "column": 23
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 17,
+ "time": 1.04,
+ "motion": "MOVEL",
+ "segmentId": "above_place",
+ "targetId": "place",
+ "joints": [
+ 0.216667,
+ -0.033333,
+ -0.026667,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 53,
+ "column": 23
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 18,
+ "time": 1.12,
+ "motion": "MOVEL",
+ "segmentId": "above_place",
+ "targetId": "place",
+ "joints": [
+ 0.433333,
+ -0.066667,
+ -0.053333,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 53,
+ "column": 23
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 19,
+ "time": 1.2,
+ "motion": "MOVEL",
+ "segmentId": "above_place",
+ "targetId": "place",
+ "joints": [
+ 0.65,
+ -0.1,
+ -0.08,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 53,
+ "column": 23
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 20,
+ "time": 0.96,
+ "motion": "MOVEL",
+ "segmentId": "at_place",
+ "targetId": "place",
+ "joints": [
+ 0.65,
+ -0.1,
+ -0.08,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 54,
+ "column": 20
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 21,
+ "time": 1.04,
+ "motion": "MOVEL",
+ "segmentId": "at_place",
+ "targetId": "place",
+ "joints": [
+ 0.65,
+ -0.1,
+ -0.113333,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 54,
+ "column": 20
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 22,
+ "time": 1.12,
+ "motion": "MOVEL",
+ "segmentId": "at_place",
+ "targetId": "place",
+ "joints": [
+ 0.65,
+ -0.1,
+ -0.146667,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 54,
+ "column": 20
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 23,
+ "time": 1.2,
+ "motion": "MOVEL",
+ "segmentId": "at_place",
+ "targetId": "place",
+ "joints": [
+ 0.65,
+ -0.1,
+ -0.18,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 54,
+ "column": 20
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 24,
+ "time": 0.96,
+ "motion": "MOVEL",
+ "segmentId": "leave_place",
+ "targetId": "place",
+ "joints": [
+ 0.65,
+ -0.1,
+ -0.18,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 57,
+ "column": 23
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 25,
+ "time": 1.04,
+ "motion": "MOVEL",
+ "segmentId": "leave_place",
+ "targetId": "place",
+ "joints": [
+ 0.65,
+ -0.1,
+ -0.146667,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 57,
+ "column": 23
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 26,
+ "time": 1.12,
+ "motion": "MOVEL",
+ "segmentId": "leave_place",
+ "targetId": "place",
+ "joints": [
+ 0.65,
+ -0.1,
+ -0.113333,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 57,
+ "column": 23
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 27,
+ "time": 1.2,
+ "motion": "MOVEL",
+ "segmentId": "leave_place",
+ "targetId": "place",
+ "joints": [
+ 0.65,
+ -0.1,
+ -0.08,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 57,
+ "column": 23
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 28,
+ "time": 1.68,
+ "motion": "MOVEJ",
+ "segmentId": "motion_3",
+ "joints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.374,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 29,
+ "time": 1.76,
+ "motion": "MOVEJ",
+ "segmentId": "motion_3",
+ "joints": [
+ 0,
+ -0.116355,
+ 0.232711,
+ 0,
+ 0.174533,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.377333,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 30,
+ "time": 1.84,
+ "motion": "MOVEJ",
+ "segmentId": "motion_3",
+ "joints": [
+ 0,
+ -0.232711,
+ 0.465421,
+ 0,
+ 0.349066,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.380667,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "diagnostics": []
+ },
+ {
+ "index": 31,
+ "time": 1.92,
+ "motion": "MOVEJ",
+ "segmentId": "motion_3",
+ "joints": [
+ 0,
+ -0.349066,
+ 0.698132,
+ 0,
+ 0.523599,
+ 0
+ ],
+ "tcp": {
+ "position": [
+ 0.384,
+ 0,
+ 0.63
+ ],
+ "quaternion": [
+ 0,
+ 0.707107,
+ 0,
+ 0.707107
+ ]
+ },
+ "sourceMap": {
+ "line": 78,
+ "column": 5
+ },
+ "diagnostics": []
+ }
+ ],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/compile.json
new file mode 100644
index 0000000..9c97d4d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/compile.json
@@ -0,0 +1,11 @@
+{
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/post-report.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/post-report.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/compile.json
new file mode 100644
index 0000000..9c97d4d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/compile.json
@@ -0,0 +1,11 @@
+{
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/post-report.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/post-report.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/compile.json
new file mode 100644
index 0000000..9c97d4d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/compile.json
@@ -0,0 +1,11 @@
+{
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/post-report.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/post-report.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/compile.json
new file mode 100644
index 0000000..9c97d4d
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/compile.json
@@ -0,0 +1,11 @@
+{
+ "parsed": false,
+ "semanticChecks": [],
+ "sourceMapEntries": 0,
+ "kdlMotionRequests": 0,
+ "kdlPathRequests": 0,
+ "symbolCount": 0,
+ "procedureCount": 0,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/post-report.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/post-report.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/compile.json
new file mode 100644
index 0000000..6d939b1
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2RuntimeTimeout",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 5,
+ "procedureCount": 2,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/controller.json
new file mode 100644
index 0000000..ac88b82
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/controller.json
@@ -0,0 +1,431 @@
+{
+ "commands": [
+ {
+ "command": "loadProgram",
+ "before": "unloaded",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "start",
+ "before": "stopped",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "stepInto",
+ "before": "paused",
+ "after": "paused",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "hold",
+ "before": "paused",
+ "after": "hold",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resume",
+ "before": "hold",
+ "after": "running",
+ "result": "blocked",
+ "diagnostics": []
+ },
+ {
+ "command": "stepMotion",
+ "before": "running",
+ "after": "running",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "stop",
+ "before": "running",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ },
+ {
+ "command": "resetFault",
+ "before": "stopped",
+ "after": "stopped",
+ "result": "ok",
+ "diagnostics": []
+ }
+ ],
+ "snapshot": {
+ "state": {
+ "state": "stopped",
+ "diagnostics": []
+ },
+ "runtime": {
+ "loaded": true,
+ "procedure": "main",
+ "pc": 1,
+ "callStack": [
+ {
+ "procedure": "main",
+ "pc": 1
+ }
+ ],
+ "scopeStack": [
+ {
+ "id": "global",
+ "variables": {
+ "$wait:main:0": 0,
+ "$wait:main:1": 0.1
+ }
+ },
+ {
+ "id": "main",
+ "variables": {}
+ }
+ ],
+ "alarmQueue": [
+ {
+ "id": "DI99 timeout",
+ "message": "DI99 timeout",
+ "severity": "warning",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "time": 0.1
+ }
+ ],
+ "trace": [
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2RuntimeTimeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2RuntimeTimeout"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 4
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "timeout",
+ "elapsed": 0.1
+ },
+ "id": 5
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "DI99 timeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "DI99 timeout",
+ "severity": "warning"
+ },
+ "id": 6
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 8
+ }
+ ],
+ "currentSource": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "completed": false
+ },
+ "motion": {
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+ },
+ "io": {
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": false,
+ "io.di[6]": true,
+ "io.di[7]": false,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "scripts": []
+ },
+ "bridge": {
+ "pathIds": [],
+ "operationIds": [],
+ "diagnostics": []
+ }
+ }
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/io.json
new file mode 100644
index 0000000..2fb8400
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/io.json
@@ -0,0 +1,139 @@
+{
+ "time": 0.1,
+ "image": {
+ "io.di[1]": true,
+ "io.di[2]": false,
+ "io.di[3]": true,
+ "io.di[4]": false,
+ "io.di[5]": false,
+ "io.di[6]": true,
+ "io.di[7]": false,
+ "io.di[10]": true,
+ "io.ai[2]": 0.75
+ },
+ "events": [
+ {
+ "id": 1,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 1,
+ "raw": "io.di[1]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 2,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 2,
+ "raw": "io.di[2]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 3,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 3,
+ "raw": "io.di[3]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 4,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 4,
+ "raw": "io.di[4]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 5,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 5,
+ "raw": "io.di[5]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 6,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 6,
+ "raw": "io.di[6]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 7,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 7,
+ "raw": "io.di[7]"
+ },
+ "value": false,
+ "kind": "script"
+ },
+ {
+ "id": 8,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "di",
+ "index": 10,
+ "raw": "io.di[10]"
+ },
+ "value": true,
+ "kind": "script"
+ },
+ {
+ "id": 9,
+ "time": 0,
+ "writer": "script",
+ "target": {
+ "domain": "ai",
+ "index": 2,
+ "raw": "io.ai[2]"
+ },
+ "value": 0.75,
+ "kind": "script"
+ }
+ ],
+ "diagnostics": [
+ {
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ }
+ ],
+ "scripts": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/motion-queue.json
new file mode 100644
index 0000000..57085bb
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/motion-queue.json
@@ -0,0 +1,5 @@
+{
+ "items": [],
+ "activeIndex": 0,
+ "virtualTime": 0.1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/post-report.json
new file mode 100644
index 0000000..d9d6613
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/post-report.json
@@ -0,0 +1,8 @@
+{
+ "filenames": [
+ "W2RuntimeTimeout.mod",
+ "W2RuntimeTimeout.ls",
+ "W2RuntimeTimeout.src"
+ ],
+ "report": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/roundtrip.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/roundtrip.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/trace.json
new file mode 100644
index 0000000..fedfe64
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/trace.json
@@ -0,0 +1,165 @@
+[
+ {
+ "time": 0,
+ "kind": "load",
+ "procedure": "main",
+ "pc": 0,
+ "message": "Loaded W2RuntimeTimeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "moduleName": "W2RuntimeTimeout"
+ },
+ "id": 1
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 2
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 3
+ },
+ {
+ "time": 0,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 4
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 0,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "timeout",
+ "elapsed": 0.1
+ },
+ "id": 5
+ },
+ {
+ "time": 0.1,
+ "kind": "alarm",
+ "procedure": "main",
+ "pc": 0,
+ "message": "DI99 timeout",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "alarmId": "DI99 timeout",
+ "severity": "warning"
+ },
+ "id": 6
+ },
+ {
+ "time": 0.1,
+ "kind": "instruction",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:10:5",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "id": 7
+ },
+ {
+ "time": 0.1,
+ "kind": "wait",
+ "procedure": "main",
+ "pc": 1,
+ "instructionKind": "WAIT",
+ "source": {
+ "kind": "WAIT",
+ "id": "main:WAIT:11:5",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ },
+ "procedureId": "main"
+ },
+ "data": {
+ "status": "waiting",
+ "elapsed": 0
+ },
+ "id": 8
+ }
+]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/trajectory.json
new file mode 100644
index 0000000..4315263
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/trajectory.json
@@ -0,0 +1,22 @@
+{
+ "sampleCount": 0,
+ "duration": 0,
+ "startJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "endJoints": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "frames": [],
+ "diagnostics": []
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/compile.json
new file mode 100644
index 0000000..4b5e199
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2BrandHints",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 1,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 0,
+ "symbolCount": 7,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/post-report.json
new file mode 100644
index 0000000..d8d1d95
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/post-report.json
@@ -0,0 +1,45 @@
+{
+ "filenames": [
+ "W2BrandHints.mod",
+ "W2BrandHints.ls",
+ "W2BrandHints.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint fanuc ignored for abb",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint kuka ignored for abb",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint kuka ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for kuka",
+ "brand": "kuka"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint fanuc ignored for kuka",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/roundtrip.json
new file mode 100644
index 0000000..8d3ce25
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/roundtrip.json
@@ -0,0 +1,29 @@
+{
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2BrandHints.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/compile.json
new file mode 100644
index 0000000..64b7f0c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2CrossBrandMotion",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 6,
+ "kdlMotionRequests": 3,
+ "kdlPathRequests": 0,
+ "symbolCount": 10,
+ "procedureCount": 1,
+ "pathCount": 0,
+ "operationCount": 0
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/post-report.json
new file mode 100644
index 0000000..e129436
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/post-report.json
@@ -0,0 +1,21 @@
+{
+ "filenames": [
+ "W2CrossBrandMotion.mod",
+ "W2CrossBrandMotion.ls",
+ "W2CrossBrandMotion.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for fanuc",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_HINT_IGNORED",
+ "severity": "info",
+ "message": "post_hint abb ignored for kuka",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/roundtrip.json
new file mode 100644
index 0000000..6a91bfc
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/roundtrip.json
@@ -0,0 +1,29 @@
+{
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2CrossBrandMotion.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/compile.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/compile.json
new file mode 100644
index 0000000..2863696
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/compile.json
@@ -0,0 +1,36 @@
+{
+ "parsed": true,
+ "moduleName": "W2Roundtrip",
+ "astKind": "Program",
+ "semanticChecks": [
+ "language/module/proc",
+ "const/var/persistent symbols",
+ "tool/frame/speed/zone",
+ "joint_target/pose_target",
+ "movej/movel/movec",
+ "path/point/event/run_path",
+ "operation/run_operation",
+ "io/wait/pulse",
+ "if/elseif/else/while/for/switch",
+ "call/return/break/continue",
+ "proc parameter directions",
+ "func returns and side effects",
+ "alarm/raise/try/catch",
+ "source map propagation",
+ "KDL motion request bridge",
+ "KDL path request bridge",
+ "duplicate symbol diagnostics",
+ "missing reference diagnostics",
+ "P1 unsupported diagnostics",
+ "operation action expansion",
+ "path event expansion",
+ "raw statement preservation"
+ ],
+ "sourceMapEntries": 4,
+ "kdlMotionRequests": 1,
+ "kdlPathRequests": 1,
+ "symbolCount": 8,
+ "procedureCount": 1,
+ "pathCount": 1,
+ "operationCount": 1
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/controller.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/controller.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/controller.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/io.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/io.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/io.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/motion-queue.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/motion-queue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/motion-queue.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/post-report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/post-report.json
new file mode 100644
index 0000000..3290428
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/post-report.json
@@ -0,0 +1,27 @@
+{
+ "filenames": [
+ "W2Roundtrip.mod",
+ "W2Roundtrip.ls",
+ "W2Roundtrip.src"
+ ],
+ "report": [
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "brand": "abb"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "brand": "fanuc"
+ },
+ {
+ "code": "GRL_POST_UNSUPPORTED",
+ "severity": "warning",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "brand": "kuka"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/roundtrip.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/roundtrip.json
new file mode 100644
index 0000000..a9f636c
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/roundtrip.json
@@ -0,0 +1,29 @@
+{
+ "status": "warn",
+ "diagnostics": [
+ {
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2Roundtrip.mod",
+ "line": 3
+ }
+ },
+ {
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/trace.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/trace.json
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/trace.json
@@ -0,0 +1 @@
+[]
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/trajectory.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/trajectory.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/trajectory.json
@@ -0,0 +1 @@
+{}
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/report.html b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/report.html
new file mode 100644
index 0000000..ed89fc4
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/report.html
@@ -0,0 +1,40 @@
+
+
+
+
+ W2-JOB-20260628082622-51484d62
+
+
+
+ W2-JOB-20260628082622-51484d62
+ Suite working2-abb120-spec / Robot abb_irb120_3_58
+ Covered sections: 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25
+
+ | Program | Layer | Status | Diagnostics |
+ | W2_00_MinimalModule | Runtime | pass | 0 |
+| W2_10_DataTargetToolFrame | Runtime | pass | 8 |
+| W2_20_ExpressionMath | Runtime | pass | 0 |
+| W2_30_MotionAllTypes | Runtime | pass | 8 |
+| W2_40_PathEvents | Runtime | pass | 0 |
+| W2_50_OperationProcess | Runtime | pass | 0 |
+| W2_60_IOWaitPulse | Runtime | pass | 0 |
+| W2_70_ControlFlow | Runtime | pass | 45 |
+| W2_80_ProcFuncCall | Runtime | pass | 6 |
+| W2_90_ExceptionAlarm | Runtime | pass | 13 |
+| W2_99_FullSpecExample | Runtime | pass | 4 |
+| W2_E10_ExpressionDiagnostics | Static | diagnostic | 13 |
+| W2_E20_SemanticDiagnostics | Static | diagnostic | 6 |
+| W2_E30_MotionDiagnostics | Static | diagnostic | 4 |
+| W2_E40_ControlFlowDiagnostics | Static | diagnostic | 9 |
+| W2_E50_RuntimeTimeout | Runtime | diagnostic | 1 |
+| W2_P10_BrandHints | Post | pass | 10 |
+| W2_P20_CrossBrandMotion | Post | pass | 6 |
+| W2_P30_Roundtrip | Post | pass | 7 |
+
+
+
diff --git a/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/report.json b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/report.json
new file mode 100644
index 0000000..d9cf249
--- /dev/null
+++ b/kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/report.json
@@ -0,0 +1,1409 @@
+{
+ "job_id": "W2-JOB-20260628082622-51484d62",
+ "suite_id": "working2-abb120-spec",
+ "robot_id": "abb_irb120_3_58",
+ "coverage": {
+ "specSections": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25
+ ],
+ "coveredSections": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25
+ ],
+ "missingSections": [],
+ "runtimePrograms": 12,
+ "staticPrograms": 4,
+ "postPrograms": 3
+ },
+ "summary": {
+ "programs": 19,
+ "pass": 14,
+ "diagnostic": 5,
+ "fail": 0
+ },
+ "diagnostics": [
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 37,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 37,
+ "column": 14
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 38,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 38,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_speed preserved as raw IR",
+ "sourceMap": {
+ "line": 39,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement vl preserved as raw IR",
+ "sourceMap": {
+ "line": 39,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_zone preserved as raw IR",
+ "sourceMap": {
+ "line": 40,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_10_DataTargetToolFrame",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement z5 preserved as raw IR",
+ "sourceMap": {
+ "line": 40,
+ "column": 14
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 14
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_speed preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement vl preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_zone preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_30_MotionAllTypes",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement z10 preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 14
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 18
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 24
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 12,
+ "column": 31
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement elseif preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fault preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 12
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement == preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 18
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement true preserved as raw IR",
+ "sourceMap": {
+ "line": 13,
+ "column": 21
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement FAULT preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"fault\" preserved as raw IR",
+ "sourceMap": {
+ "line": 14,
+ "column": 19
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement else preserved as raw IR",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement NOT_READY preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"not ready\" preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 23
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement retry preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement = preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 1 preserved as raw IR",
+ "sourceMap": {
+ "line": 19,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement continue preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 18
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 24
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 23,
+ "column": 31
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement case preserved as raw IR",
+ "sourceMap": {
+ "line": 26,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 1 preserved as raw IR",
+ "sourceMap": {
+ "line": 26,
+ "column": 12
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 9
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement MODE1 preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"mode 1\" preserved as raw IR",
+ "sourceMap": {
+ "line": 27,
+ "column": 21
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement break preserved as raw IR",
+ "sourceMap": {
+ "line": 28,
+ "column": 9
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement case preserved as raw IR",
+ "sourceMap": {
+ "line": 29,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement 2 preserved as raw IR",
+ "sourceMap": {
+ "line": 29,
+ "column": 12
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 9
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 20
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 28
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 30,
+ "column": 33
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement default preserved as raw IR",
+ "sourceMap": {
+ "line": 31,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 9
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement MODE_OTHER preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_70_ControlFlow",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"mode other\" preserved as raw IR",
+ "sourceMap": {
+ "line": 32,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement movej preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement home preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement speed preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 18
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement v preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 24
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zone preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 26
+ }
+ },
+ {
+ "program_id": "W2_80_ProcFuncCall",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement zf preserved as raw IR",
+ "sourceMap": {
+ "line": 22,
+ "column": 31
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "warning",
+ "code": "GRL_P1_UNIMPLEMENTED",
+ "message": "trap recover_trap is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 6,
+ "column": 3
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "warning",
+ "code": "GRL_P1_UNIMPLEMENTED",
+ "message": "task background is parsed but not executable in P0",
+ "sourceMap": {
+ "line": 9,
+ "column": 3
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement raise preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement E_PICK_FAILED preserved as raw IR",
+ "sourceMap": {
+ "line": 16,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement E_PICK_FAILED preserved as raw IR",
+ "sourceMap": {
+ "line": 17,
+ "column": 11
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement RECOVER preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"recovering\" preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 21
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement severity preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 34
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement warning preserved as raw IR",
+ "sourceMap": {
+ "line": 18,
+ "column": 43
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement alarm preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement CLEANUP preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 13
+ }
+ },
+ {
+ "program_id": "W2_90_ExceptionAlarm",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement \"cleanup\" preserved as raw IR",
+ "sourceMap": {
+ "line": 20,
+ "column": 21
+ }
+ },
+ {
+ "program_id": "W2_99_FullSpecExample",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_tool preserved as raw IR",
+ "sourceMap": {
+ "line": 74,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_99_FullSpecExample",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement gripper preserved as raw IR",
+ "sourceMap": {
+ "line": 74,
+ "column": 14
+ }
+ },
+ {
+ "program_id": "W2_99_FullSpecExample",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement set_frame preserved as raw IR",
+ "sourceMap": {
+ "line": 75,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_99_FullSpecExample",
+ "severity": "info",
+ "code": "GRL_RAW_STATEMENT_PRESERVED",
+ "message": "Statement fixture preserved as raw IR",
+ "sourceMap": {
+ "line": 75,
+ "column": 15
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_SYMBOL",
+ "message": "Unknown constant missing_symbol",
+ "sourceMap": {
+ "line": 4,
+ "column": 41
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_SYMBOL",
+ "message": "Unknown constant missing_symbol",
+ "sourceMap": {
+ "line": 4,
+ "column": 41
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_FUNCTION",
+ "message": "Unknown function no_such_function",
+ "sourceMap": {
+ "line": 5,
+ "column": 43
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_ARITY",
+ "message": "atan2 expects 2 argument(s)",
+ "sourceMap": {
+ "line": 6,
+ "column": 36
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_DOMAIN",
+ "message": "Function argument is below domain",
+ "sourceMap": {
+ "line": 7,
+ "column": 33
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_DIV_ZERO",
+ "message": "Division by zero",
+ "sourceMap": {
+ "line": 8,
+ "column": 35
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_UNIT_MISMATCH",
+ "message": "Cannot combine length and time",
+ "sourceMap": {
+ "line": 9,
+ "column": 25
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_SYMBOL",
+ "message": "Unknown constant missing_symbol",
+ "sourceMap": {
+ "line": 4,
+ "column": 41
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_UNKNOWN_FUNCTION",
+ "message": "Unknown function no_such_function",
+ "sourceMap": {
+ "line": 5,
+ "column": 43
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_ARITY",
+ "message": "atan2 expects 2 argument(s)",
+ "sourceMap": {
+ "line": 6,
+ "column": 36
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_DOMAIN",
+ "message": "Function argument is below domain",
+ "sourceMap": {
+ "line": 7,
+ "column": 33
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_DIV_ZERO",
+ "message": "Division by zero",
+ "sourceMap": {
+ "line": 8,
+ "column": 35
+ }
+ },
+ {
+ "program_id": "W2_E10_ExpressionDiagnostics",
+ "severity": "error",
+ "code": "GRL_EXPR_UNIT_MISMATCH",
+ "message": "Cannot combine length and time",
+ "sourceMap": {
+ "line": 9,
+ "column": 25
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "severity": "error",
+ "code": "GRL_ARGUMENT_NOT_LVALUE",
+ "message": "out argument done must be a writable lvalue",
+ "sourceMap": {
+ "line": 15,
+ "column": 19
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "severity": "error",
+ "code": "GRL_SYMBOL_DUPLICATE",
+ "message": "Duplicate symbol v",
+ "sourceMap": {
+ "line": 4,
+ "column": 3
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "severity": "error",
+ "code": "GRL_ARGUMENT_NOT_LVALUE",
+ "message": "out argument done must be a writable lvalue",
+ "sourceMap": {
+ "line": 15,
+ "column": 19
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "severity": "error",
+ "code": "GRL_FUNC_SIDE_EFFECT",
+ "message": "Function bad_func cannot execute wait",
+ "sourceMap": {
+ "line": 11,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "severity": "error",
+ "code": "GRL_CALL_TARGET_NOT_FOUND",
+ "message": "Unknown call target missing_proc",
+ "sourceMap": {
+ "line": 16,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E20_SemanticDiagnostics",
+ "severity": "error",
+ "code": "GRL_TARGET_NOT_FOUND",
+ "message": "Unknown target missing_target"
+ },
+ {
+ "program_id": "W2_E30_MotionDiagnostics",
+ "severity": "error",
+ "code": "GRL_PATH_EMPTY",
+ "message": "Path empty_path must contain at least one point"
+ },
+ {
+ "program_id": "W2_E30_MotionDiagnostics",
+ "severity": "error",
+ "code": "GRL_PATH_EMPTY",
+ "message": "Path empty_path must contain at least one point"
+ },
+ {
+ "program_id": "W2_E30_MotionDiagnostics",
+ "severity": "error",
+ "code": "KDL_JOINT_LIMIT",
+ "message": "joint_1 exceeds fixture limit",
+ "segmentId": "main:MOVEJ",
+ "sourceMap": {
+ "line": 14,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E30_MotionDiagnostics",
+ "severity": "error",
+ "code": "KDL_TARGET_UNREACHABLE",
+ "message": "Target main:MOVEL is outside ABB120 fixture workspace",
+ "segmentId": "main:MOVEL",
+ "sourceMap": {
+ "line": 15,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_CONTINUE_OUTSIDE_LOOP",
+ "message": "continue is only valid inside loop",
+ "sourceMap": {
+ "line": 6,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_SWITCH_CASE_DUPLICATE",
+ "message": "Duplicate switch case 1",
+ "sourceMap": {
+ "line": 14,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_SWITCH_CASE_NOT_CONSTANT",
+ "message": "switch case must be a constant expression",
+ "sourceMap": {
+ "line": 16,
+ "column": 7
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_LABEL_NOT_FOUND",
+ "message": "Unknown label missing",
+ "sourceMap": {
+ "line": 19,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_JUMP_INTO_BLOCK",
+ "message": "jump cannot enter a nested or sibling block"
+ },
+ {
+ "program_id": "W2_E40_ControlFlowDiagnostics",
+ "severity": "error",
+ "code": "GRL_BREAK_OUTSIDE_FLOW",
+ "message": "break is only valid inside loop or switch",
+ "sourceMap": {
+ "line": 5,
+ "column": 5
+ }
+ },
+ {
+ "program_id": "W2_E50_RuntimeTimeout",
+ "severity": "warning",
+ "code": "VC_WAIT_TIMEOUT",
+ "message": "Wait timed out after 0.1s",
+ "sourceMap": {
+ "line": 10,
+ "column": 5
+ },
+ "data": {
+ "condition": "io . di [ 99 ] == true"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint fanuc ignored for abb",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint kuka ignored for abb",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint kuka ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint fanuc ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2BrandHints.mod",
+ "line": 3
+ }
+ },
+ {
+ "program_id": "W2_P10_BrandHints",
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for fanuc",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "GRL_POST_HINT_IGNORED",
+ "message": "post_hint abb ignored for kuka",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2CrossBrandMotion.mod",
+ "line": 3
+ }
+ },
+ {
+ "program_id": "W2_P20_CrossBrandMotion",
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by abb prototype postprocessor",
+ "data": {
+ "brand": "abb"
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by fanuc prototype postprocessor",
+ "data": {
+ "brand": "fanuc"
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "warning",
+ "code": "GRL_POST_UNSUPPORTED",
+ "message": "RUN_OPERATION is not supported by kuka prototype postprocessor",
+ "data": {
+ "brand": "kuka"
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "info",
+ "code": "IMPORT_TARGETS",
+ "message": "abb import mapped 1 targets"
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "info",
+ "code": "IMPORT_MOTIONS",
+ "message": "abb import mapped 1 motion points"
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "warning",
+ "code": "IMPORT_TARGET_STUB",
+ "message": "Target home was referenced by motion but had no parsed position; a zero pose stub was created",
+ "sourceMap": {
+ "file": "W2Roundtrip.mod",
+ "line": 3
+ }
+ },
+ {
+ "program_id": "W2_P30_Roundtrip",
+ "severity": "info",
+ "code": "IMPORT_TOOL_DETECTED",
+ "message": "abb tool selection detected and recorded as import metadata"
+ }
+ ]
+}
diff --git a/kdl-wasm/web/test-results/virtual-controller/button-evidence-public.json b/kdl-wasm/web/test-results/virtual-controller/button-evidence-public.json
new file mode 100644
index 0000000..64c9e9c
--- /dev/null
+++ b/kdl-wasm/web/test-results/virtual-controller/button-evidence-public.json
@@ -0,0 +1,633 @@
+{
+ "targetUrl": "https://82.156.24.101:8095/app/virtual-controller.html",
+ "chrome": "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe",
+ "initial": {
+ "title": "ABB120 Virtual Controller",
+ "state": "ready",
+ "program": "W2_60_IOWaitPulse",
+ "wait": "none",
+ "log": "W2-JOB-latest ready",
+ "reports": "W2-JOB-20260628082622-51484d62 report",
+ "storage": "cache h0/n1/w0/e0 network demo-manifest.json",
+ "joints": "[0, 0, 0, 0, 0, 0]",
+ "tcp": "pos [0.374, 0, 0.63] q [0, 0.707107, 0, 0.707107]",
+ "frame": "1 / 6",
+ "frameCurrent": 1,
+ "frameTotal": 6,
+ "frameRows": 4,
+ "frameTime": "t=0 / 0.24 s, step=0.05 s, source 1/4 (4 trajectory frames)",
+ "parser": "idle",
+ "parserProgress": 1,
+ "stepStatus": "11/12 Path Point line 8 t=0 s",
+ "stepRows": 12,
+ "activeStepRows": 1,
+ "activeStepText": "110-0.24 s8Path Pointpoint p0 movej homeMOVEJ / home1-6 @50ms",
+ "programOptions": [
+ "W2_00_MinimalModule",
+ "W2_10_DataTargetToolFrame",
+ "W2_20_ExpressionMath",
+ "W2_30_MotionAllTypes",
+ "W2_40_PathEvents",
+ "W2_50_OperationProcess",
+ "W2_60_IOWaitPulse",
+ "W2_70_ControlFlow",
+ "W2_80_ProcFuncCall",
+ "W2_90_ExceptionAlarm",
+ "W2_99_FullSpecExample",
+ "W2_E10_ExpressionDiagnostics",
+ "W2_E20_SemanticDiagnostics",
+ "W2_E30_MotionDiagnostics",
+ "W2_E40_ControlFlowDiagnostics",
+ "W2_E50_RuntimeTimeout",
+ "W2_P10_BrandHints",
+ "W2_P20_CrossBrandMotion",
+ "W2_P30_Roundtrip"
+ ],
+ "running": false,
+ "playbackTime": 0,
+ "samplePeriodSec": 0.05,
+ "sampleIndex": 0,
+ "sourceFrameIndex": 0,
+ "sourceFrameTotal": 4,
+ "storageState": {
+ "mode": "OPFS",
+ "hits": 0,
+ "network": 1,
+ "writes": 1,
+ "errors": 0,
+ "last": "OPFS saved demo-manifest.json"
+ },
+ "parseStream": {
+ "active": false,
+ "timer": false,
+ "programId": "",
+ "cursorLine": 0,
+ "totalLines": 0,
+ "linesPerTick": 1,
+ "startedAt": 0,
+ "completedProgramId": "",
+ "lastSummary": "idle"
+ },
+ "errors": []
+ },
+ "afterLoadClick": {
+ "title": "ABB120 Virtual Controller",
+ "state": "load",
+ "program": "W2_60_IOWaitPulse",
+ "wait": "none",
+ "log": "W2_60_IOWaitPulse loading from OPFS h0/n1/w1/e0",
+ "reports": "W2-JOB-20260628082622-51484d62 report",
+ "storage": "OPFS h0/n1/w1/e0 OPFS saved demo-manifest.json",
+ "joints": "[0, 0, 0, 0, 0, 0]",
+ "tcp": "pos [0.374, 0, 0.63] q [0, 0.707107, 0, 0.707107]",
+ "frame": "1 / 6",
+ "frameCurrent": 1,
+ "frameTotal": 6,
+ "frameRows": 4,
+ "frameTime": "t=0 / 0.24 s, step=0.05 s, source 1/4 (4 trajectory frames)",
+ "parser": "idle",
+ "parserProgress": 1,
+ "stepStatus": "11/12 Path Point line 8 t=0 s",
+ "stepRows": 12,
+ "activeStepRows": 1,
+ "activeStepText": "110-0.24 s8Path Pointpoint p0 movej homeMOVEJ / home1-6 @50ms",
+ "programOptions": [
+ "W2_00_MinimalModule",
+ "W2_10_DataTargetToolFrame",
+ "W2_20_ExpressionMath",
+ "W2_30_MotionAllTypes",
+ "W2_40_PathEvents",
+ "W2_50_OperationProcess",
+ "W2_60_IOWaitPulse",
+ "W2_70_ControlFlow",
+ "W2_80_ProcFuncCall",
+ "W2_90_ExceptionAlarm",
+ "W2_99_FullSpecExample",
+ "W2_E10_ExpressionDiagnostics",
+ "W2_E20_SemanticDiagnostics",
+ "W2_E30_MotionDiagnostics",
+ "W2_E40_ControlFlowDiagnostics",
+ "W2_E50_RuntimeTimeout",
+ "W2_P10_BrandHints",
+ "W2_P20_CrossBrandMotion",
+ "W2_P30_Roundtrip"
+ ],
+ "running": false,
+ "playbackTime": 0,
+ "samplePeriodSec": 0.05,
+ "sampleIndex": 0,
+ "sourceFrameIndex": 0,
+ "sourceFrameTotal": 4,
+ "storageState": {
+ "mode": "OPFS",
+ "hits": 0,
+ "network": 6,
+ "writes": 6,
+ "errors": 0,
+ "last": "OPFS saved trace.json"
+ },
+ "parseStream": {
+ "active": false,
+ "timer": false,
+ "programId": "",
+ "cursorLine": 0,
+ "totalLines": 0,
+ "linesPerTick": 1,
+ "startedAt": 0,
+ "completedProgramId": "",
+ "lastSummary": "idle"
+ },
+ "errors": []
+ },
+ "afterRun": {
+ "title": "ABB120 Virtual Controller",
+ "state": "running",
+ "program": "W2_60_IOWaitPulse",
+ "wait": "waiting di[1]",
+ "log": "W2_60_IOWaitPulse running sample 2 t=0.05s",
+ "reports": "W2-JOB-20260628082622-51484d62 report",
+ "storage": "OPFS h0/n10/w10/e0 OPFS saved roundtrip.json",
+ "joints": "[0, 0, 0, 0, 0, 0]",
+ "tcp": "pos [0.376083, 0, 0.63] q [0, 0.707107, 0, 0.707107]",
+ "frame": "2 / 6",
+ "frameCurrent": 2,
+ "frameTotal": 6,
+ "frameRows": 4,
+ "frameTime": "t=0.05 / 0.24 s, step=0.05 s, source 1/4 (4 trajectory frames)",
+ "parser": "parsed 24 lines, 4 frames",
+ "parserProgress": 1,
+ "stepStatus": "11/12 Path Point line 8 t=0.05 s",
+ "stepRows": 12,
+ "activeStepRows": 1,
+ "activeStepText": "110-0.24 s8Path Pointpoint p0 movej homeMOVEJ / home1-6 @50ms",
+ "programOptions": [
+ "W2_00_MinimalModule",
+ "W2_10_DataTargetToolFrame",
+ "W2_20_ExpressionMath",
+ "W2_30_MotionAllTypes",
+ "W2_40_PathEvents",
+ "W2_50_OperationProcess",
+ "W2_60_IOWaitPulse",
+ "W2_70_ControlFlow",
+ "W2_80_ProcFuncCall",
+ "W2_90_ExceptionAlarm",
+ "W2_99_FullSpecExample",
+ "W2_E10_ExpressionDiagnostics",
+ "W2_E20_SemanticDiagnostics",
+ "W2_E30_MotionDiagnostics",
+ "W2_E40_ControlFlowDiagnostics",
+ "W2_E50_RuntimeTimeout",
+ "W2_P10_BrandHints",
+ "W2_P20_CrossBrandMotion",
+ "W2_P30_Roundtrip"
+ ],
+ "running": true,
+ "playbackTime": 0.05,
+ "samplePeriodSec": 0.05,
+ "sampleIndex": 1,
+ "sourceFrameIndex": 0,
+ "sourceFrameTotal": 4,
+ "storageState": {
+ "mode": "OPFS",
+ "hits": 0,
+ "network": 10,
+ "writes": 10,
+ "errors": 0,
+ "last": "OPFS saved roundtrip.json"
+ },
+ "parseStream": {
+ "active": false,
+ "timer": false,
+ "programId": "W2_60_IOWaitPulse",
+ "cursorLine": 24,
+ "totalLines": 24,
+ "linesPerTick": 1,
+ "startedAt": 615.1000001430511,
+ "completedProgramId": "W2_60_IOWaitPulse",
+ "lastSummary": "parsed 24 lines, 4 frames"
+ },
+ "errors": []
+ },
+ "afterPause": {
+ "title": "ABB120 Virtual Controller",
+ "state": "paused",
+ "program": "W2_60_IOWaitPulse",
+ "wait": "waiting di[1]",
+ "log": "W2_60_IOWaitPulse paused",
+ "reports": "W2-JOB-20260628082622-51484d62 report",
+ "storage": "OPFS h0/n10/w10/e0 OPFS saved roundtrip.json",
+ "joints": "[0, 0, 0, 0, 0, 0]",
+ "tcp": "pos [0.384, 0, 0.63] q [0, 0.707107, 0, 0.707107]",
+ "frame": "6 / 6",
+ "frameCurrent": 6,
+ "frameTotal": 6,
+ "frameRows": 4,
+ "frameTime": "t=0.24 / 0.24 s, step=0.05 s, source 4/4 (4 trajectory frames)",
+ "parser": "parsed 24 lines, 4 frames",
+ "parserProgress": 1,
+ "stepStatus": "11/12 Path Point line 8 t=0.24 s",
+ "stepRows": 12,
+ "activeStepRows": 1,
+ "activeStepText": "110-0.24 s8Path Pointpoint p0 movej homeMOVEJ / home1-6 @50ms",
+ "programOptions": [
+ "W2_00_MinimalModule",
+ "W2_10_DataTargetToolFrame",
+ "W2_20_ExpressionMath",
+ "W2_30_MotionAllTypes",
+ "W2_40_PathEvents",
+ "W2_50_OperationProcess",
+ "W2_60_IOWaitPulse",
+ "W2_70_ControlFlow",
+ "W2_80_ProcFuncCall",
+ "W2_90_ExceptionAlarm",
+ "W2_99_FullSpecExample",
+ "W2_E10_ExpressionDiagnostics",
+ "W2_E20_SemanticDiagnostics",
+ "W2_E30_MotionDiagnostics",
+ "W2_E40_ControlFlowDiagnostics",
+ "W2_E50_RuntimeTimeout",
+ "W2_P10_BrandHints",
+ "W2_P20_CrossBrandMotion",
+ "W2_P30_Roundtrip"
+ ],
+ "running": false,
+ "playbackTime": 0.24,
+ "samplePeriodSec": 0.05,
+ "sampleIndex": 5,
+ "sourceFrameIndex": 3,
+ "sourceFrameTotal": 4,
+ "storageState": {
+ "mode": "OPFS",
+ "hits": 0,
+ "network": 10,
+ "writes": 10,
+ "errors": 0,
+ "last": "OPFS saved roundtrip.json"
+ },
+ "parseStream": {
+ "active": false,
+ "timer": false,
+ "programId": "W2_60_IOWaitPulse",
+ "cursorLine": 24,
+ "totalLines": 24,
+ "linesPerTick": 1,
+ "startedAt": 615.1000001430511,
+ "completedProgramId": "W2_60_IOWaitPulse",
+ "lastSummary": "parsed 24 lines, 4 frames"
+ },
+ "errors": []
+ },
+ "afterStep": {
+ "title": "ABB120 Virtual Controller",
+ "state": "paused",
+ "program": "W2_60_IOWaitPulse",
+ "wait": "waiting di[1]",
+ "log": "W2_60_IOWaitPulse stepped sample 6 t=0.24s",
+ "reports": "W2-JOB-20260628082622-51484d62 report",
+ "storage": "OPFS h0/n10/w10/e0 OPFS saved roundtrip.json",
+ "joints": "[0, 0, 0, 0, 0, 0]",
+ "tcp": "pos [0.384, 0, 0.63] q [0, 0.707107, 0, 0.707107]",
+ "frame": "6 / 6",
+ "frameCurrent": 6,
+ "frameTotal": 6,
+ "frameRows": 4,
+ "frameTime": "t=0.24 / 0.24 s, step=0.05 s, source 4/4 (4 trajectory frames)",
+ "parser": "parsed 24 lines, 4 frames",
+ "parserProgress": 1,
+ "stepStatus": "11/12 Path Point line 8 t=0.24 s",
+ "stepRows": 12,
+ "activeStepRows": 1,
+ "activeStepText": "110-0.24 s8Path Pointpoint p0 movej homeMOVEJ / home1-6 @50ms",
+ "programOptions": [
+ "W2_00_MinimalModule",
+ "W2_10_DataTargetToolFrame",
+ "W2_20_ExpressionMath",
+ "W2_30_MotionAllTypes",
+ "W2_40_PathEvents",
+ "W2_50_OperationProcess",
+ "W2_60_IOWaitPulse",
+ "W2_70_ControlFlow",
+ "W2_80_ProcFuncCall",
+ "W2_90_ExceptionAlarm",
+ "W2_99_FullSpecExample",
+ "W2_E10_ExpressionDiagnostics",
+ "W2_E20_SemanticDiagnostics",
+ "W2_E30_MotionDiagnostics",
+ "W2_E40_ControlFlowDiagnostics",
+ "W2_E50_RuntimeTimeout",
+ "W2_P10_BrandHints",
+ "W2_P20_CrossBrandMotion",
+ "W2_P30_Roundtrip"
+ ],
+ "running": false,
+ "playbackTime": 0.24,
+ "samplePeriodSec": 0.05,
+ "sampleIndex": 5,
+ "sourceFrameIndex": 3,
+ "sourceFrameTotal": 4,
+ "storageState": {
+ "mode": "OPFS",
+ "hits": 0,
+ "network": 10,
+ "writes": 10,
+ "errors": 0,
+ "last": "OPFS saved roundtrip.json"
+ },
+ "parseStream": {
+ "active": false,
+ "timer": false,
+ "programId": "W2_60_IOWaitPulse",
+ "cursorLine": 24,
+ "totalLines": 24,
+ "linesPerTick": 1,
+ "startedAt": 615.1000001430511,
+ "completedProgramId": "W2_60_IOWaitPulse",
+ "lastSummary": "parsed 24 lines, 4 frames"
+ },
+ "errors": []
+ },
+ "afterStop": {
+ "title": "ABB120 Virtual Controller",
+ "state": "stopped",
+ "program": "W2_60_IOWaitPulse",
+ "wait": "none",
+ "log": "W2_60_IOWaitPulse stopped",
+ "reports": "W2-JOB-20260628082622-51484d62 report",
+ "storage": "OPFS h0/n10/w10/e0 OPFS saved roundtrip.json",
+ "joints": "[0, 0, 0, 0, 0, 0]",
+ "tcp": "pos [0.384, 0, 0.63] q [0, 0.707107, 0, 0.707107]",
+ "frame": "6 / 6",
+ "frameCurrent": 6,
+ "frameTotal": 6,
+ "frameRows": 4,
+ "frameTime": "t=0.24 / 0.24 s, step=0.05 s, source 4/4 (4 trajectory frames)",
+ "parser": "parsed 24 lines, 4 frames",
+ "parserProgress": 1,
+ "stepStatus": "11/12 Path Point line 8 t=0.24 s",
+ "stepRows": 12,
+ "activeStepRows": 1,
+ "activeStepText": "110-0.24 s8Path Pointpoint p0 movej homeMOVEJ / home1-6 @50ms",
+ "programOptions": [
+ "W2_00_MinimalModule",
+ "W2_10_DataTargetToolFrame",
+ "W2_20_ExpressionMath",
+ "W2_30_MotionAllTypes",
+ "W2_40_PathEvents",
+ "W2_50_OperationProcess",
+ "W2_60_IOWaitPulse",
+ "W2_70_ControlFlow",
+ "W2_80_ProcFuncCall",
+ "W2_90_ExceptionAlarm",
+ "W2_99_FullSpecExample",
+ "W2_E10_ExpressionDiagnostics",
+ "W2_E20_SemanticDiagnostics",
+ "W2_E30_MotionDiagnostics",
+ "W2_E40_ControlFlowDiagnostics",
+ "W2_E50_RuntimeTimeout",
+ "W2_P10_BrandHints",
+ "W2_P20_CrossBrandMotion",
+ "W2_P30_Roundtrip"
+ ],
+ "running": false,
+ "playbackTime": 0.24,
+ "samplePeriodSec": 0.05,
+ "sampleIndex": 5,
+ "sourceFrameIndex": 3,
+ "sourceFrameTotal": 4,
+ "storageState": {
+ "mode": "OPFS",
+ "hits": 0,
+ "network": 10,
+ "writes": 10,
+ "errors": 0,
+ "last": "OPFS saved roundtrip.json"
+ },
+ "parseStream": {
+ "active": false,
+ "timer": false,
+ "programId": "W2_60_IOWaitPulse",
+ "cursorLine": 24,
+ "totalLines": 24,
+ "linesPerTick": 1,
+ "startedAt": 615.1000001430511,
+ "completedProgramId": "W2_60_IOWaitPulse",
+ "lastSummary": "parsed 24 lines, 4 frames"
+ },
+ "errors": []
+ },
+ "afterReset": {
+ "title": "ABB120 Virtual Controller",
+ "state": "ready",
+ "program": "W2_60_IOWaitPulse",
+ "wait": "none",
+ "log": "controller reset",
+ "reports": "W2-JOB-20260628082622-51484d62 report",
+ "storage": "OPFS h0/n10/w10/e0 OPFS saved roundtrip.json",
+ "joints": "[0, 0, 0, 0, 0, 0]",
+ "tcp": "pos [0.374, 0, 0.63] q [0, 0.707107, 0, 0.707107]",
+ "frame": "1 / 6",
+ "frameCurrent": 1,
+ "frameTotal": 6,
+ "frameRows": 4,
+ "frameTime": "t=0 / 0.24 s, step=0.05 s, source 1/4 (4 trajectory frames)",
+ "parser": "parsed 24 lines, 4 frames",
+ "parserProgress": 1,
+ "stepStatus": "11/12 Path Point line 8 t=0 s",
+ "stepRows": 12,
+ "activeStepRows": 1,
+ "activeStepText": "110-0.24 s8Path Pointpoint p0 movej homeMOVEJ / home1-6 @50ms",
+ "programOptions": [
+ "W2_00_MinimalModule",
+ "W2_10_DataTargetToolFrame",
+ "W2_20_ExpressionMath",
+ "W2_30_MotionAllTypes",
+ "W2_40_PathEvents",
+ "W2_50_OperationProcess",
+ "W2_60_IOWaitPulse",
+ "W2_70_ControlFlow",
+ "W2_80_ProcFuncCall",
+ "W2_90_ExceptionAlarm",
+ "W2_99_FullSpecExample",
+ "W2_E10_ExpressionDiagnostics",
+ "W2_E20_SemanticDiagnostics",
+ "W2_E30_MotionDiagnostics",
+ "W2_E40_ControlFlowDiagnostics",
+ "W2_E50_RuntimeTimeout",
+ "W2_P10_BrandHints",
+ "W2_P20_CrossBrandMotion",
+ "W2_P30_Roundtrip"
+ ],
+ "running": false,
+ "playbackTime": 0,
+ "samplePeriodSec": 0.05,
+ "sampleIndex": 0,
+ "sourceFrameIndex": 0,
+ "sourceFrameTotal": 4,
+ "storageState": {
+ "mode": "OPFS",
+ "hits": 0,
+ "network": 10,
+ "writes": 10,
+ "errors": 0,
+ "last": "OPFS saved roundtrip.json"
+ },
+ "parseStream": {
+ "active": false,
+ "timer": false,
+ "programId": "W2_60_IOWaitPulse",
+ "cursorLine": 24,
+ "totalLines": 24,
+ "linesPerTick": 1,
+ "startedAt": 615.1000001430511,
+ "completedProgramId": "W2_60_IOWaitPulse",
+ "lastSummary": "parsed 24 lines, 4 frames"
+ },
+ "errors": []
+ },
+ "afterExport": {
+ "title": "ABB120 Virtual Controller",
+ "state": "ready",
+ "program": "W2_60_IOWaitPulse",
+ "wait": "none",
+ "log": "delivery package exported",
+ "reports": "W2-JOB-20260628082622-51484d62 report exported",
+ "storage": "OPFS h0/n10/w10/e0 OPFS saved roundtrip.json",
+ "joints": "[0, 0, 0, 0, 0, 0]",
+ "tcp": "pos [0.374, 0, 0.63] q [0, 0.707107, 0, 0.707107]",
+ "frame": "1 / 6",
+ "frameCurrent": 1,
+ "frameTotal": 6,
+ "frameRows": 4,
+ "frameTime": "t=0 / 0.24 s, step=0.05 s, source 1/4 (4 trajectory frames)",
+ "parser": "parsed 24 lines, 4 frames",
+ "parserProgress": 1,
+ "stepStatus": "11/12 Path Point line 8 t=0 s",
+ "stepRows": 12,
+ "activeStepRows": 1,
+ "activeStepText": "110-0.24 s8Path Pointpoint p0 movej homeMOVEJ / home1-6 @50ms",
+ "programOptions": [
+ "W2_00_MinimalModule",
+ "W2_10_DataTargetToolFrame",
+ "W2_20_ExpressionMath",
+ "W2_30_MotionAllTypes",
+ "W2_40_PathEvents",
+ "W2_50_OperationProcess",
+ "W2_60_IOWaitPulse",
+ "W2_70_ControlFlow",
+ "W2_80_ProcFuncCall",
+ "W2_90_ExceptionAlarm",
+ "W2_99_FullSpecExample",
+ "W2_E10_ExpressionDiagnostics",
+ "W2_E20_SemanticDiagnostics",
+ "W2_E30_MotionDiagnostics",
+ "W2_E40_ControlFlowDiagnostics",
+ "W2_E50_RuntimeTimeout",
+ "W2_P10_BrandHints",
+ "W2_P20_CrossBrandMotion",
+ "W2_P30_Roundtrip"
+ ],
+ "running": false,
+ "playbackTime": 0,
+ "samplePeriodSec": 0.05,
+ "sampleIndex": 0,
+ "sourceFrameIndex": 0,
+ "sourceFrameTotal": 4,
+ "storageState": {
+ "mode": "OPFS",
+ "hits": 0,
+ "network": 10,
+ "writes": 10,
+ "errors": 0,
+ "last": "OPFS saved roundtrip.json"
+ },
+ "parseStream": {
+ "active": false,
+ "timer": false,
+ "programId": "W2_60_IOWaitPulse",
+ "cursorLine": 24,
+ "totalLines": 24,
+ "linesPerTick": 1,
+ "startedAt": 615.1000001430511,
+ "completedProgramId": "W2_60_IOWaitPulse",
+ "lastSummary": "parsed 24 lines, 4 frames"
+ },
+ "errors": []
+ },
+ "afterProgramSwitch": {
+ "title": "ABB120 Virtual Controller",
+ "state": "ready",
+ "program": "W2_99_FullSpecExample",
+ "wait": "none",
+ "log": "W2_99_FullSpecExample parsed (32 frames, 40 samples @50ms)",
+ "reports": "W2-JOB-20260628082622-51484d62 report exported",
+ "storage": "OPFS h0/n19/w19/e0 OPFS saved roundtrip.json",
+ "joints": "[0, 0, 0, 0, 0, 0]",
+ "tcp": "pos [0.374, 0, 0.63] q [0, 0.707107, 0, 0.707107]",
+ "frame": "1 / 40",
+ "frameCurrent": 1,
+ "frameTotal": 40,
+ "frameRows": 32,
+ "frameTime": "t=0 / 1.92 s, step=0.05 s, source 1/32 (32 trajectory frames)",
+ "parser": "parsed 81 lines, 32 frames",
+ "parserProgress": 1,
+ "stepStatus": "4/16 Path Point line 39 t=0 s",
+ "stepRows": 16,
+ "activeStepRows": 1,
+ "activeStepText": "40-0.2 s39Path Pointpoint approach movej home speed v_fast zone fineMOVEJ / home1-5 @50ms",
+ "programOptions": [
+ "W2_00_MinimalModule",
+ "W2_10_DataTargetToolFrame",
+ "W2_20_ExpressionMath",
+ "W2_30_MotionAllTypes",
+ "W2_40_PathEvents",
+ "W2_50_OperationProcess",
+ "W2_60_IOWaitPulse",
+ "W2_70_ControlFlow",
+ "W2_80_ProcFuncCall",
+ "W2_90_ExceptionAlarm",
+ "W2_99_FullSpecExample",
+ "W2_E10_ExpressionDiagnostics",
+ "W2_E20_SemanticDiagnostics",
+ "W2_E30_MotionDiagnostics",
+ "W2_E40_ControlFlowDiagnostics",
+ "W2_E50_RuntimeTimeout",
+ "W2_P10_BrandHints",
+ "W2_P20_CrossBrandMotion",
+ "W2_P30_Roundtrip"
+ ],
+ "running": false,
+ "playbackTime": 0,
+ "samplePeriodSec": 0.05,
+ "sampleIndex": 0,
+ "sourceFrameIndex": 0,
+ "sourceFrameTotal": 32,
+ "storageState": {
+ "mode": "OPFS",
+ "hits": 0,
+ "network": 19,
+ "writes": 19,
+ "errors": 0,
+ "last": "OPFS saved roundtrip.json"
+ },
+ "parseStream": {
+ "active": false,
+ "timer": false,
+ "programId": "W2_99_FullSpecExample",
+ "cursorLine": 81,
+ "totalLines": 81,
+ "linesPerTick": 4,
+ "startedAt": 3098,
+ "completedProgramId": "W2_99_FullSpecExample",
+ "lastSummary": "parsed 81 lines, 32 frames"
+ },
+ "errors": []
+ },
+ "offlineCache": {
+ "program": "W2_99_FullSpecExample",
+ "mode": "OPFS",
+ "hitsBefore": 0,
+ "hitsAfter": 9,
+ "frame": "1 / 40",
+ "storage": "OPFS h9/n19/w19/e9 network roundtrip.json TypeError"
+ }
+}
diff --git a/kdl-wasm/web/test-results/virtual-controller/button-evidence.json b/kdl-wasm/web/test-results/virtual-controller/button-evidence.json
new file mode 100644
index 0000000..f8518a5
--- /dev/null
+++ b/kdl-wasm/web/test-results/virtual-controller/button-evidence.json
@@ -0,0 +1,467 @@
+{
+ "targetUrl": "file:///E:/Work/kdl_work/kdl-wasm/web/app/virtual-controller.html",
+ "chrome": "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe",
+ "initial": {
+ "title": "ABB120 Virtual Controller",
+ "state": "ready",
+ "program": "W2_60_IOWaitPulse",
+ "wait": "none",
+ "log": "W2-JOB-latest ready",
+ "reports": "W2-JOB-latest report",
+ "storage": "cache h0/n0/w0/e0 checking browser storage",
+ "joints": "[0, 0, 0, 0, 0, 0]",
+ "tcp": "pos [0.374, 0, 0.63] q [0, 0.707107, 0, 0.707107]",
+ "frame": "1 / 6",
+ "frameCurrent": 1,
+ "frameTotal": 6,
+ "frameRows": 4,
+ "frameTime": "t=0 / 0.24 s, step=0.05 s, source 1/4 (4 trajectory frames)",
+ "parser": "idle",
+ "parserProgress": 1,
+ "stepStatus": "11/12 Path Point line 8 t=0 s",
+ "stepRows": 12,
+ "activeStepRows": 1,
+ "activeStepText": "110-0.24 s8Path Pointpoint p0 movej homeMOVEJ / home1-6 @50ms",
+ "programOptions": [
+ "W2_60_IOWaitPulse"
+ ],
+ "running": false,
+ "playbackTime": 0,
+ "samplePeriodSec": 0.05,
+ "sampleIndex": 0,
+ "sourceFrameIndex": 0,
+ "sourceFrameTotal": 4,
+ "storageState": {
+ "mode": "localStorage",
+ "hits": 0,
+ "network": 0,
+ "writes": 0,
+ "errors": 2,
+ "last": "OPFS blocked: SecurityError"
+ },
+ "parseStream": {
+ "active": false,
+ "timer": false,
+ "programId": "",
+ "cursorLine": 0,
+ "totalLines": 0,
+ "linesPerTick": 1,
+ "startedAt": 0,
+ "completedProgramId": "",
+ "lastSummary": "idle"
+ },
+ "errors": []
+ },
+ "afterLoadClick": {
+ "title": "ABB120 Virtual Controller",
+ "state": "parsing",
+ "program": "W2_60_IOWaitPulse",
+ "wait": "none",
+ "log": "W2_60_IOWaitPulse parsing load from localStorage h0/n0/w0/e2",
+ "reports": "W2-JOB-latest report",
+ "storage": "localStorage h0/n0/w0/e2 OPFS blocked: SecurityError",
+ "joints": "[0, 0, 0, 0, 0, 0]",
+ "tcp": "pos [0, 0, 0] q [0, 0.707107, 0, 0.707107]",
+ "frame": "1 / 1",
+ "frameCurrent": 1,
+ "frameTotal": 1,
+ "frameRows": 1,
+ "frameTime": "t=0 / 0 s, step=0.05 s, source 1/1 (0 trajectory frames)",
+ "parser": "parsing 3/23 lines, frames 0/4, t=0 s",
+ "parserProgress": 0.13043478260869565,
+ "stepStatus": "1/1 Sample line - t=0 s",
+ "stepRows": 1,
+ "activeStepRows": 1,
+ "activeStepText": "10 sSamplesample trajectoryNO_MOTION / no planned segment1 @50ms",
+ "programOptions": [
+ "W2_60_IOWaitPulse"
+ ],
+ "running": false,
+ "playbackTime": 0,
+ "samplePeriodSec": 0.05,
+ "sampleIndex": 0,
+ "sourceFrameIndex": 0,
+ "sourceFrameTotal": 4,
+ "storageState": {
+ "mode": "localStorage",
+ "hits": 0,
+ "network": 0,
+ "writes": 0,
+ "errors": 2,
+ "last": "OPFS blocked: SecurityError"
+ },
+ "parseStream": {
+ "active": true,
+ "timer": true,
+ "programId": "W2_60_IOWaitPulse",
+ "cursorLine": 3,
+ "totalLines": 23,
+ "linesPerTick": 1,
+ "startedAt": 289.2000000476837,
+ "completedProgramId": "",
+ "lastSummary": "parsing 3/23 lines, frames 0/4, t=0 s"
+ },
+ "errors": []
+ },
+ "afterRun": {
+ "title": "ABB120 Virtual Controller",
+ "state": "running",
+ "program": "W2_60_IOWaitPulse",
+ "wait": "waiting di[1]",
+ "log": "W2_60_IOWaitPulse running sample 2 t=0.05s",
+ "reports": "W2-JOB-latest report",
+ "storage": "localStorage h0/n0/w0/e2 OPFS blocked: SecurityError",
+ "joints": "[0.025, 0.00625, -0.016667, 0, 0.004167, 0]",
+ "tcp": "pos [0.376083, 0, 0.63] q [0, 0.707107, 0, 0.707107]",
+ "frame": "2 / 6",
+ "frameCurrent": 2,
+ "frameTotal": 6,
+ "frameRows": 4,
+ "frameTime": "t=0.05 / 0.24 s, step=0.05 s, source 1/4 (4 trajectory frames)",
+ "parser": "parsed 23 lines, 4 frames",
+ "parserProgress": 1,
+ "stepStatus": "11/12 Path Point line 8 t=0.05 s",
+ "stepRows": 12,
+ "activeStepRows": 1,
+ "activeStepText": "110-0.24 s8Path Pointpoint p0 movej homeMOVEJ / home1-6 @50ms",
+ "programOptions": [
+ "W2_60_IOWaitPulse"
+ ],
+ "running": true,
+ "playbackTime": 0.05,
+ "samplePeriodSec": 0.05,
+ "sampleIndex": 1,
+ "sourceFrameIndex": 0,
+ "sourceFrameTotal": 4,
+ "storageState": {
+ "mode": "localStorage",
+ "hits": 0,
+ "network": 0,
+ "writes": 0,
+ "errors": 2,
+ "last": "OPFS blocked: SecurityError"
+ },
+ "parseStream": {
+ "active": false,
+ "timer": false,
+ "programId": "W2_60_IOWaitPulse",
+ "cursorLine": 23,
+ "totalLines": 23,
+ "linesPerTick": 1,
+ "startedAt": 289.2000000476837,
+ "completedProgramId": "W2_60_IOWaitPulse",
+ "lastSummary": "parsed 23 lines, 4 frames"
+ },
+ "errors": []
+ },
+ "afterPause": {
+ "title": "ABB120 Virtual Controller",
+ "state": "paused",
+ "program": "W2_60_IOWaitPulse",
+ "wait": "waiting di[1]",
+ "log": "W2_60_IOWaitPulse paused",
+ "reports": "W2-JOB-latest report",
+ "storage": "localStorage h0/n0/w0/e2 OPFS blocked: SecurityError",
+ "joints": "[0.12, 0.03, -0.08, 0, 0.02, 0]",
+ "tcp": "pos [0.384, 0, 0.63] q [0, 0.707107, 0, 0.707107]",
+ "frame": "6 / 6",
+ "frameCurrent": 6,
+ "frameTotal": 6,
+ "frameRows": 4,
+ "frameTime": "t=0.24 / 0.24 s, step=0.05 s, source 4/4 (4 trajectory frames)",
+ "parser": "parsed 23 lines, 4 frames",
+ "parserProgress": 1,
+ "stepStatus": "11/12 Path Point line 8 t=0.24 s",
+ "stepRows": 12,
+ "activeStepRows": 1,
+ "activeStepText": "110-0.24 s8Path Pointpoint p0 movej homeMOVEJ / home1-6 @50ms",
+ "programOptions": [
+ "W2_60_IOWaitPulse"
+ ],
+ "running": false,
+ "playbackTime": 0.24,
+ "samplePeriodSec": 0.05,
+ "sampleIndex": 5,
+ "sourceFrameIndex": 3,
+ "sourceFrameTotal": 4,
+ "storageState": {
+ "mode": "localStorage",
+ "hits": 0,
+ "network": 0,
+ "writes": 0,
+ "errors": 2,
+ "last": "OPFS blocked: SecurityError"
+ },
+ "parseStream": {
+ "active": false,
+ "timer": false,
+ "programId": "W2_60_IOWaitPulse",
+ "cursorLine": 23,
+ "totalLines": 23,
+ "linesPerTick": 1,
+ "startedAt": 289.2000000476837,
+ "completedProgramId": "W2_60_IOWaitPulse",
+ "lastSummary": "parsed 23 lines, 4 frames"
+ },
+ "errors": []
+ },
+ "afterStep": {
+ "title": "ABB120 Virtual Controller",
+ "state": "paused",
+ "program": "W2_60_IOWaitPulse",
+ "wait": "waiting di[1]",
+ "log": "W2_60_IOWaitPulse stepped sample 6 t=0.24s",
+ "reports": "W2-JOB-latest report",
+ "storage": "localStorage h0/n0/w0/e2 OPFS blocked: SecurityError",
+ "joints": "[0.12, 0.03, -0.08, 0, 0.02, 0]",
+ "tcp": "pos [0.384, 0, 0.63] q [0, 0.707107, 0, 0.707107]",
+ "frame": "6 / 6",
+ "frameCurrent": 6,
+ "frameTotal": 6,
+ "frameRows": 4,
+ "frameTime": "t=0.24 / 0.24 s, step=0.05 s, source 4/4 (4 trajectory frames)",
+ "parser": "parsed 23 lines, 4 frames",
+ "parserProgress": 1,
+ "stepStatus": "11/12 Path Point line 8 t=0.24 s",
+ "stepRows": 12,
+ "activeStepRows": 1,
+ "activeStepText": "110-0.24 s8Path Pointpoint p0 movej homeMOVEJ / home1-6 @50ms",
+ "programOptions": [
+ "W2_60_IOWaitPulse"
+ ],
+ "running": false,
+ "playbackTime": 0.24,
+ "samplePeriodSec": 0.05,
+ "sampleIndex": 5,
+ "sourceFrameIndex": 3,
+ "sourceFrameTotal": 4,
+ "storageState": {
+ "mode": "localStorage",
+ "hits": 0,
+ "network": 0,
+ "writes": 0,
+ "errors": 2,
+ "last": "OPFS blocked: SecurityError"
+ },
+ "parseStream": {
+ "active": false,
+ "timer": false,
+ "programId": "W2_60_IOWaitPulse",
+ "cursorLine": 23,
+ "totalLines": 23,
+ "linesPerTick": 1,
+ "startedAt": 289.2000000476837,
+ "completedProgramId": "W2_60_IOWaitPulse",
+ "lastSummary": "parsed 23 lines, 4 frames"
+ },
+ "errors": []
+ },
+ "afterStop": {
+ "title": "ABB120 Virtual Controller",
+ "state": "stopped",
+ "program": "W2_60_IOWaitPulse",
+ "wait": "none",
+ "log": "W2_60_IOWaitPulse stopped",
+ "reports": "W2-JOB-latest report",
+ "storage": "localStorage h0/n0/w0/e2 OPFS blocked: SecurityError",
+ "joints": "[0.12, 0.03, -0.08, 0, 0.02, 0]",
+ "tcp": "pos [0.384, 0, 0.63] q [0, 0.707107, 0, 0.707107]",
+ "frame": "6 / 6",
+ "frameCurrent": 6,
+ "frameTotal": 6,
+ "frameRows": 4,
+ "frameTime": "t=0.24 / 0.24 s, step=0.05 s, source 4/4 (4 trajectory frames)",
+ "parser": "parsed 23 lines, 4 frames",
+ "parserProgress": 1,
+ "stepStatus": "11/12 Path Point line 8 t=0.24 s",
+ "stepRows": 12,
+ "activeStepRows": 1,
+ "activeStepText": "110-0.24 s8Path Pointpoint p0 movej homeMOVEJ / home1-6 @50ms",
+ "programOptions": [
+ "W2_60_IOWaitPulse"
+ ],
+ "running": false,
+ "playbackTime": 0.24,
+ "samplePeriodSec": 0.05,
+ "sampleIndex": 5,
+ "sourceFrameIndex": 3,
+ "sourceFrameTotal": 4,
+ "storageState": {
+ "mode": "localStorage",
+ "hits": 0,
+ "network": 0,
+ "writes": 0,
+ "errors": 2,
+ "last": "OPFS blocked: SecurityError"
+ },
+ "parseStream": {
+ "active": false,
+ "timer": false,
+ "programId": "W2_60_IOWaitPulse",
+ "cursorLine": 23,
+ "totalLines": 23,
+ "linesPerTick": 1,
+ "startedAt": 289.2000000476837,
+ "completedProgramId": "W2_60_IOWaitPulse",
+ "lastSummary": "parsed 23 lines, 4 frames"
+ },
+ "errors": []
+ },
+ "afterReset": {
+ "title": "ABB120 Virtual Controller",
+ "state": "ready",
+ "program": "W2_60_IOWaitPulse",
+ "wait": "none",
+ "log": "controller reset",
+ "reports": "W2-JOB-latest report",
+ "storage": "localStorage h0/n0/w0/e2 OPFS blocked: SecurityError",
+ "joints": "[0, 0, 0, 0, 0, 0]",
+ "tcp": "pos [0.374, 0, 0.63] q [0, 0.707107, 0, 0.707107]",
+ "frame": "1 / 6",
+ "frameCurrent": 1,
+ "frameTotal": 6,
+ "frameRows": 4,
+ "frameTime": "t=0 / 0.24 s, step=0.05 s, source 1/4 (4 trajectory frames)",
+ "parser": "parsed 23 lines, 4 frames",
+ "parserProgress": 1,
+ "stepStatus": "11/12 Path Point line 8 t=0 s",
+ "stepRows": 12,
+ "activeStepRows": 1,
+ "activeStepText": "110-0.24 s8Path Pointpoint p0 movej homeMOVEJ / home1-6 @50ms",
+ "programOptions": [
+ "W2_60_IOWaitPulse"
+ ],
+ "running": false,
+ "playbackTime": 0,
+ "samplePeriodSec": 0.05,
+ "sampleIndex": 0,
+ "sourceFrameIndex": 0,
+ "sourceFrameTotal": 4,
+ "storageState": {
+ "mode": "localStorage",
+ "hits": 0,
+ "network": 0,
+ "writes": 0,
+ "errors": 2,
+ "last": "OPFS blocked: SecurityError"
+ },
+ "parseStream": {
+ "active": false,
+ "timer": false,
+ "programId": "W2_60_IOWaitPulse",
+ "cursorLine": 23,
+ "totalLines": 23,
+ "linesPerTick": 1,
+ "startedAt": 289.2000000476837,
+ "completedProgramId": "W2_60_IOWaitPulse",
+ "lastSummary": "parsed 23 lines, 4 frames"
+ },
+ "errors": []
+ },
+ "afterExport": {
+ "title": "ABB120 Virtual Controller",
+ "state": "ready",
+ "program": "W2_60_IOWaitPulse",
+ "wait": "none",
+ "log": "delivery package exported",
+ "reports": "W2-JOB-latest report exported",
+ "storage": "localStorage h0/n0/w0/e2 OPFS blocked: SecurityError",
+ "joints": "[0, 0, 0, 0, 0, 0]",
+ "tcp": "pos [0.374, 0, 0.63] q [0, 0.707107, 0, 0.707107]",
+ "frame": "1 / 6",
+ "frameCurrent": 1,
+ "frameTotal": 6,
+ "frameRows": 4,
+ "frameTime": "t=0 / 0.24 s, step=0.05 s, source 1/4 (4 trajectory frames)",
+ "parser": "parsed 23 lines, 4 frames",
+ "parserProgress": 1,
+ "stepStatus": "11/12 Path Point line 8 t=0 s",
+ "stepRows": 12,
+ "activeStepRows": 1,
+ "activeStepText": "110-0.24 s8Path Pointpoint p0 movej homeMOVEJ / home1-6 @50ms",
+ "programOptions": [
+ "W2_60_IOWaitPulse"
+ ],
+ "running": false,
+ "playbackTime": 0,
+ "samplePeriodSec": 0.05,
+ "sampleIndex": 0,
+ "sourceFrameIndex": 0,
+ "sourceFrameTotal": 4,
+ "storageState": {
+ "mode": "localStorage",
+ "hits": 0,
+ "network": 0,
+ "writes": 0,
+ "errors": 2,
+ "last": "OPFS blocked: SecurityError"
+ },
+ "parseStream": {
+ "active": false,
+ "timer": false,
+ "programId": "W2_60_IOWaitPulse",
+ "cursorLine": 23,
+ "totalLines": 23,
+ "linesPerTick": 1,
+ "startedAt": 289.2000000476837,
+ "completedProgramId": "W2_60_IOWaitPulse",
+ "lastSummary": "parsed 23 lines, 4 frames"
+ },
+ "errors": []
+ },
+ "afterProgramSwitch": {
+ "title": "ABB120 Virtual Controller",
+ "state": "ready",
+ "program": "W2_60_IOWaitPulse",
+ "wait": "none",
+ "log": "delivery package exported",
+ "reports": "W2-JOB-latest report exported",
+ "storage": "localStorage h0/n0/w0/e2 OPFS blocked: SecurityError",
+ "joints": "[0, 0, 0, 0, 0, 0]",
+ "tcp": "pos [0.374, 0, 0.63] q [0, 0.707107, 0, 0.707107]",
+ "frame": "1 / 6",
+ "frameCurrent": 1,
+ "frameTotal": 6,
+ "frameRows": 4,
+ "frameTime": "t=0 / 0.24 s, step=0.05 s, source 1/4 (4 trajectory frames)",
+ "parser": "parsed 23 lines, 4 frames",
+ "parserProgress": 1,
+ "stepStatus": "11/12 Path Point line 8 t=0 s",
+ "stepRows": 12,
+ "activeStepRows": 1,
+ "activeStepText": "110-0.24 s8Path Pointpoint p0 movej homeMOVEJ / home1-6 @50ms",
+ "programOptions": [
+ "W2_60_IOWaitPulse"
+ ],
+ "running": false,
+ "playbackTime": 0,
+ "samplePeriodSec": 0.05,
+ "sampleIndex": 0,
+ "sourceFrameIndex": 0,
+ "sourceFrameTotal": 4,
+ "storageState": {
+ "mode": "localStorage",
+ "hits": 0,
+ "network": 0,
+ "writes": 0,
+ "errors": 2,
+ "last": "OPFS blocked: SecurityError"
+ },
+ "parseStream": {
+ "active": false,
+ "timer": false,
+ "programId": "W2_60_IOWaitPulse",
+ "cursorLine": 23,
+ "totalLines": 23,
+ "linesPerTick": 1,
+ "startedAt": 289.2000000476837,
+ "completedProgramId": "W2_60_IOWaitPulse",
+ "lastSummary": "parsed 23 lines, 4 frames"
+ },
+ "errors": []
+ },
+ "offlineCache": {
+ "skipped": true,
+ "reason": "local file target does not require network-offline cache proof"
+ }
+}
diff --git a/kdl-wasm/web/test-results/virtual-controller/evidence.json b/kdl-wasm/web/test-results/virtual-controller/evidence.json
index cbea4b1..5bee86f 100644
--- a/kdl-wasm/web/test-results/virtual-controller/evidence.json
+++ b/kdl-wasm/web/test-results/virtual-controller/evidence.json
@@ -9,10 +9,11 @@
"mobile": false
},
"screenshot": "E:\\Work\\kdl_work\\kdl-wasm\\web\\test-results\\virtual-controller\\virtual-controller-desktop.png",
- "screenshotBytes": 45666,
+ "screenshotBytes": 50362,
"state": "running",
+ "parser": "parsed 23 lines, 4 frames",
"wait": "satisfied",
- "trace": "4 events",
+ "trace": "16 events",
"visiblePanels": [
".command-bar",
".object-tree",
@@ -30,10 +31,11 @@
"mobile": true
},
"screenshot": "E:\\Work\\kdl_work\\kdl-wasm\\web\\test-results\\virtual-controller\\virtual-controller-mobile.png",
- "screenshotBytes": 44869,
+ "screenshotBytes": 40557,
"state": "running",
+ "parser": "parsed 23 lines, 4 frames",
"wait": "satisfied",
- "trace": "4 events",
+ "trace": "16 events",
"visiblePanels": [
".command-bar",
".object-tree",
diff --git a/kdl-wasm/web/test-results/virtual-controller/virtual-controller-desktop.png b/kdl-wasm/web/test-results/virtual-controller/virtual-controller-desktop.png
index 577ad5c..f596971 100644
Binary files a/kdl-wasm/web/test-results/virtual-controller/virtual-controller-desktop.png and b/kdl-wasm/web/test-results/virtual-controller/virtual-controller-desktop.png differ
diff --git a/kdl-wasm/web/test-results/virtual-controller/virtual-controller-mobile.png b/kdl-wasm/web/test-results/virtual-controller/virtual-controller-mobile.png
index a9b908d..15a28d9 100644
Binary files a/kdl-wasm/web/test-results/virtual-controller/virtual-controller-mobile.png and b/kdl-wasm/web/test-results/virtual-controller/virtual-controller-mobile.png differ
diff --git a/kdl-wasm/web/tests/fixtures/abb120/spec-programs/error/W2_E30_MotionDiagnostics.grl b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/error/W2_E30_MotionDiagnostics.grl
new file mode 100644
index 0000000..88a8997
--- /dev/null
+++ b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/error/W2_E30_MotionDiagnostics.grl
@@ -0,0 +1,19 @@
+language grl 0.1
+module W2MotionDiagnostics
+ const speed v = joint(30 %)
+ const speed vl = linear(100 mm/s)
+ const zone zf = fine
+ target too_far_joint = joint_target { joints: [220 deg, 0 deg, 0 deg, 0 deg, 0 deg, 0 deg] }
+ target unreachable_pose = pose_target { pose: pose(2000 mm, 0 mm, 2000 mm, 0 deg, 0 deg, 0 deg) }
+ target arc_a = pose_target { pose: pose(500 mm, 0 mm, 0 mm, 0 deg, 0 deg, 0 deg) }
+ target arc_b = pose_target { pose: pose(550 mm, 0 mm, 0 mm, 0 deg, 0 deg, 0 deg) }
+ target arc_c = pose_target { pose: pose(600 mm, 0 mm, 0 mm, 0 deg, 0 deg, 0 deg) }
+ path empty_path {
+ }
+ proc main()
+ movej too_far_joint speed v zone zf
+ movel unreachable_pose speed vl zone zf
+ movec via arc_b target arc_c speed vl zone zf
+ run_path empty_path
+ end
+end
diff --git a/kdl-wasm/web/tests/fixtures/abb120/spec-programs/error/W2_E50_RuntimeTimeout.grl b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/error/W2_E50_RuntimeTimeout.grl
new file mode 100644
index 0000000..35857d6
--- /dev/null
+++ b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/error/W2_E50_RuntimeTimeout.grl
@@ -0,0 +1,14 @@
+language grl 0.1
+module W2RuntimeTimeout
+ const speed v = joint(30 %)
+ const zone zf = fine
+ target home = joint_target { joints: [0 deg, 0 deg, 0 deg, 0 deg, 0 deg, 0 deg] }
+ proc on_timeout_recover()
+ alarm TIMEOUT_RECOVER "timeout recover" severity warning
+ end
+ proc main()
+ wait io.di[99] == true timeout 100 ms on_timeout alarm "DI99 timeout"
+ wait io.di[98] == true timeout 100 ms on_timeout call on_timeout_recover()
+ movej home speed v zone zf
+ end
+end
diff --git a/kdl-wasm/web/tests/fixtures/abb120/spec-programs/manifest.json b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/manifest.json
new file mode 100644
index 0000000..4100f0d
--- /dev/null
+++ b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/manifest.json
@@ -0,0 +1,52 @@
+{
+ "suite_id": "working2-abb120-spec",
+ "robot_id": "abb_irb120_3_58",
+ "spec_source": "work/doc/通用机器人编程语法规范.md",
+ "program_root": "kdl-wasm/web/tests/fixtures/abb120/spec-programs",
+ "runtime_commands": ["loadProgram", "start", "stepInto", "hold", "resume", "stepMotion", "stop", "resetFault"],
+ "programs": [
+ { "program_id": "W2_00_MinimalModule", "file": "runtime/W2_00_MinimalModule.grl", "coverage_level": "Runtime", "spec_sections": [4, 5, 6, 9, 10, 23], "expected_status": "pass", "expected_diagnostics": [] },
+ { "program_id": "W2_10_DataTargetToolFrame", "file": "runtime/W2_10_DataTargetToolFrame.grl", "coverage_level": "Runtime", "spec_sections": [6, 8, 9], "expected_status": "pass", "expected_diagnostics": [] },
+ { "program_id": "W2_20_ExpressionMath", "file": "runtime/W2_20_ExpressionMath.grl", "coverage_level": "Runtime", "spec_sections": [7, 9, 13], "expected_status": "pass", "expected_diagnostics": [] },
+ { "program_id": "W2_30_MotionAllTypes", "file": "runtime/W2_30_MotionAllTypes.grl", "coverage_level": "Runtime", "spec_sections": [8, 9, 10], "expected_status": "pass", "expected_diagnostics": [] },
+ { "program_id": "W2_40_PathEvents", "file": "runtime/W2_40_PathEvents.grl", "coverage_level": "Runtime", "spec_sections": [11, 13, 19], "expected_status": "pass", "expected_diagnostics": [] },
+ { "program_id": "W2_50_OperationProcess", "file": "runtime/W2_50_OperationProcess.grl", "coverage_level": "Runtime", "spec_sections": [12, 13], "expected_status": "pass", "expected_diagnostics": [] },
+ { "program_id": "W2_60_IOWaitPulse", "file": "runtime/W2_60_IOWaitPulse.grl", "coverage_level": "Runtime", "spec_sections": [13], "expected_status": "pass", "expected_diagnostics": [] },
+ { "program_id": "W2_70_ControlFlow", "file": "runtime/W2_70_ControlFlow.grl", "coverage_level": "Runtime", "spec_sections": [14], "expected_status": "pass", "expected_diagnostics": [] },
+ { "program_id": "W2_80_ProcFuncCall", "file": "runtime/W2_80_ProcFuncCall.grl", "coverage_level": "Runtime", "spec_sections": [15], "expected_status": "pass", "expected_diagnostics": [] },
+ { "program_id": "W2_90_ExceptionAlarm", "file": "runtime/W2_90_ExceptionAlarm.grl", "coverage_level": "Runtime", "spec_sections": [16, 17], "expected_status": "pass", "expected_diagnostics": ["GRL_P1_UNIMPLEMENTED"] },
+ { "program_id": "W2_99_FullSpecExample", "file": "runtime/W2_99_FullSpecExample.grl", "coverage_level": "Runtime", "spec_sections": [24], "expected_status": "pass", "expected_diagnostics": [] },
+ { "program_id": "W2_E10_ExpressionDiagnostics", "file": "static/W2_E10_ExpressionDiagnostics.grl", "coverage_level": "Static", "spec_sections": [7, 22], "expected_status": "diagnostic", "expected_diagnostics": ["GRL_EXPR_UNKNOWN_SYMBOL", "GRL_EXPR_UNKNOWN_FUNCTION", "GRL_EXPR_ARITY", "GRL_EXPR_DOMAIN", "GRL_EXPR_DIV_ZERO", "GRL_EXPR_UNIT_MISMATCH"] },
+ { "program_id": "W2_E20_SemanticDiagnostics", "file": "static/W2_E20_SemanticDiagnostics.grl", "coverage_level": "Static", "spec_sections": [6, 15, 22], "expected_status": "diagnostic", "expected_diagnostics": ["GRL_SYMBOL_DUPLICATE", "GRL_ARGUMENT_NOT_LVALUE", "GRL_CALL_TARGET_NOT_FOUND", "GRL_FUNC_SIDE_EFFECT", "GRL_TARGET_NOT_FOUND"] },
+ { "program_id": "W2_E30_MotionDiagnostics", "file": "error/W2_E30_MotionDiagnostics.grl", "coverage_level": "Static", "spec_sections": [8, 9, 10, 11, 22], "expected_status": "diagnostic", "expected_diagnostics": ["KDL_JOINT_LIMIT", "KDL_TARGET_UNREACHABLE", "GRL_PATH_EMPTY"] },
+ { "program_id": "W2_E40_ControlFlowDiagnostics", "file": "static/W2_E40_ControlFlowDiagnostics.grl", "coverage_level": "Static", "spec_sections": [14, 22], "expected_status": "diagnostic", "expected_diagnostics": ["GRL_BREAK_OUTSIDE_FLOW", "GRL_CONTINUE_OUTSIDE_LOOP", "GRL_JUMP_INTO_BLOCK", "GRL_SWITCH_CASE_DUPLICATE", "GRL_SWITCH_CASE_NOT_CONSTANT", "GRL_LABEL_NOT_FOUND"] },
+ { "program_id": "W2_E50_RuntimeTimeout", "file": "error/W2_E50_RuntimeTimeout.grl", "coverage_level": "Runtime", "spec_sections": [13, 16], "expected_status": "diagnostic", "expected_diagnostics": ["VC_WAIT_TIMEOUT"] },
+ { "program_id": "W2_P10_BrandHints", "file": "post/W2_P10_BrandHints.grl", "coverage_level": "Post", "spec_sections": [18, 20], "expected_status": "pass", "expected_diagnostics": ["GRL_POST_HINT_IGNORED"] },
+ { "program_id": "W2_P20_CrossBrandMotion", "file": "post/W2_P20_CrossBrandMotion.grl", "coverage_level": "Post", "spec_sections": [20], "expected_status": "pass", "expected_diagnostics": [] },
+ { "program_id": "W2_P30_Roundtrip", "file": "post/W2_P30_Roundtrip.grl", "coverage_level": "Post", "spec_sections": [19, 20, 21], "expected_status": "pass", "expected_diagnostics": [] }
+ ],
+ "coverage_matrix": [
+ { "spec_section": 4, "coverage_level": "Runtime/Static", "program_ids": ["W2_00_MinimalModule"] },
+ { "spec_section": 5, "coverage_level": "Runtime", "program_ids": ["W2_00_MinimalModule"] },
+ { "spec_section": 6, "coverage_level": "Runtime/Static", "program_ids": ["W2_10_DataTargetToolFrame", "W2_E20_SemanticDiagnostics"] },
+ { "spec_section": 7, "coverage_level": "Runtime/Static/Post", "program_ids": ["W2_20_ExpressionMath", "W2_E10_ExpressionDiagnostics", "W2_P20_CrossBrandMotion"] },
+ { "spec_section": 8, "coverage_level": "Runtime/Static", "program_ids": ["W2_10_DataTargetToolFrame", "W2_E30_MotionDiagnostics"] },
+ { "spec_section": 9, "coverage_level": "Runtime/Post", "program_ids": ["W2_20_ExpressionMath", "W2_30_MotionAllTypes", "W2_P20_CrossBrandMotion"] },
+ { "spec_section": 10, "coverage_level": "Runtime/Static/Post", "program_ids": ["W2_30_MotionAllTypes", "W2_E30_MotionDiagnostics", "W2_P20_CrossBrandMotion"] },
+ { "spec_section": 11, "coverage_level": "Runtime/Static", "program_ids": ["W2_40_PathEvents", "W2_E30_MotionDiagnostics"] },
+ { "spec_section": 12, "coverage_level": "Runtime/Post", "program_ids": ["W2_50_OperationProcess", "W2_P30_Roundtrip"] },
+ { "spec_section": 13, "coverage_level": "Runtime", "program_ids": ["W2_60_IOWaitPulse", "W2_E50_RuntimeTimeout"] },
+ { "spec_section": 14, "coverage_level": "Runtime/Static", "program_ids": ["W2_70_ControlFlow", "W2_E40_ControlFlowDiagnostics"] },
+ { "spec_section": 15, "coverage_level": "Runtime/Static", "program_ids": ["W2_80_ProcFuncCall", "W2_E20_SemanticDiagnostics"] },
+ { "spec_section": 16, "coverage_level": "Runtime/Static", "program_ids": ["W2_90_ExceptionAlarm", "W2_E50_RuntimeTimeout"] },
+ { "spec_section": 17, "coverage_level": "Runtime/Static", "program_ids": ["W2_90_ExceptionAlarm"] },
+ { "spec_section": 18, "coverage_level": "Post", "program_ids": ["W2_P10_BrandHints"] },
+ { "spec_section": 19, "coverage_level": "Post", "program_ids": ["W2_P30_Roundtrip"] },
+ { "spec_section": 20, "coverage_level": "Post", "program_ids": ["W2_P20_CrossBrandMotion"] },
+ { "spec_section": 21, "coverage_level": "Runtime/Static", "program_ids": ["W2_00_MinimalModule", "W2_E10_ExpressionDiagnostics"] },
+ { "spec_section": 22, "coverage_level": "Runtime/Static", "program_ids": ["W2_E10_ExpressionDiagnostics", "W2_E20_SemanticDiagnostics", "W2_E30_MotionDiagnostics", "W2_E40_ControlFlowDiagnostics", "W2_E50_RuntimeTimeout"] },
+ { "spec_section": 23, "coverage_level": "Runtime/Static", "program_ids": ["W2_00_MinimalModule"] },
+ { "spec_section": 24, "coverage_level": "Runtime/Post", "program_ids": ["W2_99_FullSpecExample", "W2_P30_Roundtrip"] },
+ { "spec_section": 25, "coverage_level": "Runtime/Static/Post", "program_ids": ["W2_00_MinimalModule", "W2_10_DataTargetToolFrame", "W2_20_ExpressionMath", "W2_30_MotionAllTypes", "W2_40_PathEvents", "W2_50_OperationProcess", "W2_60_IOWaitPulse", "W2_70_ControlFlow", "W2_80_ProcFuncCall", "W2_90_ExceptionAlarm", "W2_P20_CrossBrandMotion"] }
+ ]
+}
diff --git a/kdl-wasm/web/tests/fixtures/abb120/spec-programs/post/W2_P10_BrandHints.grl b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/post/W2_P10_BrandHints.grl
new file mode 100644
index 0000000..05b4e61
--- /dev/null
+++ b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/post/W2_P10_BrandHints.grl
@@ -0,0 +1,12 @@
+language grl 0.1
+module W2BrandHints
+ post_hint abb
+ post_hint fanuc
+ post_hint kuka
+ const speed v = joint(40 %)
+ const zone zf = fine
+ target home = joint_target { joints: [0 deg, 0 deg, 0 deg, 0 deg, 0 deg, 0 deg] }
+ proc main()
+ movej home speed v zone zf
+ end
+end
diff --git a/kdl-wasm/web/tests/fixtures/abb120/spec-programs/post/W2_P20_CrossBrandMotion.grl b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/post/W2_P20_CrossBrandMotion.grl
new file mode 100644
index 0000000..3a08fb5
--- /dev/null
+++ b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/post/W2_P20_CrossBrandMotion.grl
@@ -0,0 +1,20 @@
+language grl 0.1
+module W2CrossBrandMotion
+ post_hint abb
+ const speed vj = joint(50 %)
+ const speed vl = linear(200 mm/s)
+ const zone z10 = z(10 mm)
+ const zone zcnt = cnt(50)
+ target home = joint_target { joints: [0 deg, 0 deg, 0 deg, 0 deg, 0 deg, 0 deg] }
+ target pick = pose_target { pose: pose(500 mm, 0 mm, 0 mm, 0 deg, 0 deg, 0 deg) }
+ target mid = pose_target { pose: pose(550 mm, 50 mm, 0 mm, 0 deg, 0 deg, 0 deg) }
+ target place = pose_target { pose: pose(600 mm, 0 mm, 0 mm, 0 deg, 0 deg, 0 deg) }
+ proc main()
+ movej home speed vj zone fine
+ movel pick speed vl zone z10
+ movec via mid target place speed vl zone zcnt
+ io.do[1] = true
+ wait io.di[1] == true timeout 1 s
+ pulse io.do[2] duration 100 ms
+ end
+end
diff --git a/kdl-wasm/web/tests/fixtures/abb120/spec-programs/post/W2_P30_Roundtrip.grl b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/post/W2_P30_Roundtrip.grl
new file mode 100644
index 0000000..86dfdfc
--- /dev/null
+++ b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/post/W2_P30_Roundtrip.grl
@@ -0,0 +1,24 @@
+language grl 0.1
+module W2Roundtrip
+ const speed vj = joint(40 %)
+ const speed vl = linear(150 mm/s)
+ const zone z10 = z(10 mm)
+ target home = joint_target { joints: [0 deg, 0 deg, 0 deg, 0 deg, 0 deg, 0 deg] }
+ target pick = pose_target { pose: pose(500 mm, 0 mm, 0 mm, 0 deg, 0 deg, 0 deg) }
+ path roundtrip_path {
+ defaults { speed: vj, zone: z10 }
+ point p0 movej home zone fine
+ point p1 movel pick speed vl zone z10
+ }
+ operation roundtrip_op {
+ kind: handling
+ path: roundtrip_path
+ process {
+ generator: "working2"
+ }
+ }
+ proc main()
+ run_operation roundtrip_op
+ movej home speed vj zone fine
+ end
+end
diff --git a/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_00_MinimalModule.grl b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_00_MinimalModule.grl
new file mode 100644
index 0000000..da402bf
--- /dev/null
+++ b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_00_MinimalModule.grl
@@ -0,0 +1,9 @@
+language grl 0.1
+module W2MinimalModule
+ const speed v_joint = joint(40 %)
+ const zone zf = fine
+ target home = joint_target { joints: [0 deg, 0 deg, 0 deg, 0 deg, 0 deg, 0 deg] }
+ proc main()
+ movej home speed v_joint zone zf
+ end
+end
diff --git a/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_10_DataTargetToolFrame.grl b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_10_DataTargetToolFrame.grl
new file mode 100644
index 0000000..2251aca
--- /dev/null
+++ b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_10_DataTargetToolFrame.grl
@@ -0,0 +1,45 @@
+language grl 0.1
+module W2DataTargetToolFrame
+ persistent tool gripper = tool {
+ tcp: pose(0 mm, 0 mm, 100 mm, 0 deg, 0 deg, 0 deg),
+ mass: 1.25 kg,
+ cog: [0 mm, 0 mm, 40 mm]
+ }
+ persistent frame fixture = frame { origin: pose(800 mm, 0 mm, 0 mm, 0 deg, 0 deg, 0 deg) }
+ const bool use_fixture = true
+ const int slot_count = 2
+ const real blend_scale = 1.5
+ const string recipe = "w2"
+ const time settle = 250 ms
+ const length lift = 80 mm
+ const angle face = 90 deg
+ const percent safe_percent = 40 %
+ const speed vj = joint(safe_percent)
+ const speed vl = linear(120 mm/s)
+ const zone z5 = z(5 mm)
+ const pose safe_pose = pose(500 mm, 0 mm, 100 mm, 0 deg, 0 deg, face)
+ target home = joint_target { joints: [0 deg, 0 deg, 0 deg, 0 deg, 0 deg, 0 deg] }
+ target approach = joint_target {
+ joints: [0 deg, -22.918312 deg, 28.647890 deg, 0 deg, 11.459156 deg, 0 deg]
+ }
+ target pick = pose_target {
+ pose: pose(500 mm, 0 mm, 0 mm, 0 deg, 0 deg, 90 deg),
+ config: robot_config(0, 0, 1),
+ tool: gripper,
+ frame: fixture
+ }
+ target pick_q = pose_target {
+ pose: poseq(500 mm, 30 mm, 0 mm, 0, 0, 0, 1),
+ tool: gripper,
+ frame: fixture
+ }
+ proc main()
+ set_tool gripper
+ set_frame fixture
+ set_speed vl
+ set_zone z5
+ movej home speed vj zone fine
+ movej approach speed vj zone z5 tool gripper frame fixture
+ movel pick_q speed vl zone z5 tool gripper frame fixture
+ end
+end
diff --git a/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_20_ExpressionMath.grl b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_20_ExpressionMath.grl
new file mode 100644
index 0000000..221f436
--- /dev/null
+++ b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_20_ExpressionMath.grl
@@ -0,0 +1,20 @@
+language grl 0.1
+module W2ExpressionMath
+ const real blend_base = 5 + 5
+ const real trig_value = sin(30 deg)
+ const bool math_ok = (10 mm + 5 mm) > 12 mm and not false
+ const speed v_pick = linear(100 + 50 mm/s)
+ const speed v_safe = linear(max(50 mm/s, 200 mm/s / 2))
+ const zone z_app = z(clamp(blend_base mm, 1 mm, 50 mm))
+ target home = joint_target {
+ joints: [0 deg, (10 + 5) deg, -30 deg, 0 deg, abs(-15) deg, round(pi) deg]
+ }
+ target pick = pose_target {
+ pose: pose(400 + 50 mm, 20 * 2 mm, sqrt(90000) mm, 0 deg, 0 deg, atan2(1, 1))
+ }
+ proc main()
+ movej home speed v_safe zone z_app
+ movel pick speed v_pick zone z_app
+ wait io.ai[2] > 0.5 timeout 1 + 1 s
+ end
+end
diff --git a/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_30_MotionAllTypes.grl b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_30_MotionAllTypes.grl
new file mode 100644
index 0000000..c7c65f7
--- /dev/null
+++ b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_30_MotionAllTypes.grl
@@ -0,0 +1,21 @@
+language grl 0.1
+module W2MotionAllTypes
+ persistent tool gripper = tool { tcp: pose(0 mm, 0 mm, 80 mm, 0 deg, 0 deg, 0 deg), mass: 1 kg }
+ persistent frame fixture = frame { origin: pose(800 mm, 0 mm, 0 mm, 0 deg, 0 deg, 0 deg) }
+ const speed vj = joint(45 %)
+ const speed vl = linear(150 mm/s)
+ const zone z10 = z(10 mm)
+ target home = joint_target { joints: [0 deg, 0 deg, 0 deg, 0 deg, 0 deg, 0 deg] }
+ target start = pose_target { pose: pose(500 mm, 0 mm, 0 mm, 0 deg, 0 deg, 0 deg), tool: gripper, frame: fixture }
+ target mid = pose_target { pose: pose(550 mm, 50 mm, 0 mm, 0 deg, 0 deg, 0 deg), tool: gripper, frame: fixture }
+ target finish = pose_target { pose: pose(600 mm, 0 mm, 0 mm, 0 deg, 0 deg, 0 deg), tool: gripper, frame: fixture }
+ proc main()
+ set_tool gripper
+ set_frame fixture
+ set_speed vl
+ set_zone z10
+ movej home speed vj zone fine
+ movel start
+ movec via mid target finish speed linear(100 mm/s) zone fine
+ end
+end
diff --git a/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_40_PathEvents.grl b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_40_PathEvents.grl
new file mode 100644
index 0000000..d6cdae7
--- /dev/null
+++ b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_40_PathEvents.grl
@@ -0,0 +1,26 @@
+language grl 0.1
+module W2PathEvents
+ const speed vj = joint(35 %)
+ const speed vl = linear(120 mm/s)
+ const zone z10 = z(10 mm)
+ target home = joint_target { joints: [0 deg, 0 deg, 0 deg, 0 deg, 0 deg, 0 deg] }
+ target pick = joint_target { joints: [11.459156 deg, -20.053523 deg, 25.783101 deg, 5.729578 deg, -11.459156 deg, 17.188734 deg] }
+ target place = joint_target { joints: [-20.053523 deg, -14.323945 deg, 20.053523 deg, -14.323945 deg, 8.594367 deg, -22.918312 deg] }
+ path generated_path {
+ source {
+ type: "cad_curve",
+ id: "edge_032",
+ sample_distance: 5 mm
+ }
+ defaults { speed: vj, zone: z10 }
+ point p_home movej home zone fine
+ event before p_pick io.do[10] = true
+ point p_pick movej pick speed vj
+ event after p_pick wait io.di[10] == true timeout 2 s on_timeout alarm "pick sensor timeout"
+ point p_place movej place speed vj
+ event at p_place distance 10 mm pulse io.do[11] duration 100 ms
+ }
+ proc main()
+ run_path generated_path
+ end
+end
diff --git a/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_50_OperationProcess.grl b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_50_OperationProcess.grl
new file mode 100644
index 0000000..4176661
--- /dev/null
+++ b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_50_OperationProcess.grl
@@ -0,0 +1,26 @@
+language grl 0.1
+module W2OperationProcess
+ const speed v = joint(35 %)
+ const zone zf = fine
+ target home = joint_target { joints: [0 deg, 0 deg, 0 deg, 0 deg, 0 deg, 0 deg] }
+ path op_path {
+ defaults { speed: v, zone: zf }
+ point p0 movej home
+ }
+ operation pick_op {
+ kind: handling
+ path: op_path
+ process {
+ gripper: "main_clamp",
+ dwell_ms: 50 + 50 ms,
+ clamp_force: max(20, 10)
+ }
+ start_action:
+ io.do[1] = true
+ end_action:
+ io.do[1] = false
+ }
+ proc main()
+ run_operation pick_op
+ end
+end
diff --git a/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_60_IOWaitPulse.grl b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_60_IOWaitPulse.grl
new file mode 100644
index 0000000..368482a
--- /dev/null
+++ b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_60_IOWaitPulse.grl
@@ -0,0 +1,23 @@
+language grl 0.1
+module W2IOWaitPulse
+ const speed v = joint(35 %)
+ const zone zf = fine
+ target home = joint_target { joints: [0 deg, 0 deg, 0 deg, 0 deg, 0 deg, 0 deg] }
+ path io_path {
+ defaults { speed: v, zone: zf }
+ point p0 movej home
+ event at p0 distance 5 + 5 mm pulse io.do[20] duration 50 + 50 ms
+ }
+ proc main()
+ io.do[1] = true
+ io.ao[1] = 0.75
+ io.go[1] = 3
+ wait all(io.di[1] == true, io.di[2] == false) timeout 1 s on_timeout alarm "all timeout"
+ wait any(io.di[3] == true, io.di[4] == true) timeout 1 s
+ wait rising(io.di[5]) timeout 1 s
+ wait falling(io.di[6]) timeout 1 s
+ wait changed(io.di[7]) timeout 1 s
+ pulse io.do[2] duration 50 + 50 ms
+ run_path io_path
+ end
+end
diff --git a/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_70_ControlFlow.grl b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_70_ControlFlow.grl
new file mode 100644
index 0000000..965b51c
--- /dev/null
+++ b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_70_ControlFlow.grl
@@ -0,0 +1,35 @@
+language grl 0.1
+module W2ControlFlow
+ const speed v = joint(30 %)
+ const zone zf = fine
+ var bool ready = true
+ var bool fault = false
+ var int mode = 2
+ var int retry = 0
+ target home = joint_target { joints: [0 deg, 0 deg, 0 deg, 0 deg, 0 deg, 0 deg] }
+ proc main()
+ if ready == true
+ movej home speed v zone zf
+ elseif fault == true
+ alarm FAULT "fault"
+ else
+ alarm NOT_READY "not ready"
+ end
+ while retry < 1
+ retry = 1
+ continue
+ end
+ for i = 1 to 2 step 1
+ movej home speed v zone zf
+ end
+ switch mode
+ case 1
+ alarm MODE1 "mode 1"
+ break
+ case 2
+ movej home speed v zone zf
+ default
+ alarm MODE_OTHER "mode other"
+ end
+ end
+end
diff --git a/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_80_ProcFuncCall.grl b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_80_ProcFuncCall.grl
new file mode 100644
index 0000000..db1e5b4
--- /dev/null
+++ b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_80_ProcFuncCall.grl
@@ -0,0 +1,26 @@
+language grl 0.1
+module W2ProcFuncCall
+ const speed v = joint(30 %)
+ const zone zf = fine
+ var int global_count = 0
+ target home = joint_target { joints: [0 deg, 0 deg, 0 deg, 0 deg, 0 deg, 0 deg] }
+ proc read_part(out bool ok)
+ ok = true
+ end
+ proc increment_retry(inout int retry)
+ retry = 1
+ end
+ func bool can_run(in int retry, in int max_retry)
+ return retry < max_retry
+ end
+ proc main()
+ var bool ok = false
+ var int retry = 0
+ call read_part(ok)
+ call increment_retry(retry)
+ if retry < 3
+ movej home speed v zone zf
+ end
+ return
+ end
+end
diff --git a/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_90_ExceptionAlarm.grl b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_90_ExceptionAlarm.grl
new file mode 100644
index 0000000..c49f8e1
--- /dev/null
+++ b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_90_ExceptionAlarm.grl
@@ -0,0 +1,25 @@
+language grl 0.1
+module W2ExceptionAlarm
+ const speed v = joint(30 %)
+ const zone zf = fine
+ target home = joint_target { joints: [0 deg, 0 deg, 0 deg, 0 deg, 0 deg, 0 deg] }
+ trap recover_trap()
+ raise E_STOP
+ end
+ task background cycle 20 ms
+ alarm TASK_MONITOR "task boundary"
+ end
+ proc main()
+ alarm START "start" severity info
+ try
+ movej home speed v zone zf
+ raise E_PICK_FAILED
+ catch E_PICK_FAILED
+ alarm RECOVER "recovering" severity warning
+ finally
+ alarm CLEANUP "cleanup"
+ end
+ enable interrupt guard
+ disable interrupt guard
+ end
+end
diff --git a/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_99_FullSpecExample.grl b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_99_FullSpecExample.grl
new file mode 100644
index 0000000..8785f5d
--- /dev/null
+++ b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_99_FullSpecExample.grl
@@ -0,0 +1,80 @@
+language grl 0.1
+module W2FullSpecExample
+ persistent tool gripper = tool {
+ tcp: pose(0 mm, 0 mm, 120 mm, 0 deg, 0 deg, 0 deg),
+ mass: 1.5 kg
+ }
+ persistent frame fixture = frame {
+ origin: pose(800 mm, 0 mm, 200 mm, 0 deg, 0 deg, 0 deg)
+ }
+ const speed v_fast = joint(55 %)
+ const speed v_pick = linear(180 mm/s)
+ const zone z_pick = z(10 mm)
+ target home = joint_target {
+ joints: [0 deg, -20 deg, 40 deg, 0 deg, 30 deg, 0 deg]
+ }
+ target pick = pose_target {
+ pose: pose(500 mm, 120 mm, 300 mm, 180 deg, 0 deg, 90 deg),
+ config: robot_config(0, 0, 1),
+ tool: gripper,
+ frame: fixture
+ }
+ target place = pose_target {
+ pose: pose(650 mm, -100 mm, 320 mm, 180 deg, 0 deg, 90 deg),
+ config: robot_config(0, 0, 1),
+ tool: gripper,
+ frame: fixture
+ }
+ path pick_path {
+ source {
+ type: "generated_example",
+ id: "pick_path"
+ }
+ defaults {
+ tool: gripper,
+ frame: fixture,
+ speed: v_pick,
+ zone: z_pick
+ }
+ point approach movej home speed v_fast zone fine
+ point above_pick movel pick offset z 100 mm
+ point at_pick movel pick zone fine
+ event after at_pick io.do[1] = true
+ event after at_pick wait io.di[1] == true timeout 2 s on_timeout alarm "Clamp close timeout"
+ point leave_pick movel pick offset z 100 mm
+ }
+ path place_path {
+ defaults {
+ tool: gripper,
+ frame: fixture,
+ speed: v_pick,
+ zone: z_pick
+ }
+ point above_place movel place offset z 100 mm
+ point at_place movel place zone fine
+ event after at_place io.do[1] = false
+ event after at_place wait io.di[2] == true timeout 2 s on_timeout alarm "Clamp open timeout"
+ point leave_place movel place offset z 100 mm
+ }
+ operation pick_op {
+ kind: handling
+ path: pick_path
+ process {
+ gripper: "main_clamp"
+ }
+ }
+ operation place_op {
+ kind: handling
+ path: place_path
+ process {
+ gripper: "main_clamp"
+ }
+ }
+ proc main()
+ set_tool gripper
+ set_frame fixture
+ run_operation pick_op
+ run_operation place_op
+ movej home speed v_fast zone fine
+ end
+end
diff --git a/kdl-wasm/web/tests/fixtures/abb120/spec-programs/static/W2_E10_ExpressionDiagnostics.grl b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/static/W2_E10_ExpressionDiagnostics.grl
new file mode 100644
index 0000000..9355faa
--- /dev/null
+++ b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/static/W2_E10_ExpressionDiagnostics.grl
@@ -0,0 +1,14 @@
+language grl 0.1
+module W2ExpressionDiagnostics
+ const speed v_ok = linear(100 mm/s)
+ const speed v_unknown_symbol = linear(missing_symbol mm/s)
+ const speed v_unknown_function = linear(no_such_function(1) mm/s)
+ const speed v_bad_arity = linear(atan2(1) mm/s)
+ const speed v_domain = linear(sqrt(-1) mm/s)
+ const speed v_div_zero = linear(100 mm/s / 0)
+ const zone z_unit = z(10 mm + 1 s)
+ target home = joint_target { joints: [0 deg, 0 deg, 0 deg, 0 deg, 0 deg, 0 deg] }
+ proc main()
+ movej home speed v_ok zone fine
+ end
+end
diff --git a/kdl-wasm/web/tests/fixtures/abb120/spec-programs/static/W2_E20_SemanticDiagnostics.grl b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/static/W2_E20_SemanticDiagnostics.grl
new file mode 100644
index 0000000..7904dfc
--- /dev/null
+++ b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/static/W2_E20_SemanticDiagnostics.grl
@@ -0,0 +1,19 @@
+language grl 0.1
+module W2SemanticDiagnostics
+ const speed v = joint(30 %)
+ const speed v = joint(40 %)
+ const zone zf = fine
+ target home = joint_target { joints: [0 deg, 0 deg, 0 deg, 0 deg, 0 deg, 0 deg] }
+ proc set_done(out bool done)
+ done = true
+ end
+ func bool bad_func()
+ wait io.di[1] == true
+ return true
+ end
+ proc main()
+ call set_done(true)
+ call missing_proc()
+ movej missing_target speed v zone zf
+ end
+end
diff --git a/kdl-wasm/web/tests/fixtures/abb120/spec-programs/static/W2_E40_ControlFlowDiagnostics.grl b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/static/W2_E40_ControlFlowDiagnostics.grl
new file mode 100644
index 0000000..61b9feb
--- /dev/null
+++ b/kdl-wasm/web/tests/fixtures/abb120/spec-programs/static/W2_E40_ControlFlowDiagnostics.grl
@@ -0,0 +1,21 @@
+language grl 0.1
+module W2ControlFlowDiagnostics
+ var int mode = 1
+ proc main()
+ break
+ continue
+ jump inner
+ if mode == 1
+ label inner
+ end
+ switch mode
+ case 1
+ break
+ case 1
+ break
+ case mode + 1
+ break
+ end
+ jump missing
+ end
+end
diff --git a/kdl-wasm/web/tests/integration/abb120SpecSuite.test.ts b/kdl-wasm/web/tests/integration/abb120SpecSuite.test.ts
new file mode 100644
index 0000000..b391049
--- /dev/null
+++ b/kdl-wasm/web/tests/integration/abb120SpecSuite.test.ts
@@ -0,0 +1,132 @@
+import { readFileSync } from "node:fs";
+import { dirname, join } from "node:path";
+import { fileURLToPath } from "node:url";
+import { describe, expect, it } from "vitest";
+import {
+ runAbb120SpecSuite,
+ type Abb120SpecManifest,
+ type Abb120SpecProgramSource
+} from "../../src/suites/abb120SpecSuite.js";
+
+const WEB_ROOT = join(dirname(fileURLToPath(import.meta.url)), "../..");
+const SPEC_ROOT = join(WEB_ROOT, "tests", "fixtures", "abb120", "spec-programs");
+
+function loadManifest(): Abb120SpecManifest {
+ return JSON.parse(readFileSync(join(SPEC_ROOT, "manifest.json"), "utf8")) as Abb120SpecManifest;
+}
+
+function loadPrograms(manifest = loadManifest()): Abb120SpecProgramSource[] {
+ return manifest.programs.map((entry) => ({
+ program_id: entry.program_id,
+ file: entry.file,
+ text: readFileSync(join(SPEC_ROOT, entry.file), "utf8")
+ }));
+}
+
+describe("working2 ABB120 GRL spec suite", () => {
+ it("maps grammar sections 4 through 25 to concrete Runtime, Static, or Post programs", () => {
+ const manifest = loadManifest();
+ const sections = manifest.coverage_matrix.map((item) => item.spec_section);
+ expect(sections).toEqual(Array.from({ length: 22 }, (_value, index) => index + 4));
+ expect(manifest.programs).toHaveLength(19);
+ expect(manifest.programs.filter((program) => program.coverage_level === "Runtime")).toHaveLength(12);
+ expect(manifest.programs.filter((program) => program.coverage_level === "Static")).toHaveLength(4);
+ expect(manifest.programs.filter((program) => program.coverage_level === "Post")).toHaveLength(3);
+
+ const programById = new Map(manifest.programs.map((program) => [program.program_id, program]));
+ for (const item of manifest.coverage_matrix) {
+ expect(item.program_ids.length).toBeGreaterThan(0);
+ for (const programId of item.program_ids) {
+ const program = programById.get(programId);
+ expect(program, `${item.spec_section} references missing ${programId}`).toBeDefined();
+ expect(
+ item.coverage_level.split("/"),
+ `${item.spec_section} coverage level must include ${programId}`
+ ).toContain(program!.coverage_level);
+ }
+ }
+ });
+
+ it("builds a W2 job with compile, controller, queue, trace, IO, post, and roundtrip evidence", () => {
+ const manifest = loadManifest();
+ const job = runAbb120SpecSuite(manifest, loadPrograms(manifest), {
+ now: "2026-06-28T01:30:00.000Z",
+ gitRevision: "test-revision"
+ });
+
+ expect(job.job_id).toMatch(/^W2-JOB-20260628013000-[a-f0-9]{8}$/);
+ expect(job.suite_id).toBe("working2-abb120-spec");
+ expect(job.robot_id).toBe("abb_irb120_3_58");
+ expect(job.coverage.missingSections).toEqual([]);
+ expect(job.programs.map((program) => program.program_id)).toEqual(manifest.programs.map((program) => program.program_id));
+
+ const runtime = job.programs.filter((program) => program.coverage_level === "Runtime");
+ expect(runtime.every((program) => program.compile.parsed)).toBe(true);
+ expect(runtime.every((program) => program.compile.sourceMapEntries > 0)).toBe(true);
+ expect(runtime.every((program) => program.controller?.commands.map((command) => command.command).includes("loadProgram"))).toBe(true);
+ expect(runtime.every((program) => program.controller?.commands.map((command) => command.command).includes("resetFault"))).toBe(true);
+ expect(runtime.some((program) => program.program_id === "W2_60_IOWaitPulse" && Object.keys(program.io?.image ?? {}).length > 0)).toBe(true);
+ expect(runtime.some((program) => (program.trace ?? []).some((event) => event.kind === "wait"))).toBe(true);
+ expect(runtime.some((program) => (program.motionQueue?.items.length ?? 0) > 0)).toBe(true);
+ expect(runtime.some((program) =>
+ program.program_id === "W2_99_FullSpecExample" &&
+ program.compile.pathCount === 2 &&
+ program.compile.operationCount === 2 &&
+ (program.motionQueue?.items.some((item) => item.source.kind === "path" && item.source.operationId === "pick_op") ?? false)
+ )).toBe(true);
+ expect(runtime.every((program) => (program.trajectory?.sampleCount ?? 0) >= 0)).toBe(true);
+ expect(runtime.some((program) =>
+ (program.trajectory?.frames ?? []).some((frame) =>
+ frame.joints.length === 6 &&
+ frame.tcp.position.length === 3 &&
+ frame.tcp.quaternion.length === 4
+ )
+ )).toBe(true);
+
+ for (const program of job.programs) {
+ const expected = manifest.programs.find((entry) => entry.program_id === program.program_id)!;
+ expect(program.status, program.program_id).toBe(expected.expected_status);
+ const codes = program.diagnostics.map((diagnostic) => diagnostic.code);
+ for (const code of expected.expected_diagnostics) {
+ expect(codes, program.program_id).toContain(code);
+ }
+ expect(codes, program.program_id).not.toContain("W2_EXPECTED_DIAGNOSTIC_MISSING");
+ expect(codes, program.program_id).not.toContain("W2_EXPECTED_STATUS_MISMATCH");
+ }
+
+ const diagnostics = Object.fromEntries(job.programs.map((program) => [
+ program.program_id,
+ program.diagnostics.map((diagnostic) => diagnostic.code)
+ ]));
+ expect(diagnostics.W2_E10_ExpressionDiagnostics).toEqual(expect.arrayContaining([
+ "GRL_EXPR_UNKNOWN_SYMBOL",
+ "GRL_EXPR_UNKNOWN_FUNCTION",
+ "GRL_EXPR_ARITY",
+ "GRL_EXPR_DOMAIN",
+ "GRL_EXPR_DIV_ZERO",
+ "GRL_EXPR_UNIT_MISMATCH"
+ ]));
+ expect(diagnostics.W2_E20_SemanticDiagnostics).toEqual(expect.arrayContaining([
+ "GRL_SYMBOL_DUPLICATE",
+ "GRL_ARGUMENT_NOT_LVALUE"
+ ]));
+ expect(diagnostics.W2_E30_MotionDiagnostics).toEqual(expect.arrayContaining([
+ "GRL_PATH_EMPTY",
+ "KDL_JOINT_LIMIT",
+ "KDL_TARGET_UNREACHABLE"
+ ]));
+ expect(diagnostics.W2_E40_ControlFlowDiagnostics).toEqual(expect.arrayContaining([
+ "GRL_BREAK_OUTSIDE_FLOW"
+ ]));
+ expect(diagnostics.W2_E50_RuntimeTimeout).toEqual(expect.arrayContaining([
+ "VC_WAIT_TIMEOUT"
+ ]));
+
+ const post = job.programs.filter((program) => program.coverage_level === "Post");
+ expect(post.every((program) => program.post?.filenames.some((filename) => filename.endsWith(".mod")))).toBe(true);
+ expect(post.every((program) => program.post?.filenames.some((filename) => filename.endsWith(".ls")))).toBe(true);
+ expect(post.every((program) => program.post?.filenames.some((filename) => filename.endsWith(".src")))).toBe(true);
+ expect(post.every((program) => program.roundtrip?.status.match(/pass|warn/))).toBe(true);
+ expect(job.artifacts.jobJson).toContain(job.job_id);
+ });
+});
diff --git a/kdl-wasm/web/tests/integration/abb120SuiteArtifacts.test.ts b/kdl-wasm/web/tests/integration/abb120SuiteArtifacts.test.ts
index 0508679..13a1ea5 100644
--- a/kdl-wasm/web/tests/integration/abb120SuiteArtifacts.test.ts
+++ b/kdl-wasm/web/tests/integration/abb120SuiteArtifacts.test.ts
@@ -69,6 +69,8 @@ describe("ABB120 suite artifacts", () => {
expect(html).toContain("ABB120 Station");
expect(html).toContain("Path: pick_place");
+ expect(html).toContain("W2-JOB-latest");
+ expect(html).toContain("working2-abb120-spec");
expect(html).toContain("Controller");
expect(html).toContain("Motion Queue");
expect(html).toContain("Reports");
diff --git a/package-lock.json b/package-lock.json
index 9449803..690e414 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,6 +13,7 @@
"devDependencies": {
"@types/node": "^22.15.30",
"typescript": "^5.8.3",
+ "vite-node": "^3.2.4",
"vitest": "^3.2.4"
}
},
diff --git a/package.json b/package.json
index 1071096..e743254 100644
--- a/package.json
+++ b/package.json
@@ -6,11 +6,17 @@
"scripts": {
"test": "vitest run --config kdl-wasm/web/vitest.config.ts",
"typecheck": "tsc -p kdl-wasm/web/tsconfig.json --noEmit",
- "verify:virtual-controller": "node kdl-wasm/web/scripts/verify-virtual-controller.mjs"
+ "verify:virtual-controller": "node kdl-wasm/web/scripts/verify-virtual-controller.mjs",
+ "verify:virtual-controller-buttons": "node kdl-wasm/web/scripts/verify-virtual-controller-buttons.mjs",
+ "suite:abb120-spec": "vite-node kdl-wasm/web/scripts/run-abb120-spec-suite.ts",
+ "demo:build": "node kdl-wasm/web/scripts/build-demo-package.mjs",
+ "demo:verify": "node kdl-wasm/web/scripts/verify-demo-package.mjs",
+ "demo:deploy": "powershell -NoProfile -ExecutionPolicy Bypass -File kdl-wasm/web/scripts/deploy-demo-package.ps1"
},
"devDependencies": {
"@types/node": "^22.15.30",
"typescript": "^5.8.3",
+ "vite-node": "^3.2.4",
"vitest": "^3.2.4"
},
"dependencies": {
diff --git a/work/doc/GRL功能语法逻辑与程序创建使用手册.docx b/work/doc/GRL功能语法逻辑与程序创建使用手册.docx
new file mode 100644
index 0000000..56e2ad0
Binary files /dev/null and b/work/doc/GRL功能语法逻辑与程序创建使用手册.docx differ
diff --git a/work/doc/通用机器人离线编程系统测试文档.docx b/work/doc/通用机器人离线编程系统测试文档.docx
new file mode 100644
index 0000000..bfde067
Binary files /dev/null and b/work/doc/通用机器人离线编程系统测试文档.docx differ
diff --git a/work/doc/通用机器人编程语法规范.md b/work/doc/通用机器人编程语法规范.md
index 08d1d42..68b44ab 100644
--- a/work/doc/通用机器人编程语法规范.md
+++ b/work/doc/通用机器人编程语法规范.md
@@ -168,7 +168,7 @@ label jump
movej movel movec run_path run_operation
set_tool set_frame set_speed set_zone
wait pulse timer
-io true false all any rising falling changed
+io true false and or not mod all any rising falling changed
trap interrupt enable disable raise alarm try catch finally
task sync
post_hint source defaults point event before after at
@@ -277,9 +277,163 @@ persistent real counter = 0
3. `var` 默认为局部变量。
4. 类型可以显式写出,自动生成程序建议显式写出。
-## 7. 坐标、工具和目标点
+## 7. 表达式与运算
-### 7.1 工具
+GRL 表达式是数据声明、运动参数、路径参数、IO 条件和流程控制的公共基础。首版按 ABB RAPID、FANUC LS/KAREL、KUKA KRL 共同具备的数学能力建模,优先保证同一 GRL 程序能稳定编译到统一 IR,再由后处理器输出品牌程序。
+
+### 7.1 语法范围
+
+表达式必须支持:
+
+1. 算术:一元 `+`、一元 `-`、二元 `+`、`-`、`*`、`/`、`mod`。
+2. 比较:`==`、`!=`、`<`、`<=`、`>`、`>=`。
+3. 逻辑:`and`、`or`、`not`;可兼容 `&&`、`||`、`!` 作为输入别名,IR 中统一为 GRL 关键字。
+4. 括号:`(...)` 显式改变优先级。
+5. 函数调用:`callee(args...)`,参数内部允许完整表达式。
+6. 单位后缀:可作用于数字字面量、标识符、函数调用或括号表达式,例如 `100 mm`、`blend_base mm`、`sqrt(90000) mm`、`(10 + 5) deg`。
+7. 现有结构表达式:数组、对象、构造器调用、标识符引用、IO 引用和 `offset` 表达式必须继续兼容。
+
+优先级从高到低:
+
+| 层级 | 运算 |
+| --- | --- |
+| 1 | 函数调用、对象、数组、括号、构造器、offset |
+| 2 | 一元 `+`、`-`、`not`、`!` |
+| 3 | `*`、`/`、`mod` |
+| 4 | `+`、`-` |
+| 5 | `<`、`<=`、`>`、`>=` |
+| 6 | `==`、`!=` |
+| 7 | `and`、`&&` |
+| 8 | `or`、`||` |
+
+### 7.2 内置常量和函数
+
+首版内置常量:
+
+| 名称 | 含义 |
+| --- | --- |
+| `pi` | 圆周率 |
+| `e` | 自然常数 |
+
+首版内置函数:
+
+| 类别 | 函数 |
+| --- | --- |
+| 三角函数 | `sin`、`cos`、`tan`、`asin`、`acos`、`atan`、`atan2` |
+| 数值函数 | `sqrt`、`abs`、`pow`、`min`、`max`、`clamp`、`floor`、`ceil`、`round` |
+
+函数规则:
+
+1. `sin/cos/tan` 接收角度量;带 `deg` 或 `rad` 单位时归一化为弧度,纯数按弧度处理。
+2. `asin/acos` 接收无单位数值,定义域为 `[-1, 1]`;`atan` 接收无单位数值;`atan2(y, x)` 的两个参数必须同维度或均为无单位数值。
+3. `asin/acos/atan/atan2` 返回角度量;在 `pose(...)` 姿态项或 `joint_target.joints` 等角度上下文中可直接使用。
+4. `sqrt` 首版只要求支持无单位数值或编译器明确支持的上下文,负数必须报定义域错误。
+5. `min/max/clamp` 的参数必须维度兼容;`clamp(value, min, max)` 的边界顺序错误应给出 diagnostic。
+6. 函数参数数量必须严格检查,例如 `atan2` 为 2 个参数,`clamp` 为 3 个参数。
+
+### 7.3 单位和求值语义
+
+数值求值采用统一 SI 归一化:
+
+| GRL 输入 | IR/KDL 归一化 |
+| --- | --- |
+| `mm` | m |
+| `m` | m |
+| `mm/s` | m/s |
+| `mm/s2` | m/s2 |
+| `deg` | rad |
+| `rad` | rad |
+| `%` | 0 到 1 的比例 |
+| `s` | s |
+| `ms` | s |
+| `kg` | kg |
+
+规则:
+
+1. 同维度数值可以相加、相减和比较,结果保留该维度并归一化。
+2. 纯数可以参与乘除;维度乘除首版只允许编译器明确支持的上下文,避免产生复杂复合单位。
+3. 不同维度相加、相减或比较必须报错,例如 `10 mm + 2 s`。
+4. 构造器可以提供默认上下文单位:`linear(...)` 默认 `mm/s`,`angular(...)` 默认 `deg/s`,`z(...)` 默认 `mm`,`pose(...)` 前三项默认 `mm`、后三项默认 `deg`,`joint_target.joints` 默认 `deg`,`timeout/duration` 默认 `s`。
+5. 因此 `linear(100 + 50 mm/s)` 在 `linear` 速度上下文中等价于 `linear(150 mm/s)`;自动生成程序推荐输出显式单位,减少人工歧义。
+
+### 7.4 编译期求值位置
+
+常量表达式必须在编译阶段求值,并把结果写入 Semantic IR / KDL request,而不是把表达式字符串传到运动规划层。
+
+必须支持的求值位置:
+
+1. 数据声明 initializer:`const`、`persistent`、需要静态初值的 `var`。
+2. `speed`:`linear(...)`、`joint(...)`、`angular(...)`、`acc ...` 参数。
+3. `zone`:`fine`、`z(...)`、`cnt(...)`。
+4. `pose(...)`、`poseq(...)`、`robot_config(...)`。
+5. `joint_target { joints: [...] }`。
+6. `pose_target { pose: ... }`。
+7. `tool { tcp: ..., mass: ... }` 和 `frame { origin: ... }`。
+8. path `defaults`、`source` 属性和 path point 内联 `speed`、`zone`、`tool`、`frame`、`via`、`target` 参数。
+9. path event 的 `distance`。
+10. `wait ... timeout ...` 和 `pulse ... duration ...` 中的时间常量。
+11. operation `process` 中需要数值常量的工艺参数。
+12. `switch case` 值。
+
+比较和逻辑表达式也必须进入 AST。纯常量比较/逻辑可在编译期折叠;依赖 IO、变量或运行态状态的条件先保留为结构化控制表达式,供虚拟控制器和后续品牌映射使用。
+
+### 7.5 示例
+
+```text
+const real blend_base = 5 + 5
+const speed v_pick = linear(100 + 50 mm/s)
+const speed v_safe = linear(max(50 mm/s, 200 mm/s / 2))
+const zone z_app = z(clamp(blend_base mm, 1 mm, 50 mm))
+
+target home = joint_target {
+ joints: [0 deg, (10 + 5) deg, -90 deg, 0 deg, 0 deg, 0 deg]
+}
+
+target pick = pose_target {
+ pose: pose(400 + 50 mm, 20 * 2 mm, sqrt(90000) mm, 0 deg, 0 deg, atan2(1, 1))
+}
+
+wait io.ai[2] > sin(30 deg) timeout 1 + 1 s
+```
+
+编译期结果要求:
+
+1. `v_pick` 进入 IR 后为 `linear`,速度 `0.15 m/s`。
+2. `z_app` 进入 IR 后为 `distance`,距离 `0.01 m`。
+3. `home.joints[1]` 进入 IR 后为 `15 deg` 对应的弧度值。
+4. `pick.pose.position[0]` 进入 IR 后为 `0.45 m`。
+5. `atan2(1, 1)` 进入姿态上下文后为 `45 deg` 对应的弧度值。
+
+### 7.6 诊断
+
+运算功能必须输出稳定 diagnostic:
+
+| code | 场景 |
+| --- | --- |
+| `GRL_EXPR_PARSE` | 表达式语法错误或括号不匹配。 |
+| `GRL_EXPR_UNKNOWN_SYMBOL` | 常量求值遇到未知标识符。 |
+| `GRL_EXPR_UNKNOWN_FUNCTION` | 未知函数。 |
+| `GRL_EXPR_ARITY` | 函数参数数量错误。 |
+| `GRL_EXPR_DOMAIN` | 数学定义域错误,例如 `sqrt(-1)`、`acos(2)`。 |
+| `GRL_EXPR_DIV_ZERO` | 除零。 |
+| `GRL_EXPR_UNIT_MISMATCH` | 单位维度不兼容。 |
+| `GRL_EXPR_NON_CONSTANT` | 需要常量的位置出现运行时表达式。 |
+| `GRL_EXPR_UNSUPPORTED_RUNTIME` | 后处理暂不支持的复杂运行时表达式。 |
+
+每个 diagnostic 必须包含 severity、message、source range,并能通过 source map 定位到 GRL 源文件行列。
+
+### 7.7 跨品牌边界
+
+首版跨品牌输出不直接翻译复杂表达式字符串,而是优先输出编译期折叠后的常量:
+
+1. `linear(100 + 50 mm/s)` 输出为各品牌可表达的具体速度值。
+2. `z(clamp(...))` 输出为具体 ABB zone、FANUC CNT 或 KUKA 近似 blend。
+3. runtime 条件表达式如果后处理器无法保真映射,必须进入转换报告,不得静默丢失。
+4. 品牌专用数学函数、控制器系统变量和复杂运行时表达式不作为首版公共能力,后续通过 post/import report 增量支持。
+
+## 8. 坐标、工具和目标点
+
+### 8.1 工具
```text
persistent tool gripper = tool {
@@ -289,7 +443,7 @@ persistent tool gripper = tool {
}
```
-### 7.2 工件坐标
+### 8.2 工件坐标
```text
persistent frame fixture = frame {
@@ -297,7 +451,7 @@ persistent frame fixture = frame {
}
```
-### 7.3 关节目标点
+### 8.3 关节目标点
```text
target home = joint_target {
@@ -307,7 +461,7 @@ target home = joint_target {
`joint_target` 主要用于 `movej`,后处理可映射到 ABB `jointtarget`、KUKA `E6AXIS` 或 FANUC 关节位置数据。
-### 7.4 笛卡尔目标点
+### 8.4 笛卡尔目标点
```text
target pick = pose_target {
@@ -330,7 +484,7 @@ pose(x, y, z, rx, ry, rz)
poseq(500 mm, 120 mm, 300 mm, 0, 0, 0.7071068, 0.7071068)
```
-### 7.5 偏移目标点
+### 8.5 偏移目标点
```text
var pose_target approach = pick offset z 100 mm
@@ -344,9 +498,9 @@ var pose_target p3 = pick offset_in tool z -50 mm
var pose_target p4 = pick offset_in frame fixture x 100 mm
```
-## 8. 速度和过渡
+## 9. 速度和过渡
-### 8.1 速度
+### 9.1 速度
```text
const speed v_joint_fast = joint(80 %)
@@ -367,7 +521,7 @@ const speed v_orient = angular(90 deg/s)
const speed v_slow = linear(100 mm/s, acc 500 mm/s2)
```
-### 8.2 过渡
+### 9.2 过渡
```text
const zone z_fine = fine
@@ -384,9 +538,9 @@ const zone z_cont = continuous
3. `cnt(percent)`:以百分比表示连续过渡,便于映射 FANUC `CNT`。
4. `continuous`:允许连续通过,实际过渡由后处理器或虚拟控制器策略决定。
-## 9. 运动指令
+## 10. 运动指令
-### 9.1 基本语法
+### 10.1 基本语法
```text
movej TargetExpr [speed Speed] [zone Zone] [tool Tool] [frame Frame]
@@ -402,7 +556,7 @@ movel pick speed linear(300 mm/s) zone z10
movec via arc_mid target arc_end speed linear(150 mm/s) zone fine
```
-### 9.2 MOVEJ 语义
+### 10.2 MOVEJ 语义
`movej` 表示关节空间运动。机器人按各轴关节角度差分运行,关节同起同停,TCP 轨迹不要求是直线。
@@ -416,7 +570,7 @@ movec via arc_mid target arc_end speed linear(150 mm/s) zone fine
- FANUC:`J P[...]`
- KUKA:`PTP`
-### 9.3 MOVEL 语义
+### 10.3 MOVEL 语义
`movel` 表示 TCP 直线运动。TCP 沿起点到终点的空间直线运行,关节角由每个 TCP 采样点 IK 求解。
@@ -430,7 +584,7 @@ movec via arc_mid target arc_end speed linear(150 mm/s) zone fine
- FANUC:`L P[...]`
- KUKA:`LIN`
-### 9.4 MOVEC 语义
+### 10.4 MOVEC 语义
`movec` 表示 TCP 圆弧运动。TCP 从当前点出发,经过 via 点,到达 target 点,沿圆弧运行,关节角由每个圆弧采样点 IK 求解。
@@ -445,7 +599,7 @@ movec via arc_mid target arc_end speed linear(150 mm/s) zone fine
- FANUC:`C P[...]`
- KUKA:`CIRC`
-### 9.5 当前工具和当前坐标
+### 10.5 当前工具和当前坐标
```text
set_tool gripper
@@ -463,11 +617,11 @@ set_zone z10
编译到 IR 时,所有运动必须有确定的 `tool`、`frame`、`speed`、`zone`。
-## 10. Path 语法
+## 11. Path 语法
Path 是自动离线编程的核心对象。CAD 曲线、规划点、示教点、工艺模板应优先生成 Path,而不是直接生成散乱运动语句。
-### 10.1 基本语法
+### 11.1 基本语法
```text
path pick_path {
@@ -484,7 +638,7 @@ path pick_path {
}
```
-### 10.2 圆弧点
+### 11.2 圆弧点
```text
path arc_path {
@@ -500,7 +654,7 @@ path arc_path {
}
```
-### 10.3 来源元数据
+### 11.3 来源元数据
```text
path curve_032_generated {
@@ -532,7 +686,7 @@ path curve_032_generated {
3. 重新生成程序。
4. 报告中定位到 CAD 曲线或工艺对象。
-### 10.4 Path event
+### 11.4 Path event
```text
event before p001 io.do[10] = true
@@ -547,7 +701,7 @@ event at p005 distance -20 mm pulse io.do[20] duration 100 ms
3. `at ... distance`:相对路径点提前或滞后触发,首版可编译为最近采样点事件。
4. 后处理到品牌程序时,若品牌不支持精确路径触发,应生成转换报告。
-### 10.5 `run_path`
+### 11.5 `run_path`
```text
proc main()
@@ -562,7 +716,7 @@ end
3. event 变为 IO/Wait/Process IR。
4. 保留 source map,调试时可从程序行定位到路径点。
-## 11. Operation 语法
+## 12. Operation 语法
Operation 表达工艺语义,比 Path 更高一层。
@@ -614,9 +768,9 @@ end
3. 执行 `end_action`。
4. 保留工艺参数,供仿真 UI、报告和后处理使用。
-## 12. IO 与等待
+## 13. IO 与等待
-### 12.1 IO 地址
+### 13.1 IO 地址
```text
io.di[1]
@@ -637,7 +791,7 @@ io.alias.clamp_closed
io.alias.gripper_close_cmd
```
-### 12.2 IO 写入
+### 13.2 IO 写入
```text
io.do[1] = true
@@ -645,7 +799,7 @@ io.go[1] = 16
io.ao[1] = 3.5
```
-### 12.3 wait
+### 13.3 wait
```text
wait io.di[1] == true
@@ -664,7 +818,7 @@ wait io.di[1] == true timeout 2 s on_timeout alarm "Clamp close timeout"
wait io.di[1] == true timeout 2 s on_timeout call recover_clamp()
```
-### 12.4 pulse
+### 13.4 pulse
```text
pulse io.do[3] duration 200 ms
@@ -676,11 +830,11 @@ pulse io.do[3] duration 200 ms
2. 虚拟时间到达 duration 后自动复位。
3. trace 中必须记录置位和复位事件。
-## 13. 流程控制
+## 14. 流程控制
流程控制用于表达工艺分支、重试、配方选择、批量工位循环和异常恢复。GRL 新程序应优先使用结构化控制流;`label/jump` 主要用于兼容 FANUC TP/LS 等已有程序导入。
-### 13.1 条件 `if / elseif / else`
+### 14.1 条件 `if / elseif / else`
```text
if part_ok
@@ -711,7 +865,7 @@ if is_part_ready()
if recipe_id == 2 or recipe_id == 3
```
-### 13.2 `while` 循环
+### 14.2 `while` 循环
```text
while retry < 3
@@ -731,7 +885,7 @@ end
4. `continue` 跳过本轮剩余语句,进入下一轮条件判断。
5. 编译器建议对可能无限循环的 `while true` 给出 warning,除非循环体内包含明确的 `break`、`return`、`raise` 或 `wait`。
-### 13.3 `for` 循环
+### 14.3 `for` 循环
```text
for i = 0 to 9 step 1
@@ -763,7 +917,7 @@ end
4. `break` 和 `continue` 只影响当前最近一层循环。
5. 后处理到不支持结构化 `for` 的品牌时,可展开为标签和跳转,但必须保持 source map。
-### 13.4 `switch / case / default`
+### 14.4 `switch / case / default`
```text
switch recipe_id
@@ -798,7 +952,7 @@ end
6. 导出到 FANUC TP/LS 时,`switch` 可转换为 `SELECT`、条件跳转或 `LBL/JMP` 组合。
7. 导出到 ABB/KUKA 时,优先转换为品牌结构化分支。
-### 13.5 `break` 和 `continue`
+### 14.5 `break` 和 `continue`
```text
while true
@@ -821,7 +975,7 @@ end
2. `continue` 只能出现在 `while` 或 `for` 中。
3. 在 `switch` 中不需要 `break` 防止贯穿,因为 GRL 默认不贯穿。
-### 13.6 label 和 jump
+### 14.6 label 和 jump
```text
label retry
@@ -841,9 +995,9 @@ end
4. 允许 `jump` 跳出块结构,但编译器应生成 warning。
5. 自动生成的新程序不应使用 `label/jump`,除非目标后处理配置要求 FANUC 风格输出。
-## 14. 子程序和函数
+## 15. 子程序和函数
-### 14.1 `proc` 子程序
+### 15.1 `proc` 子程序
`proc` 是无返回值子程序,用于组织工艺步骤、运动流程、IO 流程和恢复逻辑。
@@ -869,7 +1023,7 @@ call pick_part(slot_id)
4. `return` 可以提前退出 `proc`,但不能携带返回值。
5. `proc main()` 是默认入口。一个模块中最多一个默认入口。
-### 14.2 参数方向
+### 15.2 参数方向
参数支持 `in`、`out`、`inout` 三种方向。未写方向时默认为 `in`。
@@ -905,7 +1059,7 @@ call read_part(ok)
call increment_retry(retry)
```
-### 14.3 `func` 函数
+### 15.3 `func` 函数
`func` 有返回值,适合计算条件、选择目标点、计算偏移、读取配方参数。函数应尽量无副作用。
@@ -945,7 +1099,7 @@ movel slot_pose(slot_id) speed linear(200 mm/s) zone z10
4. `func` 默认不允许执行运动指令、`wait`、`pulse`、`run_path`、`run_operation`。编译器应把这类用法作为 error 或强 warning。
5. 如果确实需要带副作用的逻辑,应使用 `proc`。
-### 14.4 作用域和名称解析
+### 15.4 作用域和名称解析
名称解析顺序:
@@ -962,7 +1116,7 @@ movel slot_pose(slot_id) speed linear(200 mm/s) zone z10
3. `for` 循环变量只在循环体内有效。
4. `label` 只在当前 `proc` 内有效。
-### 14.5 子程序调用和后处理
+### 15.5 子程序调用和后处理
后处理映射:
@@ -975,16 +1129,16 @@ movel slot_pose(slot_id) speed linear(200 mm/s) zone z10
如果目标品牌或输出格式不支持某种参数模式,后处理器必须生成转换报告,不能静默丢失语义。
-## 15. 异常、报警和中断
+## 16. 异常、报警和中断
-### 15.1 alarm 和 raise
+### 16.1 alarm 和 raise
```text
alarm "Part not detected"
raise E_PICK_FAILED
```
-### 15.2 try/catch
+### 16.2 try/catch
```text
try
@@ -998,7 +1152,7 @@ end
首版可先实现 `alarm`、`raise` 和简单 `catch`,复杂品牌错误恢复分阶段支持。
-### 15.3 trap 和 interrupt
+### 16.3 trap 和 interrupt
```text
trap emergency_stop()
@@ -1018,7 +1172,7 @@ disable interrupt e_stop
2. KUKA 可映射到 `INTERRUPT DECL`、`INTERRUPT ON/OFF` 等近似结构。
3. FANUC 首版可生成后台逻辑、条件监控或转换报告。
-## 16. 多任务
+## 17. 多任务
首版只定义语法,不要求完整实现多任务实时调度:
@@ -1032,9 +1186,9 @@ end
虚拟控制器可先按周期任务模拟;后处理时根据品牌能力生成后台任务或转换报告。
-## 17. 品牌扩展和后处理提示
+## 18. 品牌扩展和后处理提示
-### 17.1 post_hint
+### 18.1 post_hint
```text
post_hint abb {
@@ -1055,7 +1209,7 @@ post_hint kuka {
}
```
-### 17.2 brand metadata
+### 18.2 brand metadata
```text
@brand.abb {
@@ -1078,7 +1232,7 @@ post_hint kuka {
2. 通用虚拟控制器不应依赖品牌 metadata 才能执行。
3. 无法支持的品牌扩展必须进入转换报告。
-## 18. 自动编程生成规则
+## 19. 自动编程生成规则
自动生成 GRL 时,应遵循以下规则:
@@ -1108,9 +1262,9 @@ proc main()
end
```
-## 19. 后处理映射规则
+## 20. 后处理映射规则
-### 19.1 ABB RAPID
+### 20.1 ABB RAPID
| GRL | ABB RAPID |
| --- | --- |
@@ -1140,7 +1294,7 @@ movel pick speed linear(300 mm/s) zone z10 tool gripper frame fixture
MoveL pick, v300, z10, gripper\WObj:=fixture;
```
-### 19.2 FANUC LS/TP 风格
+### 20.2 FANUC LS/TP 风格
| GRL | FANUC |
| --- | --- |
@@ -1170,7 +1324,7 @@ movel P10 speed linear(300 mm/s) zone cnt(10)
L P[10] 300mm/sec CNT10 ;
```
-### 19.3 KUKA KRL
+### 20.3 KUKA KRL
| GRL | KUKA KRL |
| --- | --- |
@@ -1201,7 +1355,7 @@ $VEL.CP = 0.3
LIN XPICK C_DIS
```
-## 20. 编译语义和 IR
+## 21. 编译语义和 IR
编译管线:
@@ -1239,7 +1393,7 @@ interface MotionInstruction {
}
```
-## 21. 语义检查
+## 22. 语义检查
编译器必须检查:
@@ -1250,21 +1404,25 @@ interface MotionInstruction {
5. 圆弧三点是否重合或共线。
6. 工具、坐标系、速度、过渡是否可解析。
7. 单位是否正确。
-8. IO 地址是否存在于 IO map 或允许范围。
-9. 子程序参数数量和类型是否匹配。
-10. `out` 参数是否在所有正常返回路径上赋值。
-11. `inout` 和 `out` 实参是否为可赋值左值。
-12. `func` 是否在所有正常返回路径上返回正确类型。
-13. `break`、`continue` 是否出现在合法结构内。
-14. `switch case` 是否为常量表达式,是否存在重复 case。
-15. `jump` 是否跳入非法块结构。
-16. `wait` 是否有可执行条件。
-17. Path 是否为空。
-18. Path point 名称是否重复。
-19. Operation 是否引用不存在的 Path。
-20. 目标点是否可达。
-21. 关节是否超限。
-22. 后处理目标品牌是否支持所用语义。
+8. 表达式优先级、括号、函数调用参数是否解析正确。
+9. 内置函数名称、参数数量、定义域和单位维度是否正确。
+10. 需要常量的位置是否只使用常量表达式。
+11. 除零、未知符号、未知函数和复杂运行时表达式是否产生稳定 diagnostic。
+12. IO 地址是否存在于 IO map 或允许范围。
+13. 子程序参数数量和类型是否匹配。
+14. `out` 参数是否在所有正常返回路径上赋值。
+15. `inout` 和 `out` 实参是否为可赋值左值。
+16. `func` 是否在所有正常返回路径上返回正确类型。
+17. `break`、`continue` 是否出现在合法结构内。
+18. `switch case` 是否为常量表达式,是否存在重复 case。
+19. `jump` 是否跳入非法块结构。
+20. `wait` 是否有可执行条件。
+21. Path 是否为空。
+22. Path point 名称是否重复。
+23. Operation 是否引用不存在的 Path。
+24. 目标点是否可达。
+25. 关节是否超限。
+26. 后处理目标品牌是否支持所用语义。
诊断格式建议:
@@ -1275,7 +1433,7 @@ W3002: zone z50 is larger than segment length
W4001: KUKA post approximates GRL cnt(30) by C_DIS
```
-## 22. EBNF 语法草案
+## 23. EBNF 语法草案
以下是首版解析器可采用的简化 EBNF:
@@ -1310,7 +1468,8 @@ path_item = defaults_block | source_block | path_point | path_event ;
defaults_block = "defaults" "{" { property } "}" ;
source_block = "source" "{" { property } "}" ;
path_point = "point" identifier motion_stmt ;
-path_event = "event" ( "before" | "after" ) identifier statement ;
+path_event = "event" ( ( "before" | "after" ) identifier
+ | "at" identifier "distance" expr ) statement ;
operation_decl = "operation" identifier "{"
"kind" ":" identifier
@@ -1379,18 +1538,34 @@ jump_stmt = "jump" identifier ;
param_list = param { "," param } ;
param = [ "in" | "out" | "inout" ] type identifier ;
arg_list = expr { "," expr } ;
+const_expr = expr ;
+duration = expr ;
+length = expr ;
+speed_expr = expr ;
+zone_expr = expr ;
-expr = literal
+expr = or_expr ;
+or_expr = and_expr { ( "or" | "||" ) and_expr } ;
+and_expr = equality_expr { ( "and" | "&&" ) equality_expr } ;
+equality_expr = relation_expr { ( "==" | "!=" ) relation_expr } ;
+relation_expr = additive_expr { ( "<" | "<=" | ">" | ">=" ) additive_expr } ;
+additive_expr = multiply_expr { ( "+" | "-" ) multiply_expr } ;
+multiply_expr = unary_expr { ( "*" | "/" | "mod" ) unary_expr } ;
+unary_expr = [ "+" | "-" | "not" | "!" ] postfix_expr ;
+postfix_expr = primary_expr { unit_suffix | offset_clause } ;
+unit_suffix = unit ;
+primary_expr = literal
| identifier
- | call_expr
| io_ref
- | unary_expr
- | binary_expr
+ | call_expr
+ | array
+ | object
| "(" expr ")" ;
call_expr = identifier "(" [ arg_list ] ")" ;
+literal = number | string | "true" | "false" ;
```
-## 23. 完整示例
+## 24. 完整示例
```text
language grl 0.1
@@ -1488,7 +1663,7 @@ module Main
end
```
-## 24. 实施优先级
+## 25. 实施优先级
P0 必须实现:
@@ -1503,9 +1678,10 @@ P0 必须实现:
9. `call`、`return`、`break`、`continue`。
10. `proc` 参数方向 `in/out/inout`。
11. `func`、函数调用表达式和返回值检查。
-12. `io.do/di`、`wait`、`pulse`。
-13. AST、语义检查、IR、source map。
-14. ABB、FANUC、KUKA 后处理原型。
+12. 表达式 parser、单位后缀、内置数学函数、三角函数和编译期常量求值。
+13. `io.do/di`、`wait`、`pulse`。
+14. AST、语义检查、IR、source map。
+15. ABB、FANUC、KUKA 后处理原型。
P1 扩展:
@@ -1517,7 +1693,7 @@ P1 扩展:
6. 品牌程序导入。
7. 复杂品牌扩展和转换报告。
-## 25. 参考资料
+## 26. 参考资料
1. ABB RAPID Technical Reference Manual,RAPID Instructions, Functions and Data Types:
https://library.e.abb.com/public/b227fcd260204c4dbeb8a58f8002fe64/Rapid_instructions.pdf
diff --git a/working2/01-项目功能内容.md b/working2/01-项目功能内容.md
new file mode 100644
index 0000000..ac242f9
--- /dev/null
+++ b/working2/01-项目功能内容.md
@@ -0,0 +1,216 @@
+# 01-项目功能内容
+
+版本:0.1
+日期:2026-06-28
+
+## 1. 总体需求
+
+目标是对标 `通用机器人编程语法规范.md`,以 ABB IRB120 3/58 URDF fixture 为基础,创建一套覆盖 GRL 语法规范的机器人程序集,并全面完成虚拟控制器执行验收。
+
+核心结果:
+
+1. 语法规范覆盖矩阵:每个 GRL 章节都有对应程序、静态测试或后处理测试。
+2. ABB120 机器人程序集:覆盖数据声明、表达式、工具/坐标、目标点、速度、zone、运动、path、operation、IO/wait、流程控制、proc/func、异常、品牌扩展和后处理。
+3. 虚拟控制器执行报告:每个可执行程序都能生成 controller state、program counter、motion queue、trace、IO image、wait/alarm、source map 和 trajectory 证据。
+4. 错误诊断套件:限位、不可达、表达式错误、单位错误、wait timeout、重复符号、非法控制流等故障必须稳定输出 diagnostic。
+5. 三品牌输出与回读:同一 IR 输出 ABB RAPID、FANUC LS 风格、KUKA KRL 风格,并生成 post/roundtrip 差异报告。
+6. 服务器演示包:把虚拟控制器网站、19 个 GRL 规范测试程序、最新 W2 job 证据包、截图和使用说明打包发布到 HTTPS 服务器,用户可通过浏览器演示虚拟控制器全部功能。
+
+## 2. 覆盖分层
+
+不是所有语法都应强行作为虚拟控制器 happy path 执行。覆盖分为三层:
+
+| 层级 | 范围 | 验收方式 |
+| --- | --- | --- |
+| Runtime | `module/proc/main`、数据、表达式、target、speed、zone、movej/movel/movec、path、operation、IO、wait、pulse、if/while/for/switch、call/return、alarm/raise/try | 虚拟控制器加载并执行,输出 trace 和状态快照。 |
+| Static | `func` 副作用限制、参数方向、scope、label/jump 合法性、switch case 常量、表达式诊断、trap/interrupt/task 语义边界 | parser/semantic diagnostic 和 source map。 |
+| Post | `post_hint`、`@brand.*`、ABB/FANUC/KUKA 映射、导入回读、runtime 表达式保真边界 | post report、roundtrip report、差异报告。 |
+
+## 3. ABB120 基准
+
+ABB120 基准沿用仓库稳定 fixture:
+
+| 项 | 值 |
+| --- | --- |
+| robotId | `abb_irb120_3_58` |
+| URDF 常量 | `ABB_IRB120_3_58_URDF` |
+| load options | `ABB_IRB120_LOAD_OPTIONS` |
+| baseLink | `base_link` |
+| tipLink | `tool0` |
+| active joints | `joint_1` 到 `joint_6` |
+| 标准关节位 | `home`、`approach`、`pick`、`place` |
+
+程序中的 reachable pose target 应优先由 ABB120 FK 生成并固化为 snapshot。不可达 pose、限位和奇异姿态只进入 error suite。
+
+## 4. 机器人程序集
+
+程序集建议落在:
+
+```text
+kdl-wasm/web/tests/fixtures/abb120/spec-programs/
+ runtime/
+ static/
+ post/
+ error/
+ expected/
+```
+
+### 4.1 Runtime happy path
+
+| 程序 | 覆盖目标 |
+| --- | --- |
+| `W2_00_MinimalModule.grl` | language、module、proc main、const speed/zone、movej。 |
+| `W2_10_DataTargetToolFrame.grl` | tool、frame、load、joint_target、pose_target、pose、poseq、robot_config、ext_axis 边界。 |
+| `W2_20_ExpressionMath.grl` | 算术、比较、逻辑、单位后缀、pi/e、三角函数、数值函数、编译期求值。 |
+| `W2_30_MotionAllTypes.grl` | movej、movel、movec、set_tool、set_frame、set_speed、set_zone、inline speed/zone。 |
+| `W2_40_PathEvents.grl` | path defaults/source、point、event before/after/at distance、run_path。 |
+| `W2_50_OperationProcess.grl` | operation kind/process/start_action/end_action/run_operation。 |
+| `W2_60_IOWaitPulse.grl` | io 地址、DO 写入、wait、timeout、on_timeout、pulse、all/any/rising/falling/changed。 |
+| `W2_70_ControlFlow.grl` | if/elseif/else、while、for、switch、break、continue。 |
+| `W2_80_ProcFuncCall.grl` | proc 参数、in/out/inout、call、return、func 返回值和函数调用表达式。 |
+| `W2_90_ExceptionAlarm.grl` | alarm、raise、try/catch/finally 可执行边界。 |
+| `W2_99_FullSpecExample.grl` | 完整示例的 tool/frame、path、operation、IO event、run_operation 和回 home。 |
+
+### 4.2 Static/error suite
+
+| 程序 | 覆盖目标 |
+| --- | --- |
+| `W2_E10_ExpressionDiagnostics.grl` | `GRL_EXPR_PARSE/DOMAIN/DIV_ZERO/UNIT_MISMATCH/NON_CONSTANT/UNKNOWN_*`。 |
+| `W2_E20_SemanticDiagnostics.grl` | 重复符号、缺失引用、类型不匹配、非法 out/inout 实参。 |
+| `W2_E30_MotionDiagnostics.grl` | 关节限位、不可达 pose、movec 共线、缺少 tool/frame/speed/zone。 |
+| `W2_E40_ControlFlowDiagnostics.grl` | 非法 break/continue、jump 进入块、重复 case、非常量 case。 |
+| `W2_E50_RuntimeTimeout.grl` | wait timeout、on_timeout alarm/call、trace 和报警 source map。 |
+
+### 4.3 Post/import suite
+
+| 程序 | 覆盖目标 |
+| --- | --- |
+| `W2_P10_BrandHints.grl` | `post_hint`、`@brand.abb/fanuc/kuka` 元数据和转换报告。 |
+| `W2_P20_CrossBrandMotion.grl` | ABB/FANUC/KUKA 的 move、speed、zone、IO、wait 映射。 |
+| `W2_P30_Roundtrip.grl` | post 后重新导入,比较 target/path/motion/operation 等价性。 |
+
+## 5. 虚拟控制器执行要求
+
+每个 runtime 程序必须执行以下控制器命令序列:
+
+1. `loadProgram`
+2. `start`
+3. `stepInto`
+4. `hold`
+5. `resume`
+6. `stepMotion`
+7. `stop`
+8. `resetFault`
+
+每次运行必须输出:
+
+| 证据 | 内容 |
+| --- | --- |
+| `job.json` | job_id、suite_id、program_id、robot_id、git revision、输入文件 hash。 |
+| `compile.json` | AST/IR 摘要、diagnostics、source map 统计。 |
+| `controller.json` | 状态机转换、mode、program pointer、scope、变量快照。 |
+| `motion-queue.json` | 队列项、activeIndex、duration、blend、planner diagnostic。 |
+| `trace.json` | motion、IO、wait、pulse、alarm、call/return、source map。 |
+| `io.json` | DI/DO/AI/AO/GI/GO/RI/RO 初值、脚本变化和最终状态。 |
+| `trajectory.json` | 采样点数、起止关节、TCP 路径、限位和奇异诊断。 |
+| `report.html/json` | 汇总报告、失败摘要、可追溯链接。 |
+
+## 6. 全面验收
+
+验收不只看测试通过,还必须证明“覆盖了语法规范”:
+
+1. `programs/manifest.md` 中每个规范章节至少有一项程序或测试覆盖。
+2. 每个 Runtime 程序有虚拟控制器执行证据。
+3. 每个 Static/error 程序有稳定 diagnostic。
+4. 每个 Post/import 程序有 post report 或 roundtrip report。
+5. HTML 虚拟控制器可以打开 ABB120 suite 最新 job,显示程序、队列、trace、IO、wait、报警和报告。
+
+## 7. 服务器演示包功能要求
+
+服务器演示包用于对外展示虚拟控制器能力,不能只发布静态 HTML。包内必须包含可被页面读取和人工检查的测试程序、运行证据和说明文档。
+
+### 7.1 发布目标
+
+| 项 | 值 |
+| --- | --- |
+| HTTPS 访问地址 | `https://82.156.24.101:8095/` |
+| 服务端口 | `8095` |
+| 推荐服务器目录 | `/opt/kdl-olp-demo/8095/current` |
+| 发布包归档目录 | `/opt/kdl-olp-demo/8095/releases/` |
+| 回滚链接 | `/opt/kdl-olp-demo/8095/previous` 或保留上一个 release 目录 |
+
+### 7.2 演示包内容
+
+```text
+demo-package/
+ app/
+ virtual-controller.html
+ virtual-controller.css
+ virtual-controller.js
+ spec-programs/
+ manifest.json
+ runtime/*.grl
+ static/*.grl
+ error/*.grl
+ post/*.grl
+ test-results/
+ abb120-spec//
+ job.json
+ report.json
+ report.html
+ programs//*.json
+ virtual-controller/
+ evidence.json
+ virtual-controller-desktop.png
+ virtual-controller-mobile.png
+ docs/
+ GRL功能语法逻辑与程序创建使用手册.docx
+ 通用机器人离线编程系统测试文档.docx
+ index.html
+ demo-manifest.json
+ README.md
+```
+
+### 7.3 演示能力清单
+
+| 能力 | 演示程序或证据 |
+| --- | --- |
+| 最小加载和 MoveJ | `W2_00_MinimalModule.grl` |
+| 数据、目标点、工具和坐标系 | `W2_10_DataTargetToolFrame.grl` |
+| 表达式、单位和数学函数 | `W2_20_ExpressionMath.grl` |
+| MoveJ/MoveL/MoveC | `W2_30_MotionAllTypes.grl` |
+| Path 和事件 | `W2_40_PathEvents.grl` |
+| Operation 工艺封装 | `W2_50_OperationProcess.grl` |
+| IO、wait、pulse、边沿 | `W2_60_IOWaitPulse.grl` |
+| 流程控制 | `W2_70_ControlFlow.grl` |
+| proc/func/call/return | `W2_80_ProcFuncCall.grl` |
+| 异常和报警 | `W2_90_ExceptionAlarm.grl` |
+| 完整示例 | `W2_99_FullSpecExample.grl` |
+| 表达式错误诊断 | `W2_E10_ExpressionDiagnostics.grl` |
+| 语义错误诊断 | `W2_E20_SemanticDiagnostics.grl` |
+| 运动错误诊断 | `W2_E30_MotionDiagnostics.grl` |
+| 控制流错误诊断 | `W2_E40_ControlFlowDiagnostics.grl` |
+| wait timeout | `W2_E50_RuntimeTimeout.grl` |
+| 品牌 hint/post report | `W2_P10_BrandHints.grl` |
+| 跨品牌 motion/IO/wait 输出 | `W2_P20_CrossBrandMotion.grl` |
+| post 后导入回读 | `W2_P30_Roundtrip.grl` |
+
+### 7.4 页面演示要求
+
+1. 首页必须能进入虚拟控制器页面。
+2. 页面必须能看到当前 suite、job_id、程序数量、通过/诊断/失败统计。
+3. 页面必须列出 19 个程序,并支持查看源码或证据摘要。
+4. 对 Runtime 程序,必须能展示 controller commands、trace、motion queue、IO image、trajectory。
+5. 对 Static/error 程序,必须能展示 expected diagnostics 和实际 diagnostics。
+6. 对 Post 程序,必须能展示 ABB/FANUC/KUKA 文件名、post report 和 roundtrip 状态。
+7. 页面必须保留桌面和移动端截图证据,便于远程验收。
+
+### 7.5 验收结论口径
+
+只有同时满足以下条件,服务器演示包才可以标记为通过:
+
+1. 本地 `npm run typecheck`、`npm test`、`npm run suite:abb120-spec`、`npm run verify:virtual-controller` 通过。
+2. 演示包包含 19 个 `.grl` 程序和最新 `W2-JOB-*` 证据。
+3. 远程 `https://82.156.24.101:8095/` 可打开,无证书阻断以外的页面错误。
+4. 远程页面能访问 `demo-manifest.json`、`report.json`、`virtual-controller.html` 和截图文件。
+5. 远程 smoke test 记录到 `working2/05-验收证据.md`。
diff --git a/working2/02-项目程序开发详细步骤.md b/working2/02-项目程序开发详细步骤.md
new file mode 100644
index 0000000..f80dd24
--- /dev/null
+++ b/working2/02-项目程序开发详细步骤.md
@@ -0,0 +1,378 @@
+# 02-项目程序开发详细步骤
+
+版本:0.1
+日期:2026-06-28
+
+## 1. 开发原则
+
+1. 以 `通用机器人编程语法规范.md` 为覆盖源,不以现有测试数量作为完成标准。
+2. ABB120 URDF 使用仓库内稳定 fixture,不引入未验证机器人模型。
+3. happy path 必须可执行;error path 必须可诊断;post path 必须可报告。
+4. 虚拟控制器只执行 Semantic IR,不直接解释品牌文本。
+5. 所有新增程序都要保留 source map,报告必须能定位到 GRL 文件行列。
+
+## 2. 阶段 0:规范覆盖矩阵
+
+### W2-SPEC-001:解析语法规范章节
+
+步骤:
+
+1. 从 `work/doc/通用机器人编程语法规范.md` 抽取章节、关键语法、示例和语义规则。
+2. 建立 coverage item,字段包含 `spec_section`、`syntax`、`runtime_level`、`program_id`、`test_id`、`evidence`。
+3. 把覆盖矩阵写入 `working2/programs/manifest.md`。
+
+验收:章节 4 到 23 均有覆盖项;章节 25 的 P0 项全部映射到 runtime 或 static 测试。
+
+### W2-SPEC-002:定义执行边界
+
+步骤:
+
+1. 标记虚拟控制器必须执行的 Runtime 语义。
+2. 标记只做 semantic diagnostic 的 Static 语义。
+3. 标记只做后处理/导入报告的 Post 语义。
+4. 对 trap、interrupt、task、brand metadata 等非 P0 执行项写清楚边界。
+
+验收:覆盖矩阵中每项都有 `Runtime/Static/Post` 分类,不允许空白。
+
+## 3. 阶段 1:ABB120 程序集
+
+### W2-PROG-001:建立 spec-programs 目录
+
+建议目录:
+
+```text
+kdl-wasm/web/tests/fixtures/abb120/spec-programs/
+ runtime/
+ static/
+ error/
+ post/
+ expected/
+```
+
+验收:测试 helper 可以枚举所有 `.grl` 并读取 manifest。
+
+### W2-PROG-010:Runtime 程序
+
+步骤:
+
+1. 创建 `W2_00` 到 `W2_90` 十个 runtime 程序,并以 `W2_99_FullSpecExample` 覆盖第 24 章完整示例。
+2. 所有运动目标使用 ABB120 标准关节位或 FK 固化 pose。
+3. 每个程序顶部注释写明覆盖的 spec section。
+4. 每个程序必须可 parse、compile、load 到虚拟控制器。
+
+验收:runtime 程序全部生成 AST/IR/source map snapshot。
+
+### W2-PROG-020:Static/error 程序
+
+步骤:
+
+1. 创建表达式、语义、运动、控制流、runtime timeout 五类 error 程序。
+2. 每个 error 程序只聚焦一类错误,避免多个错误互相遮蔽。
+3. expected diagnostic 固化 `code/severity/message/sourceRange`。
+
+验收:diagnostic snapshot 稳定,新增或消失的错误会导致测试失败。
+
+### W2-PROG-030:Post/import 程序
+
+步骤:
+
+1. 创建品牌 hint 和跨品牌 motion 程序。
+2. 覆盖 ABB/FANUC/KUKA speed、zone、IO、wait、operation 输出。
+3. 固化 roundtrip 输入和差异报告。
+
+验收:三品牌输出非空,近似和不支持项进入 report。
+
+## 4. 阶段 2:编译和 KDL 验证
+
+### W2-RUN-001:统一 suite runner
+
+步骤:
+
+1. 扩展或新增 `runAbb120SpecSuite`。
+2. 输入:program root、suite id、ABB120 fixture、output root。
+3. 输出:`job_id`、程序 manifest、每个程序的 compile/run/post 结果。
+4. job id 格式:`W2-JOB-YYYYMMDD-HHMMSS-`。
+
+验收:单条命令可生成完整 suite 证据目录。
+
+### W2-RUN-010:编译链路
+
+步骤:
+
+1. `parseGrl` 生成 AST。
+2. `compileSemanticProgram` 生成 IR。
+3. 对 data/target/path/operation 建 source map 索引。
+4. 保存 AST/IR 摘要,不保存过大的重复文本。
+
+验收:每个 runtime/post 程序 compile 无 error;每个 error 程序 compile 输出预期 diagnostic。
+
+### W2-RUN-020:ABB120 KDL 检查
+
+步骤:
+
+1. 加载 ABB120 URDF。
+2. 对所有 joint target 做 limit check。
+3. 对所有 pose target 做 IK 或记录当前实现边界 diagnostic。
+4. 对每条 motion/path 生成 planner request。
+
+验收:happy path 没有关节限位错误;不可达或不支持 IK 只能出现在 error suite。
+
+## 5. 阶段 3:虚拟控制器执行
+
+### W2-RUN-030:状态机命令覆盖
+
+步骤:
+
+1. 对每个 runtime 程序执行 `load/start/step/hold/resume/stepMotion/stop/resetFault`。
+2. 记录每次命令前后状态。
+3. 非法命令转移必须产生明确 diagnostic。
+
+验收:状态机转换符合控制器规则,trace 可回放。
+
+### W2-RUN-040:Motion Queue 和轨迹
+
+步骤:
+
+1. 将 `movej/movel/movec/run_path/run_operation` 展开到 motion queue。
+2. 记录 queue item、activeIndex、duration、planner result。
+3. 对轨迹采样点做 limit 和 singularity 检查。
+
+验收:motion queue 与程序 source map 对齐;轨迹结果可进入报告。
+
+### W2-RUN-050:IO、wait、pulse 和报警
+
+步骤:
+
+1. 为 `W2_60_IOWaitPulse` 注入 DI 脚本。
+2. 覆盖 wait satisfied、waiting、timeout、on_timeout alarm/call。
+3. 覆盖 pulse 自动复位。
+4. 覆盖 all/any/rising/falling/changed。
+
+验收:trace 中可看到 IO 写入、DI 变化、wait 状态、pulse reset 和 alarm。
+
+### W2-RUN-060:流程控制和调用栈
+
+步骤:
+
+1. 执行 if/elseif/else、while、for、switch。
+2. 记录局部变量、循环变量、call stack、return。
+3. out/inout 参数回写进入变量快照。
+
+验收:最终变量状态符合预期,source map 可定位当前执行语句。
+
+## 6. 阶段 4:后处理和导入回读
+
+### W2-POST-010:三品牌 post
+
+步骤:
+
+1. 对 runtime/post 程序调用 `postProcessAllBrands`。
+2. 保存 ABB `.mod`、FANUC `.ls`、KUKA `.src/.dat`。
+3. 保存 post report,记录近似和 unsupported。
+
+验收:所有品牌输出包含对应 motion、IO、wait 和 proc 结构。
+
+### W2-POST-020:roundtrip
+
+步骤:
+
+1. 将三品牌输出重新导入。
+2. 对比 motion 顺序、target 数量、path/operation 结构。
+3. 对差异生成 `roundtrip.json`。
+
+验收:happy path 结构等价;不可逆项全部进入 diff。
+
+## 7. 阶段 5:HTML 虚拟控制器验收
+
+### W2-UI-010:加载最新 job
+
+步骤:
+
+1. HTML 页面支持选择或加载 `W2-JOB-*` 证据。
+2. 显示程序列表、当前程序、controller snapshot、queue、trace、diagnostics。
+3. 点击 trace/source map 能定位 GRL 行。
+
+验收:页面能展示 working2 suite 证据,不只展示静态 mock 数据。
+
+### W2-UI-020:截图验证
+
+步骤:
+
+1. 使用现有 `verify-virtual-controller.mjs` 或新增参数打开 working2 job。
+2. 截桌面和移动视口。
+3. 检查 command bar、object tree、viewport、pendant、editor、bottom panel 可见。
+4. 检查无横向溢出和文字重叠。
+
+验收:生成 desktop/mobile 截图和 `evidence.json`。
+
+## 8. 阶段 6:全量 CI
+
+建议命令:
+
+```powershell
+cd E:\Work\kdl_work
+npm run typecheck
+npm test -- grl abb120 virtual controller runtime post import
+npm run verify:virtual-controller
+```
+
+如果需要 WASM native 验证:
+
+```powershell
+cmake --build kdl-wasm/build-wasm -j16
+```
+
+验收:所有命令通过,`working2/05-验收证据.md` 记录实际命令、时间、job_id、report_id 和产物路径。
+
+## 9. 阶段 7:服务器演示包和 HTTPS 发布
+
+### W2-DEPLOY-001:生成演示包 manifest
+
+步骤:
+
+1. 读取 `kdl-wasm/web/tests/fixtures/abb120/spec-programs/manifest.json`。
+2. 读取最新 `kdl-wasm/web/test-results/abb120-spec/W2-JOB-*`。
+3. 读取 `kdl-wasm/web/test-results/virtual-controller/evidence.json`。
+4. 生成 `demo-manifest.json`,字段至少包含:
+ - `release_id`
+ - `generated_at`
+ - `suite_id`
+ - `job_id`
+ - `program_count`
+ - `programs`
+ - `report_json`
+ - `virtual_controller_entry`
+ - `screenshots`
+ - `docs`
+5. manifest 中路径必须是相对发布根目录的 URL 路径,不能写本机绝对路径。
+
+验收:`demo-manifest.json` 可被浏览器直接打开,能定位 19 个程序、最新报告和截图。
+
+### W2-DEPLOY-010:收集演示包文件
+
+建议目录:
+
+```text
+kdl-wasm/web/test-results/deploy/kdl-olp-demo-/
+ app/
+ spec-programs/
+ test-results/
+ docs/
+ index.html
+ demo-manifest.json
+ README.md
+```
+
+步骤:
+
+1. 复制 `kdl-wasm/web/app/virtual-controller.html/css/js` 到 `app/`。
+2. 复制 `spec-programs/manifest.json` 和所有 `.grl` 程序。
+3. 复制最新 W2 job 目录。
+4. 复制虚拟控制器截图和 `evidence.json`。
+5. 复制 Word 手册和测试文档:
+ - `work/doc/GRL功能语法逻辑与程序创建使用手册.docx`
+ - `work/doc/通用机器人离线编程系统测试文档.docx`
+6. 生成 `index.html`,至少提供:
+ - 虚拟控制器入口
+ - 最新 job 报告入口
+ - 程序清单入口
+ - 截图入口
+ - 文档下载入口
+
+验收:本地打开发布包根目录时,所有链接不依赖开发机绝对路径。
+
+### W2-DEPLOY-020:打包发布归档
+
+步骤:
+
+1. 将演示包目录压缩为 `kdl-olp-demo-.zip`。
+2. 计算 zip 文件大小和 hash。
+3. 将 zip、release_id、job_id 写入 `working2/05-验收证据.md`。
+
+验收:zip 可解压,解压后包含 `index.html`、`demo-manifest.json`、19 个 `.grl` 和最新 job。
+
+### W2-DEPLOY-030:上传到服务器
+
+目标:
+
+```text
+https://82.156.24.101:8095/
+/opt/kdl-olp-demo/8095/releases/
+/opt/kdl-olp-demo/8095/current -> releases/
+```
+
+步骤:
+
+1. 使用 `scp` 或等效方式上传 zip 到服务器临时目录。
+2. 在服务器创建 release 目录并解压。
+3. 更新 `current` 软链接指向新 release。
+4. 确认 Web 服务根目录指向 `current`。
+5. 不在仓库文档中记录服务器密码;凭据只保留在部署人员本地。
+
+验收:服务器上存在 release 目录,`current` 指向最新 release。
+
+### W2-DEPLOY-040:HTTPS 服务验证
+
+步骤:
+
+1. 打开 `https://82.156.24.101:8095/`。
+2. 验证 `index.html` 能加载。
+3. 验证以下 URL 可访问:
+ - `/demo-manifest.json`
+ - `/app/virtual-controller.html`
+ - `/test-results/abb120-spec//report.json`
+ - `/test-results/abb120-spec//report.html`
+ - `/test-results/virtual-controller/virtual-controller-desktop.png`
+ - `/spec-programs/manifest.json`
+4. 在浏览器中进入虚拟控制器页面,检查页面显示 suite/job/program/trace/queue/IO/diagnostics。
+5. 如证书为自签名,记录浏览器安全提示为环境说明,不作为功能失败;如页面资源 404 或 JS 错误,则发布失败。
+
+验收:远程页面可演示 19 个程序和最新 job 证据。
+
+### W2-DEPLOY-050:远程 smoke test
+
+建议命令:
+
+```powershell
+$base = "https://82.156.24.101:8095"
+curl.exe -k "$base/"
+curl.exe -k "$base/demo-manifest.json"
+curl.exe -k "$base/spec-programs/manifest.json"
+curl.exe -k "$base/app/virtual-controller.html"
+curl.exe -k "$base/test-results/abb120-spec//report.json"
+```
+
+检查:
+
+1. HTTP 状态为 200。
+2. `demo-manifest.json` 中 `program_count` 为 19。
+3. `report.json` 中 `fail` 为 0。
+4. 页面资源无 404。
+
+验收:命令输出摘要写入 `working2/05-验收证据.md`。
+
+### W2-DEPLOY-060:回滚
+
+步骤:
+
+1. 服务器保留至少最近 2 个 release。
+2. 新版本验证失败时,将 `current` 重新指向上一个 release。
+3. 再次访问 `https://82.156.24.101:8095/` 验证旧版本恢复。
+4. 在 `working2/03-推进台账.md` 记录回滚原因和 release_id。
+
+验收:回滚后远程页面恢复到上一个可用版本。
+
+## 10. 后续完善程序时的固定流程
+
+每次新增或修改虚拟测试程序,都按以下顺序推进:
+
+1. 修改 `.grl` 程序和 `spec-programs/manifest.json`。
+2. 更新 `working2/programs/manifest.md` 的覆盖矩阵。
+3. 执行 `npm run typecheck`。
+4. 执行 `npm test`。
+5. 执行 `npm run suite:abb120-spec`,生成新 `W2-JOB-*`。
+6. 执行 `npm run verify:virtual-controller`,刷新截图。
+7. 重新生成 Word 测试文档和 GRL 使用手册,如内容发生变化。
+8. 重新生成服务器演示包并发布到 HTTPS。
+9. 更新 `working2/03-推进台账.md`、`04-任务矩阵.md`、`05-验收证据.md`。
+10. 提交代码并上传云仓库。
diff --git a/working2/03-推进台账.md b/working2/03-推进台账.md
new file mode 100644
index 0000000..8b52170
--- /dev/null
+++ b/working2/03-推进台账.md
@@ -0,0 +1,183 @@
+# 03-推进台账
+
+版本:0.1
+日期:2026-06-28
+
+## 轮次 001:创建 working2 任务整合包
+
+### 本轮目标
+
+根据用户要求,将“对标 `通用机器人编程语法规范.md`、以 ABB120 URDF 为基础创建覆盖语法规范的机器人程序集、全面完成虚拟控制器执行测试”的功能任务整合到 `working2`,并参考 `working1` 的文档组织方式。
+
+### 已读取和确认
+
+1. `working2` 原本只有 `README.md`,内容为“空任务集审计”。
+2. `working1` 已有 ABB120 fixture、GRL 程序集、运算表达式、虚拟控制器、后处理、验收证据和决策记录的完整文档。
+3. 当前语法规范已包含新增的 `## 7. 表达式与运算`,并顺延到 `## 26. 参考资料`。
+4. 仓库中已有 `kdl-wasm/web/src/fixtures/abb120.ts`、`kdl-wasm/web/tests/fixtures/abb120/programs`、`kdl-wasm/web/src/suites/abb120Suite.ts`、`kdl-wasm/web/app/virtual-controller.html/css/js`。
+
+### 本轮产出
+
+1. 重写 `working2/README.md`。
+2. 新增 `working2/01-项目功能内容.md`。
+3. 新增 `working2/02-项目程序开发详细步骤.md`。
+4. 新增 `working2/04-任务矩阵.md`。
+5. 新增 `working2/05-验收证据.md`。
+6. 新增 `working2/06-决策记录.md`。
+7. 新增 `working2/programs/manifest.md`。
+
+### 当前边界
+
+1. 本轮只做任务整合和实施规范,不新增产品代码和 `.grl` 程序文件。
+2. `working2` 的任务状态默认 `Todo`,不沿用 `working1` 的 `Done` 状态。
+3. 已有 `working1` 实现可以作为依赖和参考,但 `working2` 必须按完整语法规范重新证明覆盖。
+4. trap、interrupt、task、brand metadata 不强行列入虚拟控制器 happy path;使用 static/post 证据覆盖。
+
+### 下一步
+
+1. 创建 `kdl-wasm/web/tests/fixtures/abb120/spec-programs` 目录和首批 `W2_*.grl`。
+2. 实现 `runAbb120SpecSuite` 或扩展 `runAbb120Suite` 支持 working2 manifest。
+3. 添加 coverage test,确保 `manifest.md` 中每个 spec section 有对应程序和证据。
+4. 执行 `npm test -- grl abb120 virtual controller runtime post import` 并记录实际结果。
+
+## 轮次 002:实现 working2 程序集、runner 和验收证据
+
+### 本轮目标
+
+把轮次 001 的任务包落到仓库实现:创建 ABB120 spec-programs 程序集,新增 W2 suite runner,接入测试、HTML 页面和证据包生成命令。
+
+### 本轮产出
+
+1. 新增 `kdl-wasm/web/tests/fixtures/abb120/spec-programs/manifest.json`。
+2. 新增 `runtime/W2_00` 到 `runtime/W2_90` 共 10 个 runtime 程序。
+3. 新增 `static/error` 诊断程序 `W2_E10` 到 `W2_E50` 共 5 个,其中 `W2_E50` 作为 runtime timeout error 进入 Runtime 层级。
+4. 新增 `post/W2_P10` 到 `post/W2_P30` 共 3 个 post/import 程序。
+5. 新增 `kdl-wasm/web/src/suites/abb120SpecSuite.ts` 和 `kdl-wasm/web/scripts/run-abb120-spec-suite.ts`。
+6. 新增 `kdl-wasm/web/tests/integration/abb120SpecSuite.test.ts`。
+7. 更新 HTML 虚拟控制器显示 `working2-abb120-spec` 和 `W2-JOB-latest`。
+8. 修复 `compileIo` 在 wait 无 `on_timeout` 时越界的问题;控制流 parser 对 `try` 块改为 raw boundary,由 exception parser 负责异常语义。
+
+### 验收摘要
+
+1. `npm run suite:abb120-spec` 通过,生成 `W2-JOB-20260628013857-19b5a2c7`。
+2. `npm run typecheck` 通过。
+3. `npm test` 通过,41 个测试文件、155 个测试。
+4. `npm run verify:virtual-controller` 通过,生成桌面和移动截图。
+
+### 当前边界
+
+1. `trap`、`interrupt`、`task` 仍按 P1 unsupported/runtime boundary 记录 warning,不作为 happy path 实时执行。
+2. `@brand.*` 语法尚未作为 lexer/parser 原生结构实现,本轮以后处理 `post_hint` 和 report 边界覆盖品牌扩展。
+3. W2 runner 的 motion trajectory 使用同步 fixture planner 生成审计证据;真实 ABB120 KDL 规划仍由既有 `abb120Programs.test.ts` 覆盖。
+
+## 轮次 003:补齐完整示例和 manifest 机器校验
+
+### 本轮目标
+
+接续轮次 002,对 working2 的“文档已 Done 但机器校验不足”部分做收口:把规范第 24 章完整示例落为实际 runtime 程序,并让 manifest 的层级、程序引用、预期诊断和 job 结果成为自动测试合同。
+
+### 本轮产出
+
+1. 新增 `runtime/W2_99_FullSpecExample.grl`,覆盖完整示例的 tool/frame、path、operation、IO event、run_operation 和回 home。
+2. 更新 `spec-programs/manifest.json`,程序总数为 19;coverage 章节 4 到 25 缺失为空;层级统计 Runtime 12、Static 4、Post 3。
+3. 强化 `abb120SpecSuite.test.ts`,检查 coverage matrix 引用存在、层级自一致、expected status 和 expected diagnostics 全部出现在 job 结果中。
+4. 强化 `runAbb120SpecSuite` 静态预检,补充表达式、多 motion/KDL 边界、proc/function 和 control-flow 多诊断采集。
+5. 新增最新证据包 `W2-JOB-20260628022836-51484d62`。
+
+### 验收摘要
+
+1. `npm test -- abb120SpecSuite` 通过。
+2. `npm run typecheck` 通过。
+3. `npm run suite:abb120-spec` 通过,生成 19 个程序的 job,missingSections 为空。
+
+### 当前边界
+
+1. `@brand.*` 仍为后续 parser 原生语法扩展边界,当前通过 `post_hint` 和 post report 覆盖。
+2. suite runner 的 KDL 诊断仍使用同步 fixture planner;真实 KDL/URDF 规划由既有 ABB120 集成测试覆盖。
+
+## 轮次 004:补充服务器演示包和 HTTPS 发布实施文档
+
+### 本轮目标
+
+根据“虚拟测试程序打包到服务器,能通过这些程序演示虚拟控制器全部功能”的要求,完善 `working2` 实施文档,形成后续程序完善、打包、发布、远程验收和回滚的固定流程。
+
+### 本轮产出
+
+1. 更新 `working2/README.md`,增加服务器演示包目标、文档入口和 `W2-DEPLOY-*` 任务范围。
+2. 更新 `working2/01-项目功能内容.md`,增加服务器演示包功能要求、发布目标、包内容、演示能力清单和验收口径。
+3. 更新 `working2/02-项目程序开发详细步骤.md`,增加阶段 7:演示包 manifest、文件收集、zip、上传、HTTPS 验证、远程 smoke test 和回滚。
+4. 更新 `working2/04-任务矩阵.md`,新增 `W2-DEPLOY-001` 到 `W2-DEPLOY-060` 任务和子任务。
+5. 更新 `working2/05-验收证据.md`,新增部署证据项、远程 smoke test 命令、发布记录模板和人工验收模板。
+6. 新增 `working2/07-服务器发布与演示包实施方案.md`,作为发布实施主文档。
+7. 更新 `working2/06-决策记录.md`,新增服务器发布包 ADR。
+
+### 当前边界
+
+1. 本轮只完善项目实施文档,没有实际上传服务器。
+2. 服务器凭据不写入仓库文档;文档只记录发布地址、端口、目录规范和验收要求。
+3. 后续需要新增 `build-demo-package.mjs`、`verify-demo-package.mjs`、`deploy-demo-package.ps1` 等脚本,才能把 `W2-DEPLOY-*` 推进到 Done。
+4. HTTPS 证书若为自签名,浏览器安全提示记录为环境说明;资源 404、JS 错误或 report fail 非 0 才视为发布失败。
+
+### 下一步
+
+1. 实现演示包构建脚本,生成 `demo-manifest.json`、首页和 zip。
+2. 实现本地 zip 校验脚本,检查 19 个程序、最新 job、截图和 Word 文档。
+3. 上传到 `https://82.156.24.101:8095/` 对应服务器目录并执行远程 smoke test。
+4. 将发布证据写入 `working2/05-验收证据.md`。
+
+## 轮次 005:实现演示包自动化并发布 HTTPS 服务器
+
+### 本轮目标
+
+把轮次 004 文档中的 `W2-DEPLOY-*` 从待实现推进到可验收:生成服务器演示包、校验 zip、上传 HTTPS 服务器、切换 current、保留 previous 并完成远程 smoke test。
+
+### 本轮产出
+
+1. 新增 `kdl-wasm/web/scripts/build-demo-package.mjs`,收集虚拟控制器 app、19 个 `spec-programs`、最新 W2 job、截图、Word 文档和 working2 文档,生成 `demo-manifest.json`、`index.html`、README 和 zip。
+2. 新增 `kdl-wasm/web/scripts/verify-demo-package.mjs`,解压 zip 并校验 19 个 `.grl`、`report.json`、截图、2 份 Word 文档、相对 URL 和 `summary.fail=0`。
+3. 新增 `kdl-wasm/web/scripts/deploy-demo-package.ps1`,提供上传 zip、远程解压、切换 current、保留 previous 和 HTTPS smoke test 的可复用发布脚本。
+4. 更新 `package.json`,新增 `npm run demo:build`、`npm run demo:verify`、`npm run demo:deploy`。
+5. 修正演示包 zip 生成为跨平台 `/` 路径条目,避免 Windows zip 在 Linux `unzip` 后出现反斜杠路径。
+6. 发布 release `20260628-120601-W2-JOB-20260628024709-51484d62` 到 `https://82.156.24.101:8095/`。
+
+### 验收摘要
+
+1. `npm run demo:build` 通过,生成 `kdl-wasm/web/test-results/deploy/kdl-olp-demo-20260628-120601-W2-JOB-20260628024709-51484d62.zip`。
+2. `npm run demo:verify -- kdl-wasm/web/test-results/deploy/kdl-olp-demo-20260628-120601-W2-JOB-20260628024709-51484d62.zip` 通过,`program_count=19`、`.grl=19`、`summary.fail=0`。
+3. 服务器 `/opt/kdl-olp-demo/8095/current` 指向 `/opt/kdl-olp-demo/8095/releases/20260628-120601-W2-JOB-20260628024709-51484d62`。
+4. 服务器 `/opt/kdl-olp-demo/8095/previous` 指向 `/opt/kdl-olp-demo/8095/releases/20260628-120357-W2-JOB-20260628024709-51484d62`。
+5. HTTPS smoke test 通过:`/`、`/demo-manifest.json`、`/spec-programs/manifest.json`、`/app/virtual-controller.html`、`report.json`、`report.html`、desktop/mobile png 全部返回 200。
+
+### 当前边界
+
+1. 8095 服务使用服务器现有自签名证书,浏览器可能提示证书风险;资源访问和报告验证已通过。
+2. 发布时使用本地凭据完成服务器操作,但凭据不写入仓库脚本或 working2 文档。
+
+## 轮次 006:补齐程序切换和逐帧 TCP/关节轨迹展示
+
+### 本轮目标
+
+回应远程页面验收问题:`/app/virtual-controller.html` 不能只展示静态模拟状态,必须能切换 19 个 W2 程序,并显示程序实际执行产物中的每一帧 TCP 和 6 轴关节值。
+
+### 本轮产出
+
+1. 更新 `runAbb120SpecSuite` 轨迹摘要,`trajectory.json` 新增 `frames[]`,每帧包含 `index`、`time`、`motion`、`segmentId/targetId`、`joints[6]`、`tcp.position[3]`、`tcp.quaternion[4]`、`sourceMap` 和 diagnostics。
+2. 更新 `abb120SpecSuite.test.ts`,要求至少一个 Runtime 程序产出带 6 轴关节和 TCP 姿态的逐帧轨迹。
+3. 重构 `virtual-controller.html/css/js`,页面从 `demo-manifest.json` 读取 19 个程序,通过顶部 Program 下拉切换程序;`Load/Run/Step` 操作当前程序轨迹帧;底部 `Trajectory Frames` 表格展示每帧 TCP XYZ、TCP Q 和 J1-J6。
+4. 更新 `verify-demo-package.mjs`,新增 `runtime_trajectory_frames` 检查,防止发布包里的 Runtime 轨迹退化成只有摘要字段。
+5. 修复 `deploy-demo-package.ps1`:函数调用顺序、远端命令拼接、服务重启、自签名 HTTPS smoke test 和 `previous` 回滚指针处理。
+6. 重新生成 W2 job `W2-JOB-20260628082622-51484d62`,发布最终 release `20260628-164048-W2-JOB-20260628082622-51484d62` 到 `https://82.156.24.101:8095/`。
+
+### 验收摘要
+
+1. `npm run typecheck` 通过。
+2. `npm test -- kdl-wasm/web/tests/integration/abb120SpecSuite.test.ts kdl-wasm/web/tests/integration/abb120SuiteArtifacts.test.ts` 通过。
+3. `npm run suite:abb120-spec` 通过,生成 19 个程序的 job,missingSections 为空。
+4. `npm run verify:virtual-controller` 通过;桌面/移动截图均无横向溢出,`Run` 后状态为 `running`,DI wait 为 `satisfied`。
+5. `npm run demo:verify -- ` 通过,`runtime_trajectory_frames=9/12`。
+6. 远程抽查通过:`W2_30_MotionAllTypes` 有 12 帧,`W2_60_IOWaitPulse` 有 4 帧,`W2_99_FullSpecExample` 有 32 帧,均包含 joints 和 TCP。
+
+### 当前边界
+
+1. 没有可规划运动段的 Runtime/Static/Post 程序不会伪造轨迹;页面显示 `NO_MOTION` 单帧占位,并保留编译、诊断、trace、post/roundtrip 产物。
+2. 8095 HTTPS 仍使用现有自签名证书;自动 smoke test 使用不校验证书的发布验证路径。
diff --git a/working2/04-任务矩阵.md b/working2/04-任务矩阵.md
new file mode 100644
index 0000000..2043f9a
--- /dev/null
+++ b/working2/04-任务矩阵.md
@@ -0,0 +1,88 @@
+# 04-任务矩阵
+
+版本:0.1
+日期:2026-06-28
+
+## 1. 状态定义
+
+| 状态 | 含义 |
+| --- | --- |
+| Todo | 尚未开始实现。 |
+| Doing | 正在执行。 |
+| Blocked | 被依赖、环境或设计问题阻塞。 |
+| Review | 已实现,等待复核或补证据。 |
+| Done | 已实现且验收证据完整。 |
+
+## 2. 任务总表
+
+| 编号 | 任务 | 状态 | 依赖 | 验收标准 |
+| --- | --- | --- | --- | --- |
+| W2-SPEC-000 | 创建 working2 任务文档 | Done | 无 | README、功能、步骤、台账、矩阵、证据、决策、manifest 均存在。 |
+| W2-SPEC-001 | 语法规范覆盖矩阵 | Done | W2-SPEC-000 | 规范章节 4 到 25 已映射到 Runtime/Static/Post 覆盖项。 |
+| W2-SPEC-002 | 执行边界分类 | Done | W2-SPEC-001 | 每项语义已标明虚拟执行、静态诊断或后处理验收方式。 |
+| W2-PROG-001 | 建立 spec-programs 目录 | Done | W2-SPEC-001 | runtime/static/error/post/expected 目录和 `manifest.json` 可被测试读取。 |
+| W2-PROG-010 | Runtime 覆盖项 12 个 | Done | W2-PROG-001 | `W2_00` 到 `W2_99` happy path 和 `W2_E50` runtime timeout 可 parse、compile、load。 |
+| W2-PROG-020 | Static/error 程序 5 类 | Done | W2-PROG-001 | 4 类 static diagnostic 和 1 类 runtime timeout 输出 stable diagnostic 证据。 |
+| W2-PROG-030 | Post/import 程序 3 个 | Done | W2-PROG-001 | 三品牌输出和 roundtrip 差异可验证。 |
+| W2-RUN-001 | ABB120 spec suite runner | Done | W2-PROG-010 | `npm run suite:abb120-spec` 输出 `W2-JOB-*` 证据目录。 |
+| W2-RUN-010 | 编译链路证据 | Done | W2-RUN-001 | AST/IR 摘要、source map、diagnostics 产物完整。 |
+| W2-RUN-020 | ABB120 KDL 检查 | Done | W2-RUN-001 | limit、reachability/边界和 planner request 结果可审计;真实 KDL 由既有 ABB120 集成测试覆盖。 |
+| W2-RUN-030 | 虚拟控制器状态机覆盖 | Done | W2-RUN-010 | load/start/step/hold/resume/stepMotion/stop/resetFault 均有命令记录。 |
+| W2-RUN-040 | Motion Queue 和轨迹证据 | Done | W2-RUN-020, W2-RUN-030 | queue、activeIndex、duration、trajectory、planner diagnostics 完整;Runtime 轨迹产物包含逐帧 joints[6] 和 TCP position/quaternion。 |
+| W2-RUN-050 | IO/wait/pulse/alarm 执行 | Done | W2-RUN-030 | wait satisfied/timeout、pulse reset、边沿检测和报警可验证。 |
+| W2-RUN-060 | 流程控制和调用栈执行 | Done | W2-RUN-030 | if/while/for/switch/call/return/out/inout 有编译和 runtime trace 证据。 |
+| W2-POST-010 | 三品牌后处理 | Done | W2-PROG-030, W2-RUN-010 | ABB/FANUC/KUKA 输出和 post report 完整。 |
+| W2-POST-020 | 品牌导入回读 | Done | W2-POST-010 | roundtrip diff 记录等价和不可逆项。 |
+| W2-UI-010 | HTML 虚拟控制器加载 W2 job | Done | W2-RUN-001 | 页面从 demo-manifest 读取 19 个 W2 程序,支持 Program 下拉切换,并展示 suite/job、program、queue、trace、IO、diagnostics、report。 |
+| W2-UI-020 | HTML 截图和交互验证 | Done | W2-UI-010 | desktop/mobile 截图、evidence.json、无横向溢出。 |
+| W2-UI-030 | HTML 逐帧 TCP/关节展示 | Done | W2-RUN-040, W2-UI-010 | `Trajectory Frames` 表格展示当前程序每帧 time、motion、target、TCP XYZ、TCP Q 和 J1-J6;Run/Step/Frame slider 可切换当前帧。 |
+| W2-DEPLOY-001 | 服务器演示包 manifest | Done | W2-RUN-001, W2-UI-020 | 已生成 `demo-manifest.json`,包含 release_id、job_id、19 个程序、报告、截图和文档入口,路径均为相对 URL。 |
+| W2-DEPLOY-010 | 演示包文件收集 | Done | W2-DEPLOY-001 | 已包含 app、spec-programs、latest job、virtual-controller screenshots、Word 手册、测试文档和首页。 |
+| W2-DEPLOY-020 | 演示包 zip 和校验 | Done | W2-DEPLOY-010 | 已生成并校验 `kdl-olp-demo-20260628-164048-W2-JOB-20260628082622-51484d62.zip`,解压后 19 个 `.grl`、`report.json`、逐帧轨迹、截图、文档均存在。 |
+| W2-DEPLOY-030 | 上传服务器并切换 current | Done | W2-DEPLOY-020 | 服务器 `/opt/kdl-olp-demo/8095/current` 已指向最新 release,HTTPS 服务读取新包。 |
+| W2-DEPLOY-040 | HTTPS 远程页面验证 | Done | W2-DEPLOY-030 | `https://82.156.24.101:8095/`、`demo-manifest.json`、`virtual-controller.html`、`report.json`、截图均返回 200。 |
+| W2-DEPLOY-050 | 远程 smoke test 证据 | Done | W2-DEPLOY-040 | 远程验证结果已写入 `working2/05-验收证据.md`,`program_count=19` 且 `fail=0`。 |
+| W2-DEPLOY-060 | 发布回滚机制 | Done | W2-DEPLOY-030 | 服务器保留 previous release 指针,最终部署前一版为 `20260628-163458-W2-JOB-20260628082622-51484d62`。 |
+| W2-CI-900 | 全量 CI 验收 | Done | W2-RUN-060, W2-POST-020, W2-UI-020 | typecheck、test、verify 全部通过;WASM build 未执行,沿用既有可选边界。 |
+
+## 3. Runtime 程序子任务
+
+| 子任务 | 程序 | 覆盖章节 | 状态 | 验收 |
+| --- | --- | --- | --- | --- |
+| W2-PROG-010.1 | `W2_00_MinimalModule.grl` | 4、5、6、9、10、23 | Done | 最小 movej 可执行。 |
+| W2-PROG-010.2 | `W2_10_DataTargetToolFrame.grl` | 6、8、9 | Done | tool/frame/target 编译为 IR。 |
+| W2-PROG-010.3 | `W2_20_ExpressionMath.grl` | 7 | Done | 表达式折叠结果进入 speed/zone/pose/wait。 |
+| W2-PROG-010.4 | `W2_30_MotionAllTypes.grl` | 10 | Done | movej/movel/movec 和 set_* 执行。 |
+| W2-PROG-010.5 | `W2_40_PathEvents.grl` | 11 | Done | before/after/at distance event 进入 trace。 |
+| W2-PROG-010.6 | `W2_50_OperationProcess.grl` | 12 | Done | operation 展开为 start/path/end。 |
+| W2-PROG-010.7 | `W2_60_IOWaitPulse.grl` | 13 | Done | IO、wait、pulse、边沿检测执行。 |
+| W2-PROG-010.8 | `W2_70_ControlFlow.grl` | 14 | Done | 分支、循环、switch 状态正确。 |
+| W2-PROG-010.9 | `W2_80_ProcFuncCall.grl` | 15 | Done | 参数方向、call stack、return 正确。 |
+| W2-PROG-010.10 | `W2_90_ExceptionAlarm.grl` | 16 | Done | alarm/raise/try/catch/finally trace 正确;trap/task 为 P1 warning。 |
+| W2-PROG-010.11 | `W2_99_FullSpecExample.grl` | 24 | Done | 完整示例 path/operation/proc/run_operation 可执行并输出 queue 证据。 |
+
+## 4. Static/Post 子任务
+
+| 子任务 | 程序 | 层级 | 状态 | 验收 |
+| --- | --- | --- | --- | --- |
+| W2-PROG-020.1 | `W2_E10_ExpressionDiagnostics.grl` | Static | Done | 表达式 diagnostic 覆盖。 |
+| W2-PROG-020.2 | `W2_E20_SemanticDiagnostics.grl` | Static | Done | 语义检查 diagnostic 覆盖。 |
+| W2-PROG-020.3 | `W2_E30_MotionDiagnostics.grl` | Static/KDL | Done | 限位、不可达、空 path 诊断稳定。 |
+| W2-PROG-020.4 | `W2_E40_ControlFlowDiagnostics.grl` | Static | Done | 非法控制流诊断稳定。 |
+| W2-PROG-020.5 | `W2_E50_RuntimeTimeout.grl` | Runtime error | Done | wait timeout 和 on_timeout 证据完整。 |
+| W2-PROG-030.1 | `W2_P10_BrandHints.grl` | Post | Done | post_hint 进入 report;`@brand.*` 为后续 parser 扩展边界。 |
+| W2-PROG-030.2 | `W2_P20_CrossBrandMotion.grl` | Post | Done | 三品牌 motion/IO/wait 输出完整。 |
+| W2-PROG-030.3 | `W2_P30_Roundtrip.grl` | Post | Done | 导入回读结构等价或 diff 明确。 |
+
+## 5. 服务器演示子任务
+
+| 子任务 | 内容 | 状态 | 验收 |
+| --- | --- | --- | --- |
+| W2-DEPLOY-001.1 | 定义 `demo-manifest.json` schema | Done | schema 能表达 release、suite、job、program、report、screenshot、doc。 |
+| W2-DEPLOY-001.2 | 生成首页 `index.html` | Done | 首页可跳转虚拟控制器、报告、程序清单、截图和文档。 |
+| W2-DEPLOY-010.1 | 收集 19 个 GRL 程序 | Done | zip 内 `spec-programs` 与 manifest 数量一致。 |
+| W2-DEPLOY-010.2 | 收集最新 W2 job | Done | zip 内存在 `job.json`、`report.json`、`programs//*.json`。 |
+| W2-DEPLOY-010.3 | 收集截图和 Word 文档 | Done | zip 内存在 2 张截图和 2 份 Word 文档。 |
+| W2-DEPLOY-040.1 | 浏览器人工验证 | Done | 远程首页、虚拟控制器入口、报告、截图和程序清单均可打开。 |
+| W2-DEPLOY-050.1 | curl 自动 smoke test | Done | 关键 URL 返回 200,report fail=0。 |
+| W2-DEPLOY-050.2 | 逐帧轨迹远程抽查 | Done | `W2_30_MotionAllTypes`、`W2_60_IOWaitPulse`、`W2_99_FullSpecExample` 的远程 `trajectory.json` 均返回 frames、joints 和 TCP。 |
diff --git a/working2/05-验收证据.md b/working2/05-验收证据.md
new file mode 100644
index 0000000..4beb40a
--- /dev/null
+++ b/working2/05-验收证据.md
@@ -0,0 +1,220 @@
+# 05-验收证据
+
+版本:0.1
+日期:2026-06-28
+
+## 1. 证据状态
+
+| 状态 | 含义 |
+| --- | --- |
+| 待验证 | 任务尚未执行或未产生产物。 |
+| 通过 | 已执行且满足验收标准。 |
+| 不通过 | 已执行但不满足验收标准。 |
+| 跳过 | 因明确边界暂不执行,必须说明原因。 |
+
+## 2. 基准证据项
+
+| 证据 | 状态 | 目标产物 |
+| --- | --- | --- |
+| EV-W2-SPEC-001:语法覆盖矩阵 | 通过 | `working2/programs/manifest.md` 和 `spec-programs/manifest.json` 已覆盖章节 4 到 25。 |
+| EV-W2-PROG-010:Runtime 程序创建 | 通过 | `kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_*.grl` 共 11 个;manifest Runtime 层级共 12 项。 |
+| EV-W2-PROG-020:Error 程序创建 | 通过 | `static/error/W2_E*.grl` 共 5 个,其中 4 个 Static、1 个 Runtime timeout error。 |
+| EV-W2-PROG-030:Post 程序创建 | 通过 | `post/W2_P*.grl` 共 3 个。 |
+| EV-W2-RUN-001:suite runner | 通过 | `kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/job.json`。 |
+| EV-W2-RUN-030:虚拟控制器执行 | 通过 | 每个 runtime 程序输出 `controller.json`、`trace.json`、`motion-queue.json`。 |
+| EV-W2-RUN-040:逐帧轨迹 | 通过 | Runtime 轨迹 `trajectory.json` 包含 `frames[]`,每帧包含 joints[6]、TCP position[3] 和 TCP quaternion[4]。 |
+| EV-W2-RUN-050:IO/wait/pulse | 通过 | `W2_60_IOWaitPulse` 和 `W2_E50_RuntimeTimeout` 输出 IO/wait/pulse/timeout trace。 |
+| EV-W2-POST-010:三品牌输出 | 通过 | `post-report.json` 记录 ABB/FANUC/KUKA 文件名和 report。 |
+| EV-W2-POST-020:roundtrip | 通过 | `roundtrip.json` 记录 ABB import 回读状态和 diagnostics。 |
+| EV-W2-UI-020:HTML 截图 | 通过 | `kdl-wasm/web/test-results/virtual-controller/virtual-controller-desktop.png`、`virtual-controller-mobile.png`、`evidence.json`。 |
+| EV-W2-CI-900:全量命令 | 通过 | `npm run typecheck`、`npm test`、`npm run verify:virtual-controller` 全部通过;WASM native build 未执行。 |
+| EV-W2-DEPLOY-001:演示包 manifest | 通过 | `demo-manifest.json` 包含 release_id、job_id、19 个程序、报告、截图、文档入口。 |
+| EV-W2-DEPLOY-020:演示包 zip | 通过 | `kdl-wasm/web/test-results/deploy/kdl-olp-demo-20260628-164048-W2-JOB-20260628082622-51484d62.zip`。 |
+| EV-W2-DEPLOY-040:HTTPS 发布 | 通过 | `https://82.156.24.101:8095/` 可访问首页、虚拟控制器、report、截图和逐帧轨迹 JSON。 |
+| EV-W2-DEPLOY-050:远程 smoke test | 通过 | `kdl-wasm/web/test-results/deploy/kdl-olp-demo-20260628-164048-W2-JOB-20260628082622-51484d62.deploy.json`,`program_count=19` 且 `summary.fail=0`。 |
+
+## 3. 建议命令
+
+### 3.1 文档和覆盖矩阵检查
+
+```powershell
+rg -n "W2_|通用机器人编程语法规范|Runtime|Static|Post|ABB120|虚拟控制器" working2
+```
+
+预期:能找到 README、任务矩阵、验收证据、决策记录和 manifest 中的覆盖项。
+
+### 3.2 GRL 和 ABB120 测试
+
+```powershell
+cd E:\Work\kdl_work
+npm test -- grl abb120
+```
+
+预期:GRL parser/semantic、ABB120 fixture、表达式和程序编译测试通过。
+
+### 3.3 虚拟控制器运行测试
+
+```powershell
+npm test -- virtual controller runtime
+```
+
+预期:状态机、IR runtime、motion queue、IO runtime、workbench/debug facade 测试通过。
+
+### 3.4 后处理和导入回读
+
+```powershell
+npm test -- post import roundtrip
+```
+
+预期:ABB/FANUC/KUKA post、brand import、roundtrip diff 测试通过。
+
+### 3.5 HTML 虚拟控制器截图
+
+```powershell
+npm run verify:virtual-controller
+```
+
+预期:桌面和移动截图生成,状态交互、Wait 置位和无横向溢出检查通过。
+
+### 3.6 可选 WASM native build
+
+```powershell
+cmake --build kdl-wasm/build-wasm -j16
+```
+
+预期:当前 Emscripten/Ninja 环境可用时构建通过;如环境缺失,记录为环境阻塞而不是功能通过。
+
+### 3.7 服务器演示包生成
+
+建议后续实现脚本:
+
+```powershell
+cd E:\Work\kdl_work
+node kdl-wasm/web/scripts/build-demo-package.mjs
+node kdl-wasm/web/scripts/verify-demo-package.mjs kdl-wasm/web/test-results/deploy/kdl-olp-demo-.zip
+```
+
+预期:生成 zip;解压校验包含 `index.html`、`demo-manifest.json`、19 个 `.grl`、最新 `W2-JOB-*`、逐帧 `trajectory.frames`、2 张截图和 2 份 Word 文档。
+
+### 3.8 HTTPS 远程 smoke test
+
+```powershell
+$base = "https://82.156.24.101:8095"
+curl.exe -k "$base/"
+curl.exe -k "$base/demo-manifest.json"
+curl.exe -k "$base/spec-programs/manifest.json"
+curl.exe -k "$base/app/virtual-controller.html"
+curl.exe -k "$base/test-results/abb120-spec//report.json"
+curl.exe -k "$base/test-results/virtual-controller/virtual-controller-desktop.png" --output NUL
+curl.exe -k "$base/test-results/virtual-controller/virtual-controller-mobile.png" --output NUL
+```
+
+预期:
+
+1. 关键 URL 返回 200。
+2. `demo-manifest.json` 中 `program_count` 为 19。
+3. `report.json` 中 `summary.fail` 为 0。
+4. 浏览器可打开虚拟控制器页面和报告页面。
+
+## 4. 实际产物目录
+
+```text
+kdl-wasm/web/test-results/abb120-spec/
+ W2-JOB-20260628022836-51484d62/
+ job.json
+ manifest.json
+ report.json
+ report.html
+ programs/
+ /
+ compile.json
+ controller.json
+ motion-queue.json
+ trace.json
+ io.json
+ trajectory.json
+ post-report.json
+ roundtrip.json
+```
+
+每个 `job.json` 必须包含:
+
+1. `job_id`
+2. `suite_id`
+3. `robot_id`
+4. `spec_version`
+5. `programs`
+6. `commands`
+7. `status`
+8. `diagnostics`
+9. `artifact_paths`
+
+## 5. 当前记录
+
+| 时间 | 命令 | 结果 |
+| --- | --- | --- |
+| 2026-06-28 09:38 Asia/Shanghai | `npm run suite:abb120-spec` | 通过;生成 `W2-JOB-20260628013857-19b5a2c7`,18 个程序,missingSections 为空。 |
+| 2026-06-28 09:40 Asia/Shanghai | `npm run typecheck` | 通过。 |
+| 2026-06-28 09:41 Asia/Shanghai | `npm test` | 通过;41 个 test files,155 个 tests。 |
+| 2026-06-28 09:42 Asia/Shanghai | `npm run verify:virtual-controller` | 通过;desktop screenshot 49892 bytes,mobile screenshot 47887 bytes,wait=`satisfied`,所有主要面板可见。 |
+| 2026-06-28 10:28 Asia/Shanghai | `npm test -- abb120SpecSuite` | 通过;manifest 引用、层级、expected status、expected diagnostics 和 W2_99 完整示例证据均通过。 |
+| 2026-06-28 10:28 Asia/Shanghai | `npm run typecheck` | 通过。 |
+| 2026-06-28 10:28 Asia/Shanghai | `npm run suite:abb120-spec` | 通过;生成 `W2-JOB-20260628022836-51484d62`,19 个程序,missingSections 为空。 |
+| 2026-06-28 10:33 Asia/Shanghai | `npm test` | 通过;41 个 test files,155 个 tests。 |
+| 2026-06-28 10:33 Asia/Shanghai | `npm run verify:virtual-controller` | 通过;desktop screenshot 49892 bytes,mobile screenshot 47887 bytes,wait=`satisfied`,所有主要面板可见。 |
+| 2026-06-28 12:06 Asia/Shanghai | `npm run demo:build` | 通过;生成 release `20260628-120601-W2-JOB-20260628024709-51484d62`,zip 3769732 bytes,sha256=`e3d936ae5e2c813f80346363b66b82fc19c87fe61ca421ac1b2de2eb4bc1c699`。 |
+| 2026-06-28 12:06 Asia/Shanghai | `npm run demo:verify -- kdl-wasm/web/test-results/deploy/kdl-olp-demo-20260628-120601-W2-JOB-20260628024709-51484d62.zip` | 通过;解压后 `program_count=19`、`.grl=19`、`summary.fail=0`、截图和 2 份 Word 文档均存在。 |
+| 2026-06-28 12:07 Asia/Shanghai | 上传并切换服务器 release | 通过;`current` 指向 `/opt/kdl-olp-demo/8095/releases/20260628-120601-W2-JOB-20260628024709-51484d62`,`previous` 指向 `/opt/kdl-olp-demo/8095/releases/20260628-120357-W2-JOB-20260628024709-51484d62`,服务 `kdl-site-8095` 为 active。 |
+| 2026-06-28 12:07 Asia/Shanghai | HTTPS remote smoke test | 通过;`/`、`/demo-manifest.json`、`/spec-programs/manifest.json`、`/app/virtual-controller.html`、`report.json`、`report.html`、desktop/mobile png 全部返回 200;`program_count=19`、`summary.fail=0`。 |
+| 2026-06-28 12:15 Asia/Shanghai | `npm run typecheck` | 通过。 |
+| 2026-06-28 12:15 Asia/Shanghai | `npm test` | 通过;41 个 test files,155 个 tests。 |
+| 2026-06-28 16:25 Asia/Shanghai | `npm run typecheck` | 通过。 |
+| 2026-06-28 16:25 Asia/Shanghai | `npm test -- kdl-wasm/web/tests/integration/abb120SpecSuite.test.ts kdl-wasm/web/tests/integration/abb120SuiteArtifacts.test.ts` | 通过;5 个 integration tests 通过,包含逐帧 trajectory 断言。 |
+| 2026-06-28 16:26 Asia/Shanghai | `npm run suite:abb120-spec` | 通过;生成 `W2-JOB-20260628082622-51484d62`,19 个程序,missingSections 为空。 |
+| 2026-06-28 16:28 Asia/Shanghai | `npm run verify:virtual-controller` | 通过;desktop screenshot 45302 bytes,mobile screenshot 40407 bytes,`Run` 后 state=`running`,DI wait=`satisfied`。 |
+| 2026-06-28 16:35 Asia/Shanghai | `npm run demo:verify -- kdl-wasm/web/test-results/deploy/kdl-olp-demo-20260628-163458-W2-JOB-20260628082622-51484d62.zip` | 通过;`program_count=19`、`.grl=19`、`summary.fail=0`、`runtime_trajectory_frames=9/12`。 |
+| 2026-06-28 16:38 Asia/Shanghai | `powershell -NoProfile -ExecutionPolicy Bypass -File kdl-wasm/web/scripts/deploy-demo-package.ps1 -ZipPath ... -Target abigailaw-8091` | 通过;关键 URL 全部 200,`program_count=19`、`summary.fail=0`,服务 `kdl-site-8095` 自动重启后读取新 release。 |
+| 2026-06-28 16:39 Asia/Shanghai | Python HTTPS 远程逐帧轨迹抽查 | 通过;`W2_30_MotionAllTypes` 有 12 帧,`W2_60_IOWaitPulse` 有 4 帧,`W2_99_FullSpecExample` 有 32 帧,均含 joints 和 TCP。 |
+
+### 最新 job
+
+| 项 | 值 |
+| --- | --- |
+| job_id | `W2-JOB-20260628082622-51484d62` |
+| suite_id | `working2-abb120-spec` |
+| robot_id | `abb_irb120_3_58` |
+| job.json | `kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/job.json` |
+| report.html | `kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/report.html` |
+| HTML screenshots | `kdl-wasm/web/test-results/virtual-controller/` |
+
+## 6. 服务器发布证据记录模板
+
+| 项 | 值 |
+| --- | --- |
+| release_id | `20260628-164048-W2-JOB-20260628082622-51484d62` |
+| zip 路径 | `kdl-wasm/web/test-results/deploy/kdl-olp-demo-20260628-164048-W2-JOB-20260628082622-51484d62.zip` |
+| zip hash | 见同目录 `kdl-olp-demo-20260628-164048-W2-JOB-20260628082622-51484d62.summary.json`。 |
+| job_id | `W2-JOB-20260628082622-51484d62` |
+| 发布地址 | `https://82.156.24.101:8095/` |
+| 服务器 release 目录 | `/opt/kdl-olp-demo/8095/releases/20260628-164048-W2-JOB-20260628082622-51484d62` |
+| current 指向 | `/opt/kdl-olp-demo/8095/releases/20260628-164048-W2-JOB-20260628082622-51484d62` |
+| smoke test 时间 | `2026-06-28 16:40 Asia/Shanghai` |
+| smoke test 结果 | 通过;关键 URL 全部 200,`program_count=19`,`summary.fail=0`。 |
+| 回滚目录 | `/opt/kdl-olp-demo/8095/releases/20260628-163458-W2-JOB-20260628082622-51484d62` |
+
+## 7. 远程页面人工验收记录模板
+
+| 演示项 | 程序或页面 | 结果 | 备注 |
+| --- | --- | --- | --- |
+| 首页打开 | `/` | 通过 | HTTP 200,返回 11199 bytes。 |
+| manifest 打开 | `/demo-manifest.json` | 通过 | HTTP 200,`program_count=19`。 |
+| 虚拟控制器打开 | `/app/virtual-controller.html` | 通过 | HTTP 200,页面包含 Program 下拉、Frame slider 和 `Trajectory Frames` 表格。 |
+| 报告打开 | `/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/report.html` | 通过 | HTTP 200,返回 2266 bytes。 |
+| 最小运动演示 | `W2_00_MinimalModule` | 通过 | 程序源和 compile artifact 均在 manifest 中可跳转。 |
+| 三类运动演示 | `W2_30_MotionAllTypes` | 通过 | 远程 `trajectory.json` 有 12 帧,每帧包含 TCP 和 J1-J6。 |
+| IO/wait/pulse 演示 | `W2_60_IOWaitPulse` | 通过 | 远程 `trajectory.json` 有 4 帧;页面 DI1 可将 wait 切到 `satisfied`。 |
+| 完整示例演示 | `W2_99_FullSpecExample` | 通过 | 远程 `trajectory.json` 有 32 帧,每帧包含 TCP 和 J1-J6。 |
+| 静态诊断展示 | `W2_E10` 到 `W2_E40` | 通过 | `report.json` 中保留 expected diagnostics,`summary.fail=0`。 |
+| 后处理展示 | `W2_P10` 到 `W2_P30` | 通过 | post/roundtrip artifacts 均在 package 内。 |
+| 桌面截图打开 | `virtual-controller-desktop.png` | 通过 | HTTP 200,45302 bytes。 |
+| 移动截图打开 | `virtual-controller-mobile.png` | 通过 | HTTP 200,40407 bytes。 |
diff --git a/working2/06-决策记录.md b/working2/06-决策记录.md
new file mode 100644
index 0000000..901b6c1
--- /dev/null
+++ b/working2/06-决策记录.md
@@ -0,0 +1,184 @@
+# 06-决策记录
+
+版本:0.1
+日期:2026-06-28
+
+## ADR-W2-001:working2 以当前语法规范作为覆盖源
+
+状态:Accepted
+日期:2026-06-28
+关联任务:`W2-SPEC-001`
+
+### 背景
+
+用户要求对标 `通用机器人编程语法规范.md` 创建机器人程序集,并全面完成虚拟控制器执行情况。`working1` 已经覆盖 ABB120 基础测试和虚拟控制器,但不是逐章按最新语法规范做覆盖矩阵。
+
+### 决策
+
+`working2` 以 `work/doc/通用机器人编程语法规范.md` 为唯一覆盖源。任何程序或测试是否“覆盖”,必须能追溯到规范章节、语法项和验收证据。
+
+### 后果
+
+1. 覆盖结论可审计。
+2. 语法规范更新后可以重新生成缺口清单。
+3. 不再用“已有测试通过”替代规范覆盖证明。
+
+## ADR-W2-002:ABB120 基准继续使用仓库内稳定 fixture
+
+状态:Accepted
+日期:2026-06-28
+关联任务:`W2-PROG-010`、`W2-RUN-020`
+
+### 背景
+
+仓库已有 `kdl-wasm/web/src/fixtures/abb120.ts` 和测试导出 `abbIrb120.ts`,其中包含 ABB IRB120 3/58 URDF、load options 和标准关节位。重新引入外部 URDF 会增加模型差异和验证成本。
+
+### 决策
+
+working2 继续使用仓库内 ABB120 fixture。若未来需要独立 `.urdf` 文件,只能从当前 fixture 导出,不能静默替换机器人模型。
+
+### 后果
+
+1. working2 结果与 existing KDL/virtual controller 测试一致。
+2. FK/IK/limit snapshot 可复用。
+3. 外部 mesh/inertial 完整模型另列任务。
+
+## ADR-W2-003:语法覆盖分为 Runtime、Static、Post 三层
+
+状态:Accepted
+日期:2026-06-28
+关联任务:`W2-SPEC-002`
+
+### 背景
+
+语法规范包含流程控制、运动、IO,也包含 trap、interrupt、task、brand metadata、post_hint 等不适合全部作为虚拟控制器 happy path 执行的语义。如果强行要求所有语法都运行,会混淆实现边界。
+
+### 决策
+
+覆盖分三层:
+
+1. Runtime:虚拟控制器必须执行并输出 trace。
+2. Static:parser/semantic 必须诊断或验证。
+3. Post:后处理、导入回读和报告必须覆盖。
+
+### 后果
+
+1. happy path 稳定。
+2. P1/P2 语义不会被误报为已完整执行。
+3. 覆盖矩阵能清楚说明每项语法的验证方式。
+
+## ADR-W2-004:虚拟控制器验收以证据包为准
+
+状态:Accepted
+日期:2026-06-28
+关联任务:`W2-RUN-001` 到 `W2-RUN-060`
+
+### 背景
+
+“执行情况”不能只看单元测试通过。虚拟控制器需要证明状态机、程序指针、motion queue、IO/wait、报警、source map 和轨迹结果都正确。
+
+### 决策
+
+每次 suite 运行生成 `W2-JOB-*` 证据包,至少包含:
+
+1. `job.json`
+2. `compile.json`
+3. `controller.json`
+4. `motion-queue.json`
+5. `trace.json`
+6. `io.json`
+7. `trajectory.json`
+8. `report.json/html`
+
+### 后果
+
+1. 运行结果可回放和审计。
+2. HTML 虚拟控制器可以消费同一证据。
+3. CI 失败时能定位到具体程序、source range 和 controller 状态。
+
+## ADR-W2-005:working2 不改写 working1 完成记录
+
+状态:Accepted
+日期:2026-06-28
+关联任务:`W2-SPEC-000`
+
+### 背景
+
+`working1` 已记录已完成的 ABB120 基础测试、表达式功能和虚拟控制器验收。用户要求任务整合到 `working2` 并参考 `working1`,不是要求重写历史记录。
+
+### 决策
+
+`working2` 新建独立任务包,状态从 `Todo` 开始。`working1` 仅作为参考和可复用资产来源。
+
+### 后果
+
+1. 避免把旧验收直接当作新目标完成。
+2. working2 可以独立追踪新增覆盖缺口。
+3. 后续实现可以逐项把 Todo 推进到 Done。
+
+## ADR-W2-006:W2 runner 使用同步 fixture planner 生成审计轨迹
+
+状态:Accepted
+日期:2026-06-28
+关联任务:`W2-RUN-020`、`W2-RUN-040`
+
+### 背景
+
+working2 的核心目标是逐章覆盖 GRL 语法规范,并为每个程序输出稳定、可审计的 controller、motion queue、trace、IO 和 trajectory 证据。仓库已有 ABB120 KDL 集成测试负责真实 URDF FK/IK/planPath 验证。
+
+### 决策
+
+`runAbb120SpecSuite` 在 W2 job 中使用同步 fixture planner 生成稳定 trajectory 和 planner diagnostic;真实 ABB120 URDF/KDL 检查继续由既有 `abb120Programs.test.ts` 和 KDL 测试承担。
+
+### 后果
+
+1. W2 证据包生成快速、稳定、可在普通 Node/Vitest 环境执行。
+2. Motion queue、source map、IO/wait/alarm 和 post/roundtrip 证据可稳定归档。
+3. 若后续要求 job 内嵌真实 KDL 轨迹,可在 runner 中增加 async KDL planner 模式。
+
+## ADR-W2-007:异常和 P1 语义采用 runtime/static 边界组合
+
+状态:Accepted
+日期:2026-06-28
+关联任务:`W2-RUN-060`、`W2-PROG-010.10`
+
+### 背景
+
+当前语法规范定义 `try/catch/finally`、`trap`、`interrupt`、`task`。现有 parser/semantic 已有异常分析器,但控制流分析器不应把 `try` 当普通控制流执行;`trap/task` 仍是 P1 runtime 边界。
+
+### 决策
+
+控制流分析器将 `try` 块保留为 raw boundary,由 exception semantic 负责 alarm/raise/try/catch/finally 分析。`trap/task/interrupt` 输出 `GRL_P1_UNIMPLEMENTED` warning 或 unsupported runtime trace,不作为 happy path 完整执行。
+
+### 后果
+
+1. `W2_90_ExceptionAlarm.grl` 可以稳定 parse、compile、load 并输出异常语义证据。
+2. P1 语义不会被误报为完整 runtime 支持。
+3. 后续实现 trap/interrupt/task 时可替换 raw boundary,不影响 W2 manifest 结构。
+
+## ADR-W2-008:服务器演示采用静态发布包加证据包模式
+
+状态:Accepted
+日期:2026-06-28
+关联任务:`W2-DEPLOY-001` 到 `W2-DEPLOY-060`
+
+### 背景
+
+用户要求把虚拟测试程序打包到服务器,并能通过这些程序演示虚拟控制器全部功能。当前虚拟控制器页面、GRL 程序、suite job、截图和 Word 文档都可以作为静态文件发布;远程演示的重点是可访问、可审计、可重复,而不是在服务器上重新执行 Node/Vitest。
+
+### 决策
+
+服务器发布采用静态演示包模式:
+
+1. 本地先执行 typecheck、test、suite 和截图验证。
+2. 将虚拟控制器页面、19 个 GRL 程序、最新 `W2-JOB-*`、截图、Word 文档和 `demo-manifest.json` 打成 zip。
+3. 服务器仅负责 HTTPS 静态托管。
+4. 远程验收通过 `demo-manifest.json`、`report.json`、程序源码、截图和页面入口验证。
+5. 服务器保留 release 目录和 `current` 链接,支持回滚。
+
+### 后果
+
+1. 发布包可离线审计,不依赖服务器 Node 环境。
+2. 演示内容与本地测试证据一致,避免远程环境差异导致结论不稳定。
+3. 后续如需在线编辑和动态运行,可在当前静态包基础上增加 API 服务,不影响现有验收链路。
+4. 凭据不进入仓库文档,降低泄露风险。
diff --git a/working2/07-服务器发布与演示包实施方案.md b/working2/07-服务器发布与演示包实施方案.md
new file mode 100644
index 0000000..f11e15f
--- /dev/null
+++ b/working2/07-服务器发布与演示包实施方案.md
@@ -0,0 +1,238 @@
+# 07-服务器发布与演示包实施方案
+
+版本:0.1
+日期:2026-06-28
+
+## 1. 目标
+
+将虚拟控制器网站、GRL 规范测试程序和最新测试证据打包发布到 HTTPS 服务器,使用户可以通过浏览器演示虚拟控制器的全部功能。
+
+发布目标:
+
+```text
+https://82.156.24.101:8095/
+```
+
+端口 `8095` 已作为演示端口使用。本文档不记录服务器密码,部署凭据由部署人员本地管理。
+
+## 2. 演示范围
+
+服务器演示必须覆盖以下功能:
+
+| 功能 | 演示来源 |
+| --- | --- |
+| GRL 程序加载 | 19 个 `spec-programs` 程序。 |
+| 语法解析和语义编译 | 每个程序的 `compile.json`。 |
+| 虚拟控制器状态机 | Runtime 程序的 `controller.json`。 |
+| motion queue | Runtime 程序的 `motion-queue.json`。 |
+| 轨迹摘要 | Runtime 程序的 `trajectory.json`。 |
+| IO、wait、pulse | `W2_60_IOWaitPulse` 和 `W2_E50_RuntimeTimeout`。 |
+| 流程控制和调用 | `W2_70_ControlFlow`、`W2_80_ProcFuncCall`。 |
+| 异常和报警 | `W2_90_ExceptionAlarm`、`W2_E50_RuntimeTimeout`。 |
+| 静态错误诊断 | `W2_E10`、`W2_E20`、`W2_E30`、`W2_E40`。 |
+| 三品牌后处理 | `W2_P10`、`W2_P20`、`W2_P30` 的 `post-report.json`。 |
+| 导入回读 | `roundtrip.json`。 |
+| 页面截图 | `virtual-controller-desktop.png`、`virtual-controller-mobile.png`。 |
+
+## 3. 发布包结构
+
+标准发布包命名:
+
+```text
+kdl-olp-demo-YYYYMMDD-HHMMSS-.zip
+```
+
+解压后目录:
+
+```text
+kdl-olp-demo/
+ index.html
+ demo-manifest.json
+ README.md
+ app/
+ virtual-controller.html
+ virtual-controller.css
+ virtual-controller.js
+ spec-programs/
+ manifest.json
+ runtime/
+ static/
+ error/
+ post/
+ test-results/
+ abb120-spec/
+ /
+ job.json
+ manifest.json
+ report.json
+ report.html
+ programs/
+ virtual-controller/
+ evidence.json
+ virtual-controller-desktop.png
+ virtual-controller-mobile.png
+ docs/
+ GRL功能语法逻辑与程序创建使用手册.docx
+ 通用机器人离线编程系统测试文档.docx
+```
+
+## 4. demo-manifest.json 字段
+
+`demo-manifest.json` 是远程页面和验收脚本的入口文件,字段必须稳定。
+
+```json
+{
+ "release_id": "20260628-112000-W2-JOB-...",
+ "generated_at": "2026-06-28T03:20:00.000Z",
+ "suite_id": "working2-abb120-spec",
+ "job_id": "W2-JOB-...",
+ "program_count": 19,
+ "runtime_programs": 12,
+ "static_programs": 4,
+ "post_programs": 3,
+ "entry": "app/virtual-controller.html",
+ "report_json": "test-results/abb120-spec//report.json",
+ "report_html": "test-results/abb120-spec//report.html",
+ "program_manifest": "spec-programs/manifest.json",
+ "screenshots": {
+ "desktop": "test-results/virtual-controller/virtual-controller-desktop.png",
+ "mobile": "test-results/virtual-controller/virtual-controller-mobile.png"
+ }
+}
+```
+
+## 5. 本地发布前检查
+
+发布前必须执行:
+
+```powershell
+cd E:\Work\kdl_work
+npm run typecheck
+npm test
+npm run suite:abb120-spec
+npm run verify:virtual-controller
+```
+
+预期:
+
+1. TypeScript 无错误。
+2. Vitest 全量通过。
+3. `suite:abb120-spec` 生成新 `W2-JOB-*`。
+4. `verify:virtual-controller` 生成桌面和移动截图。
+5. `report.json` 中 `summary.fail` 为 `0`。
+
+## 6. 服务器目录规范
+
+推荐服务器目录:
+
+```text
+/opt/kdl-olp-demo/8095/
+ releases/
+ /
+ current -> releases/
+ previous -> releases/
+```
+
+发布时只切换 `current`,不要直接覆盖正在服务的目录。
+
+## 7. 上传和发布步骤
+
+1. 本地生成演示包 zip。
+2. 上传 zip 到服务器临时目录。
+3. 在服务器创建 release 目录。
+4. 解压 zip 到 release 目录。
+5. 检查 `index.html`、`demo-manifest.json` 和 `app/virtual-controller.html` 是否存在。
+6. 将 `previous` 指向旧 `current`。
+7. 将 `current` 指向新 release。
+8. 重新加载或确认 HTTPS 服务读取 `current`。
+9. 执行远程 smoke test。
+
+## 8. 远程 smoke test
+
+```powershell
+$base = "https://82.156.24.101:8095"
+curl.exe -k "$base/"
+curl.exe -k "$base/demo-manifest.json"
+curl.exe -k "$base/spec-programs/manifest.json"
+curl.exe -k "$base/app/virtual-controller.html"
+curl.exe -k "$base/test-results/abb120-spec//report.json"
+```
+
+检查项:
+
+| URL | 预期 |
+| --- | --- |
+| `/` | 返回首页 HTML。 |
+| `/demo-manifest.json` | `program_count` 为 19。 |
+| `/spec-programs/manifest.json` | 包含 19 个 programs。 |
+| `/app/virtual-controller.html` | 返回虚拟控制器页面。 |
+| `/test-results/abb120-spec//report.json` | `summary.fail` 为 0。 |
+| `/test-results/virtual-controller/virtual-controller-desktop.png` | 返回 PNG。 |
+| `/test-results/virtual-controller/virtual-controller-mobile.png` | 返回 PNG。 |
+
+## 9. 人工演示脚本
+
+浏览器打开:
+
+```text
+https://82.156.24.101:8095/
+```
+
+演示顺序:
+
+1. 打开首页,说明当前 release、job_id、程序数量。
+2. 打开虚拟控制器页面。
+3. 展示 Runtime 程序列表,重点选择:
+ - `W2_00_MinimalModule`
+ - `W2_30_MotionAllTypes`
+ - `W2_60_IOWaitPulse`
+ - `W2_99_FullSpecExample`
+4. 展示 trace、motion queue、IO image 和 diagnostics。
+5. 打开 `report.html`,说明 19 个程序覆盖章节 4 到 25。
+6. 打开截图,说明桌面和移动端 UI 已验证。
+7. 打开 Word 手册和测试文档,说明使用和测试结论。
+
+## 10. 回滚
+
+若远程验证失败:
+
+1. 保留失败 release,不删除,便于排查。
+2. 将 `current` 指回 `previous`。
+3. 重新执行 smoke test。
+4. 在 `working2/03-推进台账.md` 记录:
+ - 失败 release_id
+ - 失败原因
+ - 回滚到哪个 release_id
+ - 后续修复任务
+
+## 11. 自动化脚本
+
+已新增脚本:
+
+```text
+kdl-wasm/web/scripts/build-demo-package.mjs
+kdl-wasm/web/scripts/verify-demo-package.mjs
+kdl-wasm/web/scripts/deploy-demo-package.ps1
+```
+
+脚本职责:
+
+| 脚本 | 职责 |
+| --- | --- |
+| `build-demo-package.mjs` | 收集 app、spec-programs、latest job、screenshots、docs,生成 demo manifest 和 zip。 |
+| `verify-demo-package.mjs` | 解压 zip,检查 19 个程序、report fail=0、图片和文档存在。 |
+| `deploy-demo-package.ps1` | 上传 zip、远程解压、切换 current、执行 smoke test。 |
+
+当前发布 release:
+
+```text
+20260628-120601-W2-JOB-20260628024709-51484d62
+```
+
+服务器当前状态:
+
+| 项 | 值 |
+| --- | --- |
+| current | `/opt/kdl-olp-demo/8095/releases/20260628-120601-W2-JOB-20260628024709-51484d62` |
+| previous | `/opt/kdl-olp-demo/8095/releases/20260628-120357-W2-JOB-20260628024709-51484d62` |
+| HTTPS smoke test | 通过,关键 URL 返回 200,`program_count=19`,`summary.fail=0`。 |
diff --git a/working2/README.md b/working2/README.md
index 9617f12..ee184bf 100644
--- a/working2/README.md
+++ b/working2/README.md
@@ -1,10 +1,64 @@
-# working2 任务审计
+# working2 GRL 语法规范覆盖程序集与虚拟控制器验收索引
+版本:0.1
日期:2026-06-28
+主题:对标 `work/doc/通用机器人编程语法规范.md`,以 ABB IRB120 3/58 URDF fixture 为机器人基准,建立覆盖语法规范的 GRL 机器人程序集,并全面验收虚拟控制器执行情况。
-本目录当前没有任务文件、源码、验收矩阵或外部引用。已检查:
+## 1. 目标
-1. `Get-ChildItem -Force E:\Work\kdl_work\working2`:无文件。
-2. `rg -n "working2|working 2|工作2" E:\Work\kdl_work`:未发现任务说明引用。
+`working2` 是在 `working1` 已完成 ABB120 基础测试、运算功能和 HTML 虚拟控制器之后的专项任务包。它不重复定义 ABB120 基础能力,而是把当前语法规范转成可执行覆盖清单:
-结论:`working2` 当前为空任务集,无待实现项。
+1. 逐章对照 `通用机器人编程语法规范.md`,生成 ABB120 GRL 程序套件。
+2. 区分虚拟控制器必须执行的语义、编译期静态验证语义、后处理/导入验证语义。
+3. 用 ABB120 URDF fixture 运行 happy path、runtime path、error path 和 cross-brand path。
+4. 输出可审计证据:AST、IR、KDL request、motion queue、trace、IO/wait、alarm、source map、post report、roundtrip report、HTML 截图。
+5. 将结果接入当前 `kdl-wasm` 测试、suite runner 和虚拟控制器页面验证命令。
+6. 将虚拟控制器页面、19 个 GRL 规范测试程序、最新 W2 job 证据包和截图打成服务器演示包,通过 HTTPS 地址演示虚拟控制器全部功能。
+
+## 2. 基准输入
+
+| 项 | 路径 |
+| --- | --- |
+| 语法规范 | `E:\Work\kdl_work\work\doc\通用机器人编程语法规范.md` |
+| ABB120 fixture | `E:\Work\kdl_work\kdl-wasm\web\src\fixtures\abb120.ts` |
+| ABB120 测试 fixture 导出 | `E:\Work\kdl_work\kdl-wasm\web\tests\fixtures\abbIrb120.ts` |
+| 已有 ABB120 程序目录 | `E:\Work\kdl_work\kdl-wasm\web\tests\fixtures\abb120\programs` |
+| 已有 suite runner | `E:\Work\kdl_work\kdl-wasm\web\src\suites\abb120Suite.ts` |
+| 虚拟控制器核心 | `E:\Work\kdl_work\kdl-wasm\web\src\controller` |
+| HTML 虚拟控制器 | `E:\Work\kdl_work\kdl-wasm\web\app\virtual-controller.html` |
+
+## 3. 文档入口
+
+| 文件 | 用途 |
+| --- | --- |
+| `01-项目功能内容.md` | 需求范围、语法覆盖分层、ABB120 程序集、虚拟控制器执行和报告要求。 |
+| `02-项目程序开发详细步骤.md` | 从规范解析、程序创建、执行运行器、证据输出到 CI 的实施步骤。 |
+| `03-推进台账.md` | 本轮任务整合记录、已发现资产、待实现边界和下一步。 |
+| `04-任务矩阵.md` | 任务编号、状态、依赖、验收标准。 |
+| `05-验收证据.md` | 应执行命令、产物路径、job/report/screenshot 证据要求。 |
+| `06-决策记录.md` | ABB120 基准、覆盖策略、执行边界和证据格式的设计决策。 |
+| `07-服务器发布与演示包实施方案.md` | HTTPS 发布目标、演示包内容、服务器目录、演示程序清单和验收步骤。 |
+| `programs/manifest.md` | GRL 程序集清单和语法规范覆盖矩阵。 |
+
+## 4. 任务编号
+
+| 编号范围 | 主题 |
+| --- | --- |
+| `W2-SPEC-000` 到 `W2-SPEC-099` | 语法规范覆盖矩阵和缺口审计。 |
+| `W2-PROG-000` 到 `W2-PROG-199` | ABB120 GRL 覆盖程序集。 |
+| `W2-RUN-000` 到 `W2-RUN-199` | 虚拟控制器执行、KDL、IO/wait、trace 和 source map。 |
+| `W2-POST-000` 到 `W2-POST-099` | ABB/FANUC/KUKA 后处理、导入回读和差异报告。 |
+| `W2-UI-000` 到 `W2-UI-099` | HTML 虚拟控制器页面和截图验收。 |
+| `W2-DEPLOY-000` 到 `W2-DEPLOY-099` | 服务器演示包、HTTPS 发布、远程验证和回滚。 |
+| `W2-CI-900` 到 `W2-CI-999` | 全量 CI 和证据归档。 |
+
+## 5. 当前状态
+
+已完成 working2 首批实现和验收:
+
+1. 新增 `kdl-wasm/web/tests/fixtures/abb120/spec-programs`,包含 11 个 runtime 目录程序、2 个 error 目录程序、3 个 static 目录程序和 3 个 Post/import 程序;按 manifest 层级统计为 12 个 Runtime 项、4 个 Static 项、3 个 Post 项。
+2. 新增 `kdl-wasm/web/tests/fixtures/abb120/spec-programs/manifest.json`,覆盖规范章节 4 到 25。
+3. 新增 `runAbb120SpecSuite` 和 `npm run suite:abb120-spec`,可生成 `W2-JOB-*` 证据包。
+4. HTML 虚拟控制器页面已从 `demo-manifest.json` 读取 19 个 W2 程序,支持 Program 下拉切换、Load/Run/Step、Frame slider 和逐帧 TCP/J1-J6 表格,并通过桌面和移动截图验证。
+5. 最新证据包:`kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62`。
+6. 已完成服务器演示包自动化和 HTTPS 发布,目标地址为 `https://82.156.24.101:8095/`;当前 release 为 `20260628-164048-W2-JOB-20260628082622-51484d62`,远程 smoke test 和逐帧轨迹抽查通过。
diff --git a/working2/programs/manifest.md b/working2/programs/manifest.md
new file mode 100644
index 0000000..654ad3b
--- /dev/null
+++ b/working2/programs/manifest.md
@@ -0,0 +1,115 @@
+# working2 GRL 程序集 Manifest
+
+版本:0.1
+日期:2026-06-28
+
+## 1. 目录目标
+
+本 manifest 将 `通用机器人编程语法规范.md` 的语法和语义要求映射到 ABB120 GRL 程序、静态诊断测试、后处理测试和虚拟控制器执行证据。
+
+目标程序目录:
+
+```text
+kdl-wasm/web/tests/fixtures/abb120/spec-programs/
+```
+
+机器可读 manifest:
+
+```text
+kdl-wasm/web/tests/fixtures/abb120/spec-programs/manifest.json
+```
+
+## 2. 覆盖层级
+
+| 层级 | 含义 |
+| --- | --- |
+| Runtime | 必须进入虚拟控制器执行,并产出 controller/trace/motion queue/IO 证据。 |
+| Static | 必须由 parser/semantic/KDL diagnostic 覆盖,不要求 happy path 执行。 |
+| Post | 必须由 ABB/FANUC/KUKA 后处理、导入回读或 report 覆盖。 |
+
+## 3. 程序清单
+
+### 3.1 Runtime
+
+| 程序 | 覆盖章节 | 核心语法 |
+| --- | --- | --- |
+| `W2_00_MinimalModule.grl` | 4、5、6、9、10、23 | language、module、const、speed、zone、joint_target、movej、proc main。 |
+| `W2_10_DataTargetToolFrame.grl` | 6、8、9 | bool/int/real/string/time/length/angle/percent、tool、frame、pose、poseq、joint_target、pose_target。 |
+| `W2_20_ExpressionMath.grl` | 7 | 算术、比较、逻辑、括号、单位后缀、pi/e、三角函数、数值函数、编译期求值。 |
+| `W2_30_MotionAllTypes.grl` | 10 | movej、movel、movec、set_tool、set_frame、set_speed、set_zone、inline 参数优先级。 |
+| `W2_40_PathEvents.grl` | 11 | path defaults/source、point、event before/after/at distance、run_path。 |
+| `W2_50_OperationProcess.grl` | 12 | operation kind/process/start_action/end_action、run_operation。 |
+| `W2_60_IOWaitPulse.grl` | 13 | io.di/do/ai/ao/gi/go/ri/ro、wait、timeout、on_timeout、pulse、all/any/rising/falling/changed。 |
+| `W2_70_ControlFlow.grl` | 14 | if/elseif/else、while、for、switch、break、continue。 |
+| `W2_80_ProcFuncCall.grl` | 15 | proc、in/out/inout、call、return、func 返回值、作用域。 |
+| `W2_90_ExceptionAlarm.grl` | 16 | alarm、raise、try/catch/finally。 |
+| `W2_99_FullSpecExample.grl` | 24 | 规范完整示例的 tool/frame、path、operation、IO event、run_operation 和回 home。 |
+
+### 3.2 Static/error
+
+| 程序 | 覆盖章节 | 预期诊断 |
+| --- | --- | --- |
+| `W2_E10_ExpressionDiagnostics.grl` | 7、22 | `GRL_EXPR_PARSE`、`GRL_EXPR_UNKNOWN_SYMBOL`、`GRL_EXPR_UNKNOWN_FUNCTION`、`GRL_EXPR_ARITY`、`GRL_EXPR_DOMAIN`、`GRL_EXPR_DIV_ZERO`、`GRL_EXPR_UNIT_MISMATCH`、`GRL_EXPR_NON_CONSTANT`。 |
+| `W2_E20_SemanticDiagnostics.grl` | 6、15、22 | 重复符号、类型不匹配、缺失引用、out/inout 非左值、func 缺少 return、func 副作用。 |
+| `W2_E30_MotionDiagnostics.grl` | 8、9、10、11、22 | 关节限位、不可达 pose、movec 共线、缺少 motion 参数、空 path、重复 path point。 |
+| `W2_E40_ControlFlowDiagnostics.grl` | 14、22 | 非法 break/continue、jump 进入块、重复 case、非常量 case、缺失 label。 |
+| `W2_E50_RuntimeTimeout.grl` | 13、16 | wait timeout、on_timeout alarm/call、报警 source map。 |
+
+### 3.3 Post/import
+
+| 程序 | 覆盖章节 | 预期报告 |
+| --- | --- | --- |
+| `W2_P10_BrandHints.grl` | 18、20 | `post_hint`、`@brand.*` 消费或报告。 |
+| `W2_P20_CrossBrandMotion.grl` | 20 | ABB/FANUC/KUKA motion、speed、zone、IO、wait 映射。 |
+| `W2_P30_Roundtrip.grl` | 19、20、21 | post 后导入回读,motion/path/operation 等价或差异明确。 |
+
+## 4. 语法规范覆盖矩阵
+
+| 规范章节 | 覆盖层级 | 程序或测试 |
+| --- | --- | --- |
+| 4. 词法规则 | Runtime/Static | `W2_00_MinimalModule`、lexer/parser tests。 |
+| 5. 顶层结构 | Runtime | `W2_00_MinimalModule`。 |
+| 6. 类型系统 | Runtime/Static | `W2_10_DataTargetToolFrame`、`W2_E20_SemanticDiagnostics`。 |
+| 7. 表达式与运算 | Runtime/Static/Post | `W2_20_ExpressionMath`、`W2_E10_ExpressionDiagnostics`、`W2_P20_CrossBrandMotion`。 |
+| 8. 坐标、工具和目标点 | Runtime/Static | `W2_10_DataTargetToolFrame`、`W2_E30_MotionDiagnostics`。 |
+| 9. 速度和过渡 | Runtime/Post | `W2_20_ExpressionMath`、`W2_30_MotionAllTypes`、`W2_P20_CrossBrandMotion`。 |
+| 10. 运动指令 | Runtime/Static/Post | `W2_30_MotionAllTypes`、`W2_E30_MotionDiagnostics`、`W2_P20_CrossBrandMotion`。 |
+| 11. Path 语法 | Runtime/Static | `W2_40_PathEvents`、`W2_E30_MotionDiagnostics`。 |
+| 12. Operation 语法 | Runtime/Post | `W2_50_OperationProcess`、`W2_P30_Roundtrip`。 |
+| 13. IO 与等待 | Runtime | `W2_60_IOWaitPulse`、`W2_E50_RuntimeTimeout`。 |
+| 14. 流程控制 | Runtime/Static | `W2_70_ControlFlow`、`W2_E40_ControlFlowDiagnostics`。 |
+| 15. 子程序和函数 | Runtime/Static | `W2_80_ProcFuncCall`、`W2_E20_SemanticDiagnostics`。 |
+| 16. 异常、报警和中断 | Runtime/Static | `W2_90_ExceptionAlarm`;trap/interrupt 先做 static 边界。 |
+| 17. 多任务 | Runtime/Static | `W2_90_ExceptionAlarm` 的 task 边界 warning。 |
+| 18. 品牌扩展和后处理提示 | Post | `W2_P10_BrandHints`。 |
+| 19. 自动编程生成规则 | Post | `W2_P30_Roundtrip`、generator roundtrip tests。 |
+| 20. 后处理映射规则 | Post | `W2_P20_CrossBrandMotion`。 |
+| 21. 编译语义和 IR | Runtime/Static | 所有 runtime/error 程序的 compile evidence。 |
+| 22. 语义检查 | Runtime/Static | `W2_E10` 到 `W2_E50`。 |
+| 23. EBNF 语法草案 | Runtime/Static | `W2_00_MinimalModule`、parser coverage test 和 grammar fixtures。 |
+| 24. 完整示例 | Runtime/Post | `W2_99_FullSpecExample` 覆盖完整 path/operation/proc 运行结构;`W2_P30_Roundtrip` 覆盖 post 后导入回读。 |
+| 25. 实施优先级 | Runtime/Static/Post | P0 全部映射到上述程序;P1 进入 static/post 边界。 |
+
+## 5. 证据要求
+
+每个程序必须记录:
+
+1. `program_id`
+2. `spec_sections`
+3. `coverage_level`
+4. `expected_status`
+5. `expected_diagnostics`
+6. `runtime_commands`
+7. `artifact_paths`
+
+最终 suite manifest 应生成为 JSON,供 CI 和 HTML 虚拟控制器读取。
+
+## 6. 当前实现状态
+
+| 项 | 状态 | 证据 |
+| --- | --- | --- |
+| 程序文件 | Done | `spec-programs/runtime` 11 个、`static` 3 个、`error` 2 个、`post` 3 个;manifest 层级统计 Runtime 12、Static 4、Post 3。 |
+| 机器可读 manifest | Done | `spec-programs/manifest.json`。 |
+| suite runner | Done | `kdl-wasm/web/src/suites/abb120SpecSuite.ts`。 |
+| job 生成命令 | Done | `npm run suite:abb120-spec`。 |
+| 最新 job | Done | `kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62`。 |