From 65187499d6c3f45d81123ec4fb00feea6d7fcce0 Mon Sep 17 00:00:00 2001 From: wangdequan Date: Sun, 28 Jun 2026 20:58:18 +0800 Subject: [PATCH] Add ABB120 demo suite and docs --- kdl-wasm/web/app/virtual-controller.css | 240 +- kdl-wasm/web/app/virtual-controller.html | 92 +- kdl-wasm/web/app/virtual-controller.js | 1823 +- kdl-wasm/web/scripts/build-demo-package.mjs | 548 + kdl-wasm/web/scripts/deploy-demo-package.ps1 | 184 + .../scripts/generate-abb120-test-document.mjs | 610 + .../web/scripts/generate-grl-user-manual.mjs | 598 + kdl-wasm/web/scripts/run-abb120-spec-suite.ts | 101 + kdl-wasm/web/scripts/verify-demo-package.mjs | 209 + .../verify-virtual-controller-buttons.mjs | 508 + .../web/scripts/verify-virtual-controller.mjs | 29 +- .../src/grl/semantic/compileControlFlow.ts | 27 + kdl-wasm/web/src/grl/semantic/compileIo.ts | 6 + kdl-wasm/web/src/grl/semantic/index.ts | 1 + kdl-wasm/web/src/suites/abb120SpecSuite.ts | 1106 + .../W2-JOB-20260628013857-19b5a2c7/job.json | 17362 +++++++++++ .../manifest.json | 440 + .../programs/W2_00_MinimalModule/compile.json | 36 + .../W2_00_MinimalModule/controller.json | 455 + .../programs/W2_00_MinimalModule/io.json | 201 + .../W2_00_MinimalModule/motion-queue.json | 82 + .../W2_00_MinimalModule/post-report.json | 8 + .../W2_00_MinimalModule/roundtrip.json | 1 + .../programs/W2_00_MinimalModule/trace.json | 72 + .../W2_00_MinimalModule/trajectory.json | 21 + .../W2_10_DataTargetToolFrame/compile.json | 36 + .../W2_10_DataTargetToolFrame/controller.json | 872 + .../W2_10_DataTargetToolFrame/io.json | 201 + .../motion-queue.json | 416 + .../post-report.json | 8 + .../W2_10_DataTargetToolFrame/roundtrip.json | 1 + .../W2_10_DataTargetToolFrame/trace.json | 155 + .../W2_10_DataTargetToolFrame/trajectory.json | 21 + .../W2_20_ExpressionMath/compile.json | 36 + .../W2_20_ExpressionMath/controller.json | 631 + .../programs/W2_20_ExpressionMath/io.json | 201 + .../W2_20_ExpressionMath/motion-queue.json | 172 + .../W2_20_ExpressionMath/post-report.json | 8 + .../W2_20_ExpressionMath/roundtrip.json | 1 + .../programs/W2_20_ExpressionMath/trace.json | 156 + .../W2_20_ExpressionMath/trajectory.json | 21 + .../W2_30_MotionAllTypes/compile.json | 36 + .../W2_30_MotionAllTypes/controller.json | 936 + .../programs/W2_30_MotionAllTypes/io.json | 201 + .../W2_30_MotionAllTypes/motion-queue.json | 480 + .../W2_30_MotionAllTypes/post-report.json | 8 + .../W2_30_MotionAllTypes/roundtrip.json | 1 + .../programs/W2_30_MotionAllTypes/trace.json | 155 + .../W2_30_MotionAllTypes/trajectory.json | 21 + .../programs/W2_40_PathEvents/compile.json | 36 + .../programs/W2_40_PathEvents/controller.json | 1106 + .../programs/W2_40_PathEvents/io.json | 201 + .../W2_40_PathEvents/motion-queue.json | 731 + .../W2_40_PathEvents/post-report.json | 27 + .../programs/W2_40_PathEvents/roundtrip.json | 1 + .../programs/W2_40_PathEvents/trace.json | 72 + .../programs/W2_40_PathEvents/trajectory.json | 21 + .../W2_50_OperationProcess/compile.json | 36 + .../W2_50_OperationProcess/controller.json | 500 + .../programs/W2_50_OperationProcess/io.json | 201 + .../W2_50_OperationProcess/motion-queue.json | 123 + .../W2_50_OperationProcess/post-report.json | 27 + .../W2_50_OperationProcess/roundtrip.json | 1 + .../W2_50_OperationProcess/trace.json | 72 + .../W2_50_OperationProcess/trajectory.json | 21 + .../programs/W2_60_IOWaitPulse/compile.json | 36 + .../W2_60_IOWaitPulse/controller.json | 1139 + .../programs/W2_60_IOWaitPulse/io.json | 253 + .../W2_60_IOWaitPulse/motion-queue.json | 279 + .../W2_60_IOWaitPulse/post-report.json | 27 + .../programs/W2_60_IOWaitPulse/roundtrip.json | 1 + .../programs/W2_60_IOWaitPulse/trace.json | 493 + .../W2_60_IOWaitPulse/trajectory.json | 21 + .../programs/W2_70_ControlFlow/compile.json | 36 + .../W2_70_ControlFlow/controller.json | 610 + .../programs/W2_70_ControlFlow/io.json | 201 + .../W2_70_ControlFlow/motion-queue.json | 5 + .../W2_70_ControlFlow/post-report.json | 153 + .../programs/W2_70_ControlFlow/roundtrip.json | 1 + .../programs/W2_70_ControlFlow/trace.json | 253 + .../W2_70_ControlFlow/trajectory.json | 21 + .../programs/W2_80_ProcFuncCall/compile.json | 36 + .../W2_80_ProcFuncCall/controller.json | 523 + .../programs/W2_80_ProcFuncCall/io.json | 201 + .../W2_80_ProcFuncCall/motion-queue.json | 5 + .../W2_80_ProcFuncCall/post-report.json | 117 + .../W2_80_ProcFuncCall/roundtrip.json | 1 + .../programs/W2_80_ProcFuncCall/trace.json | 202 + .../W2_80_ProcFuncCall/trajectory.json | 21 + .../W2_90_ExceptionAlarm/compile.json | 36 + .../W2_90_ExceptionAlarm/controller.json | 606 + .../programs/W2_90_ExceptionAlarm/io.json | 201 + .../W2_90_ExceptionAlarm/motion-queue.json | 82 + .../W2_90_ExceptionAlarm/post-report.json | 81 + .../W2_90_ExceptionAlarm/roundtrip.json | 1 + .../programs/W2_90_ExceptionAlarm/trace.json | 201 + .../W2_90_ExceptionAlarm/trajectory.json | 21 + .../W2_E10_ExpressionDiagnostics/compile.json | 11 + .../controller.json | 1 + .../W2_E10_ExpressionDiagnostics/io.json | 1 + .../motion-queue.json | 1 + .../post-report.json | 1 + .../roundtrip.json | 1 + .../W2_E10_ExpressionDiagnostics/trace.json | 1 + .../trajectory.json | 1 + .../W2_E20_SemanticDiagnostics/compile.json | 11 + .../controller.json | 1 + .../W2_E20_SemanticDiagnostics/io.json | 1 + .../motion-queue.json | 1 + .../post-report.json | 1 + .../W2_E20_SemanticDiagnostics/roundtrip.json | 1 + .../W2_E20_SemanticDiagnostics/trace.json | 1 + .../trajectory.json | 1 + .../W2_E30_MotionDiagnostics/compile.json | 11 + .../W2_E30_MotionDiagnostics/controller.json | 1 + .../programs/W2_E30_MotionDiagnostics/io.json | 1 + .../motion-queue.json | 1 + .../W2_E30_MotionDiagnostics/post-report.json | 1 + .../W2_E30_MotionDiagnostics/roundtrip.json | 1 + .../W2_E30_MotionDiagnostics/trace.json | 1 + .../W2_E30_MotionDiagnostics/trajectory.json | 1 + .../compile.json | 11 + .../controller.json | 1 + .../W2_E40_ControlFlowDiagnostics/io.json | 1 + .../motion-queue.json | 1 + .../post-report.json | 1 + .../roundtrip.json | 1 + .../W2_E40_ControlFlowDiagnostics/trace.json | 1 + .../trajectory.json | 1 + .../W2_E50_RuntimeTimeout/compile.json | 36 + .../W2_E50_RuntimeTimeout/controller.json | 431 + .../programs/W2_E50_RuntimeTimeout/io.json | 139 + .../W2_E50_RuntimeTimeout/motion-queue.json | 5 + .../W2_E50_RuntimeTimeout/post-report.json | 8 + .../W2_E50_RuntimeTimeout/roundtrip.json | 1 + .../programs/W2_E50_RuntimeTimeout/trace.json | 165 + .../W2_E50_RuntimeTimeout/trajectory.json | 21 + .../programs/W2_P10_BrandHints/compile.json | 36 + .../W2_P10_BrandHints/controller.json | 1 + .../programs/W2_P10_BrandHints/io.json | 1 + .../W2_P10_BrandHints/motion-queue.json | 1 + .../W2_P10_BrandHints/post-report.json | 45 + .../programs/W2_P10_BrandHints/roundtrip.json | 29 + .../programs/W2_P10_BrandHints/trace.json | 1 + .../W2_P10_BrandHints/trajectory.json | 1 + .../W2_P20_CrossBrandMotion/compile.json | 36 + .../W2_P20_CrossBrandMotion/controller.json | 1 + .../programs/W2_P20_CrossBrandMotion/io.json | 1 + .../W2_P20_CrossBrandMotion/motion-queue.json | 1 + .../W2_P20_CrossBrandMotion/post-report.json | 21 + .../W2_P20_CrossBrandMotion/roundtrip.json | 29 + .../W2_P20_CrossBrandMotion/trace.json | 1 + .../W2_P20_CrossBrandMotion/trajectory.json | 1 + .../programs/W2_P30_Roundtrip/compile.json | 36 + .../programs/W2_P30_Roundtrip/controller.json | 1 + .../programs/W2_P30_Roundtrip/io.json | 1 + .../W2_P30_Roundtrip/motion-queue.json | 1 + .../W2_P30_Roundtrip/post-report.json | 27 + .../programs/W2_P30_Roundtrip/roundtrip.json | 29 + .../programs/W2_P30_Roundtrip/trace.json | 1 + .../programs/W2_P30_Roundtrip/trajectory.json | 1 + .../report.html | 39 + .../report.json | 1109 + .../W2-JOB-20260628021400-19b5a2c7/job.json | 17362 +++++++++++ .../manifest.json | 440 + .../programs/W2_00_MinimalModule/compile.json | 36 + .../W2_00_MinimalModule/controller.json | 455 + .../programs/W2_00_MinimalModule/io.json | 201 + .../W2_00_MinimalModule/motion-queue.json | 82 + .../W2_00_MinimalModule/post-report.json | 8 + .../W2_00_MinimalModule/roundtrip.json | 1 + .../programs/W2_00_MinimalModule/trace.json | 72 + .../W2_00_MinimalModule/trajectory.json | 21 + .../W2_10_DataTargetToolFrame/compile.json | 36 + .../W2_10_DataTargetToolFrame/controller.json | 872 + .../W2_10_DataTargetToolFrame/io.json | 201 + .../motion-queue.json | 416 + .../post-report.json | 8 + .../W2_10_DataTargetToolFrame/roundtrip.json | 1 + .../W2_10_DataTargetToolFrame/trace.json | 155 + .../W2_10_DataTargetToolFrame/trajectory.json | 21 + .../W2_20_ExpressionMath/compile.json | 36 + .../W2_20_ExpressionMath/controller.json | 631 + .../programs/W2_20_ExpressionMath/io.json | 201 + .../W2_20_ExpressionMath/motion-queue.json | 172 + .../W2_20_ExpressionMath/post-report.json | 8 + .../W2_20_ExpressionMath/roundtrip.json | 1 + .../programs/W2_20_ExpressionMath/trace.json | 156 + .../W2_20_ExpressionMath/trajectory.json | 21 + .../W2_30_MotionAllTypes/compile.json | 36 + .../W2_30_MotionAllTypes/controller.json | 936 + .../programs/W2_30_MotionAllTypes/io.json | 201 + .../W2_30_MotionAllTypes/motion-queue.json | 480 + .../W2_30_MotionAllTypes/post-report.json | 8 + .../W2_30_MotionAllTypes/roundtrip.json | 1 + .../programs/W2_30_MotionAllTypes/trace.json | 155 + .../W2_30_MotionAllTypes/trajectory.json | 21 + .../programs/W2_40_PathEvents/compile.json | 36 + .../programs/W2_40_PathEvents/controller.json | 1106 + .../programs/W2_40_PathEvents/io.json | 201 + .../W2_40_PathEvents/motion-queue.json | 731 + .../W2_40_PathEvents/post-report.json | 27 + .../programs/W2_40_PathEvents/roundtrip.json | 1 + .../programs/W2_40_PathEvents/trace.json | 72 + .../programs/W2_40_PathEvents/trajectory.json | 21 + .../W2_50_OperationProcess/compile.json | 36 + .../W2_50_OperationProcess/controller.json | 500 + .../programs/W2_50_OperationProcess/io.json | 201 + .../W2_50_OperationProcess/motion-queue.json | 123 + .../W2_50_OperationProcess/post-report.json | 27 + .../W2_50_OperationProcess/roundtrip.json | 1 + .../W2_50_OperationProcess/trace.json | 72 + .../W2_50_OperationProcess/trajectory.json | 21 + .../programs/W2_60_IOWaitPulse/compile.json | 36 + .../W2_60_IOWaitPulse/controller.json | 1139 + .../programs/W2_60_IOWaitPulse/io.json | 253 + .../W2_60_IOWaitPulse/motion-queue.json | 279 + .../W2_60_IOWaitPulse/post-report.json | 27 + .../programs/W2_60_IOWaitPulse/roundtrip.json | 1 + .../programs/W2_60_IOWaitPulse/trace.json | 493 + .../W2_60_IOWaitPulse/trajectory.json | 21 + .../programs/W2_70_ControlFlow/compile.json | 36 + .../W2_70_ControlFlow/controller.json | 610 + .../programs/W2_70_ControlFlow/io.json | 201 + .../W2_70_ControlFlow/motion-queue.json | 5 + .../W2_70_ControlFlow/post-report.json | 153 + .../programs/W2_70_ControlFlow/roundtrip.json | 1 + .../programs/W2_70_ControlFlow/trace.json | 253 + .../W2_70_ControlFlow/trajectory.json | 21 + .../programs/W2_80_ProcFuncCall/compile.json | 36 + .../W2_80_ProcFuncCall/controller.json | 523 + .../programs/W2_80_ProcFuncCall/io.json | 201 + .../W2_80_ProcFuncCall/motion-queue.json | 5 + .../W2_80_ProcFuncCall/post-report.json | 117 + .../W2_80_ProcFuncCall/roundtrip.json | 1 + .../programs/W2_80_ProcFuncCall/trace.json | 202 + .../W2_80_ProcFuncCall/trajectory.json | 21 + .../W2_90_ExceptionAlarm/compile.json | 36 + .../W2_90_ExceptionAlarm/controller.json | 606 + .../programs/W2_90_ExceptionAlarm/io.json | 201 + .../W2_90_ExceptionAlarm/motion-queue.json | 82 + .../W2_90_ExceptionAlarm/post-report.json | 81 + .../W2_90_ExceptionAlarm/roundtrip.json | 1 + .../programs/W2_90_ExceptionAlarm/trace.json | 201 + .../W2_90_ExceptionAlarm/trajectory.json | 21 + .../W2_E10_ExpressionDiagnostics/compile.json | 11 + .../controller.json | 1 + .../W2_E10_ExpressionDiagnostics/io.json | 1 + .../motion-queue.json | 1 + .../post-report.json | 1 + .../roundtrip.json | 1 + .../W2_E10_ExpressionDiagnostics/trace.json | 1 + .../trajectory.json | 1 + .../W2_E20_SemanticDiagnostics/compile.json | 11 + .../controller.json | 1 + .../W2_E20_SemanticDiagnostics/io.json | 1 + .../motion-queue.json | 1 + .../post-report.json | 1 + .../W2_E20_SemanticDiagnostics/roundtrip.json | 1 + .../W2_E20_SemanticDiagnostics/trace.json | 1 + .../trajectory.json | 1 + .../W2_E30_MotionDiagnostics/compile.json | 11 + .../W2_E30_MotionDiagnostics/controller.json | 1 + .../programs/W2_E30_MotionDiagnostics/io.json | 1 + .../motion-queue.json | 1 + .../W2_E30_MotionDiagnostics/post-report.json | 1 + .../W2_E30_MotionDiagnostics/roundtrip.json | 1 + .../W2_E30_MotionDiagnostics/trace.json | 1 + .../W2_E30_MotionDiagnostics/trajectory.json | 1 + .../compile.json | 11 + .../controller.json | 1 + .../W2_E40_ControlFlowDiagnostics/io.json | 1 + .../motion-queue.json | 1 + .../post-report.json | 1 + .../roundtrip.json | 1 + .../W2_E40_ControlFlowDiagnostics/trace.json | 1 + .../trajectory.json | 1 + .../W2_E50_RuntimeTimeout/compile.json | 36 + .../W2_E50_RuntimeTimeout/controller.json | 431 + .../programs/W2_E50_RuntimeTimeout/io.json | 139 + .../W2_E50_RuntimeTimeout/motion-queue.json | 5 + .../W2_E50_RuntimeTimeout/post-report.json | 8 + .../W2_E50_RuntimeTimeout/roundtrip.json | 1 + .../programs/W2_E50_RuntimeTimeout/trace.json | 165 + .../W2_E50_RuntimeTimeout/trajectory.json | 21 + .../programs/W2_P10_BrandHints/compile.json | 36 + .../W2_P10_BrandHints/controller.json | 1 + .../programs/W2_P10_BrandHints/io.json | 1 + .../W2_P10_BrandHints/motion-queue.json | 1 + .../W2_P10_BrandHints/post-report.json | 45 + .../programs/W2_P10_BrandHints/roundtrip.json | 29 + .../programs/W2_P10_BrandHints/trace.json | 1 + .../W2_P10_BrandHints/trajectory.json | 1 + .../W2_P20_CrossBrandMotion/compile.json | 36 + .../W2_P20_CrossBrandMotion/controller.json | 1 + .../programs/W2_P20_CrossBrandMotion/io.json | 1 + .../W2_P20_CrossBrandMotion/motion-queue.json | 1 + .../W2_P20_CrossBrandMotion/post-report.json | 21 + .../W2_P20_CrossBrandMotion/roundtrip.json | 29 + .../W2_P20_CrossBrandMotion/trace.json | 1 + .../W2_P20_CrossBrandMotion/trajectory.json | 1 + .../programs/W2_P30_Roundtrip/compile.json | 36 + .../programs/W2_P30_Roundtrip/controller.json | 1 + .../programs/W2_P30_Roundtrip/io.json | 1 + .../W2_P30_Roundtrip/motion-queue.json | 1 + .../W2_P30_Roundtrip/post-report.json | 27 + .../programs/W2_P30_Roundtrip/roundtrip.json | 29 + .../programs/W2_P30_Roundtrip/trace.json | 1 + .../programs/W2_P30_Roundtrip/trajectory.json | 1 + .../report.html | 39 + .../report.json | 1109 + .../W2-JOB-20260628022836-51484d62/job.json | 21619 ++++++++++++++ .../manifest.json | 451 + .../programs/W2_00_MinimalModule/compile.json | 36 + .../W2_00_MinimalModule/controller.json | 455 + .../programs/W2_00_MinimalModule/io.json | 201 + .../W2_00_MinimalModule/motion-queue.json | 82 + .../W2_00_MinimalModule/post-report.json | 8 + .../W2_00_MinimalModule/roundtrip.json | 1 + .../programs/W2_00_MinimalModule/trace.json | 72 + .../W2_00_MinimalModule/trajectory.json | 21 + .../W2_10_DataTargetToolFrame/compile.json | 36 + .../W2_10_DataTargetToolFrame/controller.json | 872 + .../W2_10_DataTargetToolFrame/io.json | 201 + .../motion-queue.json | 416 + .../post-report.json | 8 + .../W2_10_DataTargetToolFrame/roundtrip.json | 1 + .../W2_10_DataTargetToolFrame/trace.json | 155 + .../W2_10_DataTargetToolFrame/trajectory.json | 21 + .../W2_20_ExpressionMath/compile.json | 36 + .../W2_20_ExpressionMath/controller.json | 631 + .../programs/W2_20_ExpressionMath/io.json | 201 + .../W2_20_ExpressionMath/motion-queue.json | 172 + .../W2_20_ExpressionMath/post-report.json | 8 + .../W2_20_ExpressionMath/roundtrip.json | 1 + .../programs/W2_20_ExpressionMath/trace.json | 156 + .../W2_20_ExpressionMath/trajectory.json | 21 + .../W2_30_MotionAllTypes/compile.json | 36 + .../W2_30_MotionAllTypes/controller.json | 936 + .../programs/W2_30_MotionAllTypes/io.json | 201 + .../W2_30_MotionAllTypes/motion-queue.json | 480 + .../W2_30_MotionAllTypes/post-report.json | 8 + .../W2_30_MotionAllTypes/roundtrip.json | 1 + .../programs/W2_30_MotionAllTypes/trace.json | 155 + .../W2_30_MotionAllTypes/trajectory.json | 21 + .../programs/W2_40_PathEvents/compile.json | 36 + .../programs/W2_40_PathEvents/controller.json | 1106 + .../programs/W2_40_PathEvents/io.json | 201 + .../W2_40_PathEvents/motion-queue.json | 731 + .../W2_40_PathEvents/post-report.json | 27 + .../programs/W2_40_PathEvents/roundtrip.json | 1 + .../programs/W2_40_PathEvents/trace.json | 72 + .../programs/W2_40_PathEvents/trajectory.json | 21 + .../W2_50_OperationProcess/compile.json | 36 + .../W2_50_OperationProcess/controller.json | 500 + .../programs/W2_50_OperationProcess/io.json | 201 + .../W2_50_OperationProcess/motion-queue.json | 123 + .../W2_50_OperationProcess/post-report.json | 27 + .../W2_50_OperationProcess/roundtrip.json | 1 + .../W2_50_OperationProcess/trace.json | 72 + .../W2_50_OperationProcess/trajectory.json | 21 + .../programs/W2_60_IOWaitPulse/compile.json | 36 + .../W2_60_IOWaitPulse/controller.json | 1139 + .../programs/W2_60_IOWaitPulse/io.json | 253 + .../W2_60_IOWaitPulse/motion-queue.json | 279 + .../W2_60_IOWaitPulse/post-report.json | 27 + .../programs/W2_60_IOWaitPulse/roundtrip.json | 1 + .../programs/W2_60_IOWaitPulse/trace.json | 493 + .../W2_60_IOWaitPulse/trajectory.json | 21 + .../programs/W2_70_ControlFlow/compile.json | 36 + .../W2_70_ControlFlow/controller.json | 610 + .../programs/W2_70_ControlFlow/io.json | 201 + .../W2_70_ControlFlow/motion-queue.json | 5 + .../W2_70_ControlFlow/post-report.json | 153 + .../programs/W2_70_ControlFlow/roundtrip.json | 1 + .../programs/W2_70_ControlFlow/trace.json | 253 + .../W2_70_ControlFlow/trajectory.json | 21 + .../programs/W2_80_ProcFuncCall/compile.json | 36 + .../W2_80_ProcFuncCall/controller.json | 523 + .../programs/W2_80_ProcFuncCall/io.json | 201 + .../W2_80_ProcFuncCall/motion-queue.json | 5 + .../W2_80_ProcFuncCall/post-report.json | 117 + .../W2_80_ProcFuncCall/roundtrip.json | 1 + .../programs/W2_80_ProcFuncCall/trace.json | 202 + .../W2_80_ProcFuncCall/trajectory.json | 21 + .../W2_90_ExceptionAlarm/compile.json | 36 + .../W2_90_ExceptionAlarm/controller.json | 606 + .../programs/W2_90_ExceptionAlarm/io.json | 201 + .../W2_90_ExceptionAlarm/motion-queue.json | 82 + .../W2_90_ExceptionAlarm/post-report.json | 81 + .../W2_90_ExceptionAlarm/roundtrip.json | 1 + .../programs/W2_90_ExceptionAlarm/trace.json | 201 + .../W2_90_ExceptionAlarm/trajectory.json | 21 + .../W2_99_FullSpecExample/compile.json | 36 + .../W2_99_FullSpecExample/controller.json | 1983 ++ .../programs/W2_99_FullSpecExample/io.json | 201 + .../W2_99_FullSpecExample/motion-queue.json | 1521 + .../W2_99_FullSpecExample/post-report.json | 45 + .../W2_99_FullSpecExample/roundtrip.json | 1 + .../programs/W2_99_FullSpecExample/trace.json | 155 + .../W2_99_FullSpecExample/trajectory.json | 21 + .../W2_E10_ExpressionDiagnostics/compile.json | 11 + .../controller.json | 1 + .../W2_E10_ExpressionDiagnostics/io.json | 1 + .../motion-queue.json | 1 + .../post-report.json | 1 + .../roundtrip.json | 1 + .../W2_E10_ExpressionDiagnostics/trace.json | 1 + .../trajectory.json | 1 + .../W2_E20_SemanticDiagnostics/compile.json | 11 + .../controller.json | 1 + .../W2_E20_SemanticDiagnostics/io.json | 1 + .../motion-queue.json | 1 + .../post-report.json | 1 + .../W2_E20_SemanticDiagnostics/roundtrip.json | 1 + .../W2_E20_SemanticDiagnostics/trace.json | 1 + .../trajectory.json | 1 + .../W2_E30_MotionDiagnostics/compile.json | 11 + .../W2_E30_MotionDiagnostics/controller.json | 1 + .../programs/W2_E30_MotionDiagnostics/io.json | 1 + .../motion-queue.json | 1 + .../W2_E30_MotionDiagnostics/post-report.json | 1 + .../W2_E30_MotionDiagnostics/roundtrip.json | 1 + .../W2_E30_MotionDiagnostics/trace.json | 1 + .../W2_E30_MotionDiagnostics/trajectory.json | 1 + .../compile.json | 11 + .../controller.json | 1 + .../W2_E40_ControlFlowDiagnostics/io.json | 1 + .../motion-queue.json | 1 + .../post-report.json | 1 + .../roundtrip.json | 1 + .../W2_E40_ControlFlowDiagnostics/trace.json | 1 + .../trajectory.json | 1 + .../W2_E50_RuntimeTimeout/compile.json | 36 + .../W2_E50_RuntimeTimeout/controller.json | 431 + .../programs/W2_E50_RuntimeTimeout/io.json | 139 + .../W2_E50_RuntimeTimeout/motion-queue.json | 5 + .../W2_E50_RuntimeTimeout/post-report.json | 8 + .../W2_E50_RuntimeTimeout/roundtrip.json | 1 + .../programs/W2_E50_RuntimeTimeout/trace.json | 165 + .../W2_E50_RuntimeTimeout/trajectory.json | 21 + .../programs/W2_P10_BrandHints/compile.json | 36 + .../W2_P10_BrandHints/controller.json | 1 + .../programs/W2_P10_BrandHints/io.json | 1 + .../W2_P10_BrandHints/motion-queue.json | 1 + .../W2_P10_BrandHints/post-report.json | 45 + .../programs/W2_P10_BrandHints/roundtrip.json | 29 + .../programs/W2_P10_BrandHints/trace.json | 1 + .../W2_P10_BrandHints/trajectory.json | 1 + .../W2_P20_CrossBrandMotion/compile.json | 36 + .../W2_P20_CrossBrandMotion/controller.json | 1 + .../programs/W2_P20_CrossBrandMotion/io.json | 1 + .../W2_P20_CrossBrandMotion/motion-queue.json | 1 + .../W2_P20_CrossBrandMotion/post-report.json | 21 + .../W2_P20_CrossBrandMotion/roundtrip.json | 29 + .../W2_P20_CrossBrandMotion/trace.json | 1 + .../W2_P20_CrossBrandMotion/trajectory.json | 1 + .../programs/W2_P30_Roundtrip/compile.json | 36 + .../programs/W2_P30_Roundtrip/controller.json | 1 + .../programs/W2_P30_Roundtrip/io.json | 1 + .../W2_P30_Roundtrip/motion-queue.json | 1 + .../W2_P30_Roundtrip/post-report.json | 27 + .../programs/W2_P30_Roundtrip/roundtrip.json | 29 + .../programs/W2_P30_Roundtrip/trace.json | 1 + .../programs/W2_P30_Roundtrip/trajectory.json | 1 + .../report.html | 40 + .../report.json | 1409 + .../W2-JOB-20260628024709-51484d62/job.json | 21619 ++++++++++++++ .../manifest.json | 451 + .../programs/W2_00_MinimalModule/compile.json | 36 + .../W2_00_MinimalModule/controller.json | 455 + .../programs/W2_00_MinimalModule/io.json | 201 + .../W2_00_MinimalModule/motion-queue.json | 82 + .../W2_00_MinimalModule/post-report.json | 8 + .../W2_00_MinimalModule/roundtrip.json | 1 + .../programs/W2_00_MinimalModule/trace.json | 72 + .../W2_00_MinimalModule/trajectory.json | 21 + .../W2_10_DataTargetToolFrame/compile.json | 36 + .../W2_10_DataTargetToolFrame/controller.json | 872 + .../W2_10_DataTargetToolFrame/io.json | 201 + .../motion-queue.json | 416 + .../post-report.json | 8 + .../W2_10_DataTargetToolFrame/roundtrip.json | 1 + .../W2_10_DataTargetToolFrame/trace.json | 155 + .../W2_10_DataTargetToolFrame/trajectory.json | 21 + .../W2_20_ExpressionMath/compile.json | 36 + .../W2_20_ExpressionMath/controller.json | 631 + .../programs/W2_20_ExpressionMath/io.json | 201 + .../W2_20_ExpressionMath/motion-queue.json | 172 + .../W2_20_ExpressionMath/post-report.json | 8 + .../W2_20_ExpressionMath/roundtrip.json | 1 + .../programs/W2_20_ExpressionMath/trace.json | 156 + .../W2_20_ExpressionMath/trajectory.json | 21 + .../W2_30_MotionAllTypes/compile.json | 36 + .../W2_30_MotionAllTypes/controller.json | 936 + .../programs/W2_30_MotionAllTypes/io.json | 201 + .../W2_30_MotionAllTypes/motion-queue.json | 480 + .../W2_30_MotionAllTypes/post-report.json | 8 + .../W2_30_MotionAllTypes/roundtrip.json | 1 + .../programs/W2_30_MotionAllTypes/trace.json | 155 + .../W2_30_MotionAllTypes/trajectory.json | 21 + .../programs/W2_40_PathEvents/compile.json | 36 + .../programs/W2_40_PathEvents/controller.json | 1106 + .../programs/W2_40_PathEvents/io.json | 201 + .../W2_40_PathEvents/motion-queue.json | 731 + .../W2_40_PathEvents/post-report.json | 27 + .../programs/W2_40_PathEvents/roundtrip.json | 1 + .../programs/W2_40_PathEvents/trace.json | 72 + .../programs/W2_40_PathEvents/trajectory.json | 21 + .../W2_50_OperationProcess/compile.json | 36 + .../W2_50_OperationProcess/controller.json | 500 + .../programs/W2_50_OperationProcess/io.json | 201 + .../W2_50_OperationProcess/motion-queue.json | 123 + .../W2_50_OperationProcess/post-report.json | 27 + .../W2_50_OperationProcess/roundtrip.json | 1 + .../W2_50_OperationProcess/trace.json | 72 + .../W2_50_OperationProcess/trajectory.json | 21 + .../programs/W2_60_IOWaitPulse/compile.json | 36 + .../W2_60_IOWaitPulse/controller.json | 1139 + .../programs/W2_60_IOWaitPulse/io.json | 253 + .../W2_60_IOWaitPulse/motion-queue.json | 279 + .../W2_60_IOWaitPulse/post-report.json | 27 + .../programs/W2_60_IOWaitPulse/roundtrip.json | 1 + .../programs/W2_60_IOWaitPulse/trace.json | 493 + .../W2_60_IOWaitPulse/trajectory.json | 21 + .../programs/W2_70_ControlFlow/compile.json | 36 + .../W2_70_ControlFlow/controller.json | 610 + .../programs/W2_70_ControlFlow/io.json | 201 + .../W2_70_ControlFlow/motion-queue.json | 5 + .../W2_70_ControlFlow/post-report.json | 153 + .../programs/W2_70_ControlFlow/roundtrip.json | 1 + .../programs/W2_70_ControlFlow/trace.json | 253 + .../W2_70_ControlFlow/trajectory.json | 21 + .../programs/W2_80_ProcFuncCall/compile.json | 36 + .../W2_80_ProcFuncCall/controller.json | 523 + .../programs/W2_80_ProcFuncCall/io.json | 201 + .../W2_80_ProcFuncCall/motion-queue.json | 5 + .../W2_80_ProcFuncCall/post-report.json | 117 + .../W2_80_ProcFuncCall/roundtrip.json | 1 + .../programs/W2_80_ProcFuncCall/trace.json | 202 + .../W2_80_ProcFuncCall/trajectory.json | 21 + .../W2_90_ExceptionAlarm/compile.json | 36 + .../W2_90_ExceptionAlarm/controller.json | 606 + .../programs/W2_90_ExceptionAlarm/io.json | 201 + .../W2_90_ExceptionAlarm/motion-queue.json | 82 + .../W2_90_ExceptionAlarm/post-report.json | 81 + .../W2_90_ExceptionAlarm/roundtrip.json | 1 + .../programs/W2_90_ExceptionAlarm/trace.json | 201 + .../W2_90_ExceptionAlarm/trajectory.json | 21 + .../W2_99_FullSpecExample/compile.json | 36 + .../W2_99_FullSpecExample/controller.json | 1983 ++ .../programs/W2_99_FullSpecExample/io.json | 201 + .../W2_99_FullSpecExample/motion-queue.json | 1521 + .../W2_99_FullSpecExample/post-report.json | 45 + .../W2_99_FullSpecExample/roundtrip.json | 1 + .../programs/W2_99_FullSpecExample/trace.json | 155 + .../W2_99_FullSpecExample/trajectory.json | 21 + .../W2_E10_ExpressionDiagnostics/compile.json | 11 + .../controller.json | 1 + .../W2_E10_ExpressionDiagnostics/io.json | 1 + .../motion-queue.json | 1 + .../post-report.json | 1 + .../roundtrip.json | 1 + .../W2_E10_ExpressionDiagnostics/trace.json | 1 + .../trajectory.json | 1 + .../W2_E20_SemanticDiagnostics/compile.json | 11 + .../controller.json | 1 + .../W2_E20_SemanticDiagnostics/io.json | 1 + .../motion-queue.json | 1 + .../post-report.json | 1 + .../W2_E20_SemanticDiagnostics/roundtrip.json | 1 + .../W2_E20_SemanticDiagnostics/trace.json | 1 + .../trajectory.json | 1 + .../W2_E30_MotionDiagnostics/compile.json | 11 + .../W2_E30_MotionDiagnostics/controller.json | 1 + .../programs/W2_E30_MotionDiagnostics/io.json | 1 + .../motion-queue.json | 1 + .../W2_E30_MotionDiagnostics/post-report.json | 1 + .../W2_E30_MotionDiagnostics/roundtrip.json | 1 + .../W2_E30_MotionDiagnostics/trace.json | 1 + .../W2_E30_MotionDiagnostics/trajectory.json | 1 + .../compile.json | 11 + .../controller.json | 1 + .../W2_E40_ControlFlowDiagnostics/io.json | 1 + .../motion-queue.json | 1 + .../post-report.json | 1 + .../roundtrip.json | 1 + .../W2_E40_ControlFlowDiagnostics/trace.json | 1 + .../trajectory.json | 1 + .../W2_E50_RuntimeTimeout/compile.json | 36 + .../W2_E50_RuntimeTimeout/controller.json | 431 + .../programs/W2_E50_RuntimeTimeout/io.json | 139 + .../W2_E50_RuntimeTimeout/motion-queue.json | 5 + .../W2_E50_RuntimeTimeout/post-report.json | 8 + .../W2_E50_RuntimeTimeout/roundtrip.json | 1 + .../programs/W2_E50_RuntimeTimeout/trace.json | 165 + .../W2_E50_RuntimeTimeout/trajectory.json | 21 + .../programs/W2_P10_BrandHints/compile.json | 36 + .../W2_P10_BrandHints/controller.json | 1 + .../programs/W2_P10_BrandHints/io.json | 1 + .../W2_P10_BrandHints/motion-queue.json | 1 + .../W2_P10_BrandHints/post-report.json | 45 + .../programs/W2_P10_BrandHints/roundtrip.json | 29 + .../programs/W2_P10_BrandHints/trace.json | 1 + .../W2_P10_BrandHints/trajectory.json | 1 + .../W2_P20_CrossBrandMotion/compile.json | 36 + .../W2_P20_CrossBrandMotion/controller.json | 1 + .../programs/W2_P20_CrossBrandMotion/io.json | 1 + .../W2_P20_CrossBrandMotion/motion-queue.json | 1 + .../W2_P20_CrossBrandMotion/post-report.json | 21 + .../W2_P20_CrossBrandMotion/roundtrip.json | 29 + .../W2_P20_CrossBrandMotion/trace.json | 1 + .../W2_P20_CrossBrandMotion/trajectory.json | 1 + .../programs/W2_P30_Roundtrip/compile.json | 36 + .../programs/W2_P30_Roundtrip/controller.json | 1 + .../programs/W2_P30_Roundtrip/io.json | 1 + .../W2_P30_Roundtrip/motion-queue.json | 1 + .../W2_P30_Roundtrip/post-report.json | 27 + .../programs/W2_P30_Roundtrip/roundtrip.json | 29 + .../programs/W2_P30_Roundtrip/trace.json | 1 + .../programs/W2_P30_Roundtrip/trajectory.json | 1 + .../report.html | 40 + .../report.json | 1409 + .../W2-JOB-20260628082622-51484d62/job.json | 24632 ++++++++++++++++ .../manifest.json | 451 + .../programs/W2_00_MinimalModule/compile.json | 36 + .../W2_00_MinimalModule/controller.json | 455 + .../programs/W2_00_MinimalModule/io.json | 201 + .../W2_00_MinimalModule/motion-queue.json | 82 + .../W2_00_MinimalModule/post-report.json | 8 + .../W2_00_MinimalModule/roundtrip.json | 1 + .../programs/W2_00_MinimalModule/trace.json | 72 + .../W2_00_MinimalModule/trajectory.json | 151 + .../W2_10_DataTargetToolFrame/compile.json | 36 + .../W2_10_DataTargetToolFrame/controller.json | 872 + .../W2_10_DataTargetToolFrame/io.json | 201 + .../motion-queue.json | 416 + .../post-report.json | 8 + .../W2_10_DataTargetToolFrame/roundtrip.json | 1 + .../W2_10_DataTargetToolFrame/trace.json | 155 + .../W2_10_DataTargetToolFrame/trajectory.json | 407 + .../W2_20_ExpressionMath/compile.json | 36 + .../W2_20_ExpressionMath/controller.json | 631 + .../programs/W2_20_ExpressionMath/io.json | 201 + .../W2_20_ExpressionMath/motion-queue.json | 172 + .../W2_20_ExpressionMath/post-report.json | 8 + .../W2_20_ExpressionMath/roundtrip.json | 1 + .../programs/W2_20_ExpressionMath/trace.json | 156 + .../W2_20_ExpressionMath/trajectory.json | 279 + .../W2_30_MotionAllTypes/compile.json | 36 + .../W2_30_MotionAllTypes/controller.json | 936 + .../programs/W2_30_MotionAllTypes/io.json | 201 + .../W2_30_MotionAllTypes/motion-queue.json | 480 + .../W2_30_MotionAllTypes/post-report.json | 8 + .../W2_30_MotionAllTypes/roundtrip.json | 1 + .../programs/W2_30_MotionAllTypes/trace.json | 155 + .../W2_30_MotionAllTypes/trajectory.json | 407 + .../programs/W2_40_PathEvents/compile.json | 36 + .../programs/W2_40_PathEvents/controller.json | 1106 + .../programs/W2_40_PathEvents/io.json | 201 + .../W2_40_PathEvents/motion-queue.json | 731 + .../W2_40_PathEvents/post-report.json | 27 + .../programs/W2_40_PathEvents/roundtrip.json | 1 + .../programs/W2_40_PathEvents/trace.json | 72 + .../programs/W2_40_PathEvents/trajectory.json | 419 + .../W2_50_OperationProcess/compile.json | 36 + .../W2_50_OperationProcess/controller.json | 500 + .../programs/W2_50_OperationProcess/io.json | 201 + .../W2_50_OperationProcess/motion-queue.json | 123 + .../W2_50_OperationProcess/post-report.json | 27 + .../W2_50_OperationProcess/roundtrip.json | 1 + .../W2_50_OperationProcess/trace.json | 72 + .../W2_50_OperationProcess/trajectory.json | 155 + .../programs/W2_60_IOWaitPulse/compile.json | 36 + .../W2_60_IOWaitPulse/controller.json | 1139 + .../programs/W2_60_IOWaitPulse/io.json | 253 + .../W2_60_IOWaitPulse/motion-queue.json | 279 + .../W2_60_IOWaitPulse/post-report.json | 27 + .../programs/W2_60_IOWaitPulse/roundtrip.json | 1 + .../programs/W2_60_IOWaitPulse/trace.json | 493 + .../W2_60_IOWaitPulse/trajectory.json | 155 + .../programs/W2_70_ControlFlow/compile.json | 36 + .../W2_70_ControlFlow/controller.json | 610 + .../programs/W2_70_ControlFlow/io.json | 201 + .../W2_70_ControlFlow/motion-queue.json | 5 + .../W2_70_ControlFlow/post-report.json | 153 + .../programs/W2_70_ControlFlow/roundtrip.json | 1 + .../programs/W2_70_ControlFlow/trace.json | 253 + .../W2_70_ControlFlow/trajectory.json | 22 + .../programs/W2_80_ProcFuncCall/compile.json | 36 + .../W2_80_ProcFuncCall/controller.json | 523 + .../programs/W2_80_ProcFuncCall/io.json | 201 + .../W2_80_ProcFuncCall/motion-queue.json | 5 + .../W2_80_ProcFuncCall/post-report.json | 117 + .../W2_80_ProcFuncCall/roundtrip.json | 1 + .../programs/W2_80_ProcFuncCall/trace.json | 202 + .../W2_80_ProcFuncCall/trajectory.json | 22 + .../W2_90_ExceptionAlarm/compile.json | 36 + .../W2_90_ExceptionAlarm/controller.json | 606 + .../programs/W2_90_ExceptionAlarm/io.json | 201 + .../W2_90_ExceptionAlarm/motion-queue.json | 82 + .../W2_90_ExceptionAlarm/post-report.json | 81 + .../W2_90_ExceptionAlarm/roundtrip.json | 1 + .../programs/W2_90_ExceptionAlarm/trace.json | 201 + .../W2_90_ExceptionAlarm/trajectory.json | 151 + .../W2_99_FullSpecExample/compile.json | 36 + .../W2_99_FullSpecExample/controller.json | 1983 ++ .../programs/W2_99_FullSpecExample/io.json | 201 + .../W2_99_FullSpecExample/motion-queue.json | 1521 + .../W2_99_FullSpecExample/post-report.json | 45 + .../W2_99_FullSpecExample/roundtrip.json | 1 + .../programs/W2_99_FullSpecExample/trace.json | 155 + .../W2_99_FullSpecExample/trajectory.json | 1075 + .../W2_E10_ExpressionDiagnostics/compile.json | 11 + .../controller.json | 1 + .../W2_E10_ExpressionDiagnostics/io.json | 1 + .../motion-queue.json | 1 + .../post-report.json | 1 + .../roundtrip.json | 1 + .../W2_E10_ExpressionDiagnostics/trace.json | 1 + .../trajectory.json | 1 + .../W2_E20_SemanticDiagnostics/compile.json | 11 + .../controller.json | 1 + .../W2_E20_SemanticDiagnostics/io.json | 1 + .../motion-queue.json | 1 + .../post-report.json | 1 + .../W2_E20_SemanticDiagnostics/roundtrip.json | 1 + .../W2_E20_SemanticDiagnostics/trace.json | 1 + .../trajectory.json | 1 + .../W2_E30_MotionDiagnostics/compile.json | 11 + .../W2_E30_MotionDiagnostics/controller.json | 1 + .../programs/W2_E30_MotionDiagnostics/io.json | 1 + .../motion-queue.json | 1 + .../W2_E30_MotionDiagnostics/post-report.json | 1 + .../W2_E30_MotionDiagnostics/roundtrip.json | 1 + .../W2_E30_MotionDiagnostics/trace.json | 1 + .../W2_E30_MotionDiagnostics/trajectory.json | 1 + .../compile.json | 11 + .../controller.json | 1 + .../W2_E40_ControlFlowDiagnostics/io.json | 1 + .../motion-queue.json | 1 + .../post-report.json | 1 + .../roundtrip.json | 1 + .../W2_E40_ControlFlowDiagnostics/trace.json | 1 + .../trajectory.json | 1 + .../W2_E50_RuntimeTimeout/compile.json | 36 + .../W2_E50_RuntimeTimeout/controller.json | 431 + .../programs/W2_E50_RuntimeTimeout/io.json | 139 + .../W2_E50_RuntimeTimeout/motion-queue.json | 5 + .../W2_E50_RuntimeTimeout/post-report.json | 8 + .../W2_E50_RuntimeTimeout/roundtrip.json | 1 + .../programs/W2_E50_RuntimeTimeout/trace.json | 165 + .../W2_E50_RuntimeTimeout/trajectory.json | 22 + .../programs/W2_P10_BrandHints/compile.json | 36 + .../W2_P10_BrandHints/controller.json | 1 + .../programs/W2_P10_BrandHints/io.json | 1 + .../W2_P10_BrandHints/motion-queue.json | 1 + .../W2_P10_BrandHints/post-report.json | 45 + .../programs/W2_P10_BrandHints/roundtrip.json | 29 + .../programs/W2_P10_BrandHints/trace.json | 1 + .../W2_P10_BrandHints/trajectory.json | 1 + .../W2_P20_CrossBrandMotion/compile.json | 36 + .../W2_P20_CrossBrandMotion/controller.json | 1 + .../programs/W2_P20_CrossBrandMotion/io.json | 1 + .../W2_P20_CrossBrandMotion/motion-queue.json | 1 + .../W2_P20_CrossBrandMotion/post-report.json | 21 + .../W2_P20_CrossBrandMotion/roundtrip.json | 29 + .../W2_P20_CrossBrandMotion/trace.json | 1 + .../W2_P20_CrossBrandMotion/trajectory.json | 1 + .../programs/W2_P30_Roundtrip/compile.json | 36 + .../programs/W2_P30_Roundtrip/controller.json | 1 + .../programs/W2_P30_Roundtrip/io.json | 1 + .../W2_P30_Roundtrip/motion-queue.json | 1 + .../W2_P30_Roundtrip/post-report.json | 27 + .../programs/W2_P30_Roundtrip/roundtrip.json | 29 + .../programs/W2_P30_Roundtrip/trace.json | 1 + .../programs/W2_P30_Roundtrip/trajectory.json | 1 + .../report.html | 40 + .../report.json | 1409 + .../button-evidence-public.json | 633 + .../virtual-controller/button-evidence.json | 467 + .../virtual-controller/evidence.json | 10 +- .../virtual-controller-desktop.png | Bin 45666 -> 50362 bytes .../virtual-controller-mobile.png | Bin 44869 -> 40557 bytes .../error/W2_E30_MotionDiagnostics.grl | 19 + .../error/W2_E50_RuntimeTimeout.grl | 14 + .../abb120/spec-programs/manifest.json | 52 + .../spec-programs/post/W2_P10_BrandHints.grl | 12 + .../post/W2_P20_CrossBrandMotion.grl | 20 + .../spec-programs/post/W2_P30_Roundtrip.grl | 24 + .../runtime/W2_00_MinimalModule.grl | 9 + .../runtime/W2_10_DataTargetToolFrame.grl | 45 + .../runtime/W2_20_ExpressionMath.grl | 20 + .../runtime/W2_30_MotionAllTypes.grl | 21 + .../runtime/W2_40_PathEvents.grl | 26 + .../runtime/W2_50_OperationProcess.grl | 26 + .../runtime/W2_60_IOWaitPulse.grl | 23 + .../runtime/W2_70_ControlFlow.grl | 35 + .../runtime/W2_80_ProcFuncCall.grl | 26 + .../runtime/W2_90_ExceptionAlarm.grl | 25 + .../runtime/W2_99_FullSpecExample.grl | 80 + .../static/W2_E10_ExpressionDiagnostics.grl | 14 + .../static/W2_E20_SemanticDiagnostics.grl | 19 + .../static/W2_E40_ControlFlowDiagnostics.grl | 21 + .../tests/integration/abb120SpecSuite.test.ts | 132 + .../integration/abb120SuiteArtifacts.test.ts | 2 + package-lock.json | 1 + package.json | 8 +- .../GRL功能语法逻辑与程序创建使用手册.docx | Bin 0 -> 2217326 bytes work/doc/通用机器人离线编程系统测试文档.docx | Bin 0 -> 105026 bytes work/doc/通用机器人编程语法规范.md | 342 +- working2/01-项目功能内容.md | 216 + working2/02-项目程序开发详细步骤.md | 378 + working2/03-推进台账.md | 183 + working2/04-任务矩阵.md | 88 + working2/05-验收证据.md | 220 + working2/06-决策记录.md | 184 + working2/07-服务器发布与演示包实施方案.md | 238 + working2/README.md | 64 +- working2/programs/manifest.md | 115 + 820 files changed, 215410 insertions(+), 211 deletions(-) create mode 100644 kdl-wasm/web/scripts/build-demo-package.mjs create mode 100644 kdl-wasm/web/scripts/deploy-demo-package.ps1 create mode 100644 kdl-wasm/web/scripts/generate-abb120-test-document.mjs create mode 100644 kdl-wasm/web/scripts/generate-grl-user-manual.mjs create mode 100644 kdl-wasm/web/scripts/run-abb120-spec-suite.ts create mode 100644 kdl-wasm/web/scripts/verify-demo-package.mjs create mode 100644 kdl-wasm/web/scripts/verify-virtual-controller-buttons.mjs create mode 100644 kdl-wasm/web/src/suites/abb120SpecSuite.ts create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/job.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/manifest.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_00_MinimalModule/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_10_DataTargetToolFrame/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_20_ExpressionMath/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_30_MotionAllTypes/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_40_PathEvents/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_50_OperationProcess/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_60_IOWaitPulse/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_70_ControlFlow/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_80_ProcFuncCall/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_90_ExceptionAlarm/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E20_SemanticDiagnostics/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E30_MotionDiagnostics/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_E50_RuntimeTimeout/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P10_BrandHints/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P20_CrossBrandMotion/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/programs/W2_P30_Roundtrip/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/report.html create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628013857-19b5a2c7/report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/job.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/manifest.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_00_MinimalModule/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_10_DataTargetToolFrame/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_20_ExpressionMath/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_30_MotionAllTypes/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_40_PathEvents/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_50_OperationProcess/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_60_IOWaitPulse/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_70_ControlFlow/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_80_ProcFuncCall/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_90_ExceptionAlarm/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E10_ExpressionDiagnostics/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E20_SemanticDiagnostics/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E30_MotionDiagnostics/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E40_ControlFlowDiagnostics/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_E50_RuntimeTimeout/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P10_BrandHints/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P20_CrossBrandMotion/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/programs/W2_P30_Roundtrip/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/report.html create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628021400-19b5a2c7/report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/job.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/manifest.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_00_MinimalModule/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_10_DataTargetToolFrame/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_20_ExpressionMath/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_30_MotionAllTypes/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_40_PathEvents/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_50_OperationProcess/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_60_IOWaitPulse/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_70_ControlFlow/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_80_ProcFuncCall/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_90_ExceptionAlarm/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_99_FullSpecExample/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E10_ExpressionDiagnostics/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E20_SemanticDiagnostics/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E30_MotionDiagnostics/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E40_ControlFlowDiagnostics/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_E50_RuntimeTimeout/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P10_BrandHints/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P20_CrossBrandMotion/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/programs/W2_P30_Roundtrip/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/report.html create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628022836-51484d62/report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/job.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/manifest.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_00_MinimalModule/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_10_DataTargetToolFrame/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_20_ExpressionMath/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_30_MotionAllTypes/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_40_PathEvents/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_50_OperationProcess/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_60_IOWaitPulse/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_70_ControlFlow/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_80_ProcFuncCall/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_90_ExceptionAlarm/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_99_FullSpecExample/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E10_ExpressionDiagnostics/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E20_SemanticDiagnostics/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E30_MotionDiagnostics/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E40_ControlFlowDiagnostics/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_E50_RuntimeTimeout/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P10_BrandHints/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P20_CrossBrandMotion/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/programs/W2_P30_Roundtrip/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/report.html create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628024709-51484d62/report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/job.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/manifest.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_00_MinimalModule/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_10_DataTargetToolFrame/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_20_ExpressionMath/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_30_MotionAllTypes/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_40_PathEvents/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_50_OperationProcess/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_60_IOWaitPulse/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_70_ControlFlow/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_80_ProcFuncCall/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_90_ExceptionAlarm/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_99_FullSpecExample/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E10_ExpressionDiagnostics/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E20_SemanticDiagnostics/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E30_MotionDiagnostics/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E40_ControlFlowDiagnostics/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_E50_RuntimeTimeout/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P10_BrandHints/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P20_CrossBrandMotion/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/compile.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/controller.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/io.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/motion-queue.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/post-report.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/roundtrip.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/trace.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/programs/W2_P30_Roundtrip/trajectory.json create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/report.html create mode 100644 kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/report.json create mode 100644 kdl-wasm/web/test-results/virtual-controller/button-evidence-public.json create mode 100644 kdl-wasm/web/test-results/virtual-controller/button-evidence.json create mode 100644 kdl-wasm/web/tests/fixtures/abb120/spec-programs/error/W2_E30_MotionDiagnostics.grl create mode 100644 kdl-wasm/web/tests/fixtures/abb120/spec-programs/error/W2_E50_RuntimeTimeout.grl create mode 100644 kdl-wasm/web/tests/fixtures/abb120/spec-programs/manifest.json create mode 100644 kdl-wasm/web/tests/fixtures/abb120/spec-programs/post/W2_P10_BrandHints.grl create mode 100644 kdl-wasm/web/tests/fixtures/abb120/spec-programs/post/W2_P20_CrossBrandMotion.grl create mode 100644 kdl-wasm/web/tests/fixtures/abb120/spec-programs/post/W2_P30_Roundtrip.grl create mode 100644 kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_00_MinimalModule.grl create mode 100644 kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_10_DataTargetToolFrame.grl create mode 100644 kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_20_ExpressionMath.grl create mode 100644 kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_30_MotionAllTypes.grl create mode 100644 kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_40_PathEvents.grl create mode 100644 kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_50_OperationProcess.grl create mode 100644 kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_60_IOWaitPulse.grl create mode 100644 kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_70_ControlFlow.grl create mode 100644 kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_80_ProcFuncCall.grl create mode 100644 kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_90_ExceptionAlarm.grl create mode 100644 kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_99_FullSpecExample.grl create mode 100644 kdl-wasm/web/tests/fixtures/abb120/spec-programs/static/W2_E10_ExpressionDiagnostics.grl create mode 100644 kdl-wasm/web/tests/fixtures/abb120/spec-programs/static/W2_E20_SemanticDiagnostics.grl create mode 100644 kdl-wasm/web/tests/fixtures/abb120/spec-programs/static/W2_E40_ControlFlowDiagnostics.grl create mode 100644 kdl-wasm/web/tests/integration/abb120SpecSuite.test.ts create mode 100644 work/doc/GRL功能语法逻辑与程序创建使用手册.docx create mode 100644 work/doc/通用机器人离线编程系统测试文档.docx create mode 100644 working2/01-项目功能内容.md create mode 100644 working2/02-项目程序开发详细步骤.md create mode 100644 working2/03-推进台账.md create mode 100644 working2/04-任务矩阵.md create mode 100644 working2/05-验收证据.md create mode 100644 working2/06-决策记录.md create mode 100644 working2/07-服务器发布与演示包实施方案.md create mode 100644 working2/programs/manifest.md diff --git a/kdl-wasm/web/app/virtual-controller.css b/kdl-wasm/web/app/virtual-controller.css index 0b3f3ed..3b743f3 100644 --- a/kdl-wasm/web/app/virtual-controller.css +++ b/kdl-wasm/web/app/virtual-controller.css @@ -2,20 +2,32 @@ box-sizing: border-box; } +:root { + color-scheme: light; + --ink: #1f2933; + --muted: #5d6972; + --line: #c7d0d6; + --panel: #f8fafb; + --panel-strong: #ffffff; + --accent: #1f7a8c; + --accent-dark: #14566a; + --rail: #dde5e9; +} + body { margin: 0; - font-family: Arial, sans-serif; - color: #1f2933; + font-family: Arial, "Microsoft YaHei", sans-serif; + color: var(--ink); background: #eef2f4; } .workbench { min-height: 100vh; display: grid; - grid-template-columns: 240px minmax(320px, 1fr) 280px; - grid-template-rows: 48px minmax(280px, 1fr) 180px; + grid-template-columns: 240px minmax(360px, 1fr) 300px; + grid-template-rows: auto minmax(280px, 1fr) minmax(230px, 34vh); gap: 1px; - background: #c7d0d6; + background: var(--line); } .command-bar, @@ -24,24 +36,74 @@ body { .pendant, .editor, .bottom-panel { - background: #f8fafb; + background: var(--panel); } .command-bar { grid-column: 1 / 4; - display: flex; - flex-wrap: wrap; + display: grid; + grid-template-columns: auto minmax(220px, 360px) repeat(7, auto) minmax(260px, 1fr); align-items: center; gap: 8px; padding: 8px 12px; + min-width: 0; +} + +.station-title { + display: grid; + gap: 2px; + min-width: 150px; +} + +.station-title span, +.program-picker span, +.frame-control span { + color: var(--muted); + font-size: 12px; +} + +.program-picker, +.frame-control { + display: grid; + gap: 3px; + min-width: 0; +} + +.program-picker select, +.frame-control input { + width: 100%; + min-width: 0; +} + +button, +select { + min-height: 32px; + border: 1px solid #9aa8b2; + background: var(--panel-strong); + color: var(--ink); + border-radius: 4px; + font: inherit; } button { - min-height: 32px; - border: 1px solid #9aa8b2; - background: #ffffff; - color: #1f2933; - border-radius: 4px; + padding: 0 10px; + white-space: nowrap; +} + +button:hover, +select:hover { + border-color: var(--accent); +} + +button[aria-pressed="true"] { + background: var(--accent-dark); + color: #ffffff; + border-color: var(--accent-dark); +} + +output { + color: var(--muted); + font-size: 12px; } .object-tree { @@ -58,7 +120,11 @@ button { .object-tree ul { margin: 0; padding-left: 18px; - line-height: 1.8; + line-height: 1.75; +} + +.object-tree li { + overflow-wrap: anywhere; } .viewport { @@ -75,10 +141,20 @@ button { width: calc(100% - 48px); } +.viewport circle { + fill: var(--accent-dark); +} + +[data-path-current] { + fill: #b8542f; + stroke: #ffffff; + stroke-width: 3; +} + .robot-arm { position: absolute; left: 12%; - top: 20%; + top: 18%; width: 62%; height: 48%; } @@ -114,7 +190,7 @@ button { .pendant dl { display: grid; - grid-template-columns: 84px 1fr; + grid-template-columns: 78px minmax(0, 1fr); gap: 8px; margin: 0; } @@ -123,6 +199,11 @@ button { font-weight: 700; } +.pendant dd { + margin: 0; + overflow-wrap: anywhere; +} + .editor { grid-column: 1 / 3; padding: 12px; @@ -138,43 +219,126 @@ button { .editor pre { margin: 0; padding: 12px; - background: #1f2933; + min-height: 150px; + background: #202a33; color: #f8fafb; overflow: auto; + line-height: 1.45; + border-radius: 4px; } .bottom-panel { + grid-column: 1 / 4; padding: 12px; display: grid; - grid-template-columns: repeat(7, minmax(100px, 1fr)); + grid-template-columns: repeat(9, minmax(100px, 1fr)); gap: 8px; overflow: auto; } -.bottom-panel div { - border: 1px solid #c7d0d6; +.bottom-panel > div { + border: 1px solid var(--line); padding: 8px; - background: #ffffff; + background: var(--panel-strong); display: grid; gap: 6px; min-width: 0; + align-content: start; } .bottom-panel span { overflow-wrap: anywhere; } -@media (max-width: 840px) { +.bottom-panel progress { + width: 100%; + height: 8px; +} + +.steps-panel, +.trajectory-panel { + grid-column: 1 / -1; + min-height: 150px; +} + +.steps-table-wrap, +.trajectory-table-wrap { + overflow: auto; + border: 1px solid var(--line); + max-height: 260px; +} + +table { + width: 100%; + border-collapse: collapse; + font-size: 12px; +} + +th, +td { + border-bottom: 1px solid #e1e7eb; + border-right: 1px solid #e1e7eb; + padding: 6px 7px; + text-align: left; + white-space: nowrap; +} + +th { + position: sticky; + top: 0; + z-index: 1; + background: var(--rail); +} + +tr[aria-current="true"] td { + background: #e6f2f4; + color: #0f4d5d; + font-weight: 700; +} + +tr[data-step-state="active"] td { + background: #fff2cc; + color: #6f4b00; + font-weight: 700; +} + +tr[data-step-state="complete"] td { + background: #f4f7f8; + color: var(--muted); +} + +@media (max-width: 1180px) { + .command-bar { + grid-template-columns: auto minmax(200px, 1fr) repeat(7, auto); + } + + .frame-control { + grid-column: 1 / -1; + } +} + +@media (max-width: 900px) { .workbench { grid-template-columns: 1fr; grid-template-rows: auto; } .command-bar, - .editor { + .editor, + .bottom-panel { grid-column: auto; } + .command-bar { + grid-template-columns: 1fr 1fr; + } + + .station-title, + .program-picker, + .frame-control { + grid-column: 1 / -1; + } + .bottom-panel { grid-template-columns: 1fr 1fr; } @@ -183,3 +347,33 @@ button { min-height: 300px; } } + +@media (max-width: 560px) { + .command-bar { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .command-bar button { + padding: 0 6px; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + } + + .station-title, + .program-picker, + .frame-control { + grid-column: 1 / -1; + } + + .bottom-panel { + grid-template-columns: 1fr; + } + + .robot-arm { + left: 4%; + width: 80%; + transform: scale(0.85); + transform-origin: left top; + } +} diff --git a/kdl-wasm/web/app/virtual-controller.html b/kdl-wasm/web/app/virtual-controller.html index 583fbc7..cb81f25 100644 --- a/kdl-wasm/web/app/virtual-controller.html +++ b/kdl-wasm/web/app/virtual-controller.html @@ -7,9 +7,16 @@ -
+
- ABB120 Station +
+ ABB120 Station + W2-JOB-latest +
+ @@ -17,21 +24,28 @@ +
+ +
-
+ - - - - + + + +
+ +
+
Logready
Diagnosticsready
@@ -76,7 +95,54 @@ end
Waitnone
Motion Queueempty
Trace0 events
-
ReportsA120-REPORT
+
ReportsW2-REPORT
+
Parseridle
+
Storagechecking browser storage
+
+ Program Steps + step 0 +
+ + + + + + + + + + + + + +
#TimeLineStepSourceMotion/TargetSamples
+
+
+
+ Trajectory Frames + t=0 s +
+ + + + + + + + + + + + + + + + + + +
#tMotionTargetTCP XYZTCP QJ1J2J3J4J5J6
+
+
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)} + + + +
+

KDL OLP ABB120 Working2 Demo

+

Release ${escapeHtml(demoManifest.release_id)} / Job ${escapeHtml(demoManifest.job_id)} / Suite ${escapeHtml(demoManifest.suite_id)}

+
+
+ +
+
Programs${demoManifest.program_count}
+
Runtime${demoManifest.runtime_programs}
+
Static${demoManifest.static_programs}
+
Post${demoManifest.post_programs}
+
Fail${demoManifest.summary.fail}
+
+
+

Program Evidence

+ + + ${rows} + +
ProgramLayerStatusSpec SectionsArtifact
+
+
+

Screenshots

+
+ Virtual controller desktop screenshot + Virtual controller mobile screenshot +
+
+
+

Documents

+ + + ${demoManifest.docs.map((doc) => ``).join("\n ")} + +
${escapeHtml(doc.title)}${escapeHtml(doc.href)}
+
+
+ + +`; +} + +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(", ")}

+ + + ${rows} +
ProgramLayerStatusDiagnostics
+ + +`; +} + +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

+ + + + + + + + + + + + + + + + + + + + +
ProgramLayerStatusDiagnostics
W2_00_MinimalModuleRuntimepass0
W2_10_DataTargetToolFrameRuntimepass8
W2_20_ExpressionMathRuntimepass0
W2_30_MotionAllTypesRuntimepass8
W2_40_PathEventsRuntimepass0
W2_50_OperationProcessRuntimepass0
W2_60_IOWaitPulseRuntimepass0
W2_70_ControlFlowRuntimepass45
W2_80_ProcFuncCallRuntimepass6
W2_90_ExceptionAlarmRuntimepass13
W2_E10_ExpressionDiagnosticsStaticdiagnostic1
W2_E20_SemanticDiagnosticsStaticdiagnostic2
W2_E30_MotionDiagnosticsStaticdiagnostic1
W2_E40_ControlFlowDiagnosticsStaticdiagnostic1
W2_E50_RuntimeTimeoutRuntimepass1
W2_P10_BrandHintsPostpass10
W2_P20_CrossBrandMotionPostpass6
W2_P30_RoundtripPostpass7
+ + 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

+ + + + + + + + + + + + + + + + + + + + +
ProgramLayerStatusDiagnostics
W2_00_MinimalModuleRuntimepass0
W2_10_DataTargetToolFrameRuntimepass8
W2_20_ExpressionMathRuntimepass0
W2_30_MotionAllTypesRuntimepass8
W2_40_PathEventsRuntimepass0
W2_50_OperationProcessRuntimepass0
W2_60_IOWaitPulseRuntimepass0
W2_70_ControlFlowRuntimepass45
W2_80_ProcFuncCallRuntimepass6
W2_90_ExceptionAlarmRuntimepass13
W2_E10_ExpressionDiagnosticsStaticdiagnostic1
W2_E20_SemanticDiagnosticsStaticdiagnostic2
W2_E30_MotionDiagnosticsStaticdiagnostic1
W2_E40_ControlFlowDiagnosticsStaticdiagnostic1
W2_E50_RuntimeTimeoutRuntimepass1
W2_P10_BrandHintsPostpass10
W2_P20_CrossBrandMotionPostpass6
W2_P30_RoundtripPostpass7
+ + 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

+ + + + + + + + + + + + + + + + + + + + + +
ProgramLayerStatusDiagnostics
W2_00_MinimalModuleRuntimepass0
W2_10_DataTargetToolFrameRuntimepass8
W2_20_ExpressionMathRuntimepass0
W2_30_MotionAllTypesRuntimepass8
W2_40_PathEventsRuntimepass0
W2_50_OperationProcessRuntimepass0
W2_60_IOWaitPulseRuntimepass0
W2_70_ControlFlowRuntimepass45
W2_80_ProcFuncCallRuntimepass6
W2_90_ExceptionAlarmRuntimepass13
W2_99_FullSpecExampleRuntimepass4
W2_E10_ExpressionDiagnosticsStaticdiagnostic13
W2_E20_SemanticDiagnosticsStaticdiagnostic6
W2_E30_MotionDiagnosticsStaticdiagnostic4
W2_E40_ControlFlowDiagnosticsStaticdiagnostic9
W2_E50_RuntimeTimeoutRuntimediagnostic1
W2_P10_BrandHintsPostpass10
W2_P20_CrossBrandMotionPostpass6
W2_P30_RoundtripPostpass7
+ + 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

+ + + + + + + + + + + + + + + + + + + + + +
ProgramLayerStatusDiagnostics
W2_00_MinimalModuleRuntimepass0
W2_10_DataTargetToolFrameRuntimepass8
W2_20_ExpressionMathRuntimepass0
W2_30_MotionAllTypesRuntimepass8
W2_40_PathEventsRuntimepass0
W2_50_OperationProcessRuntimepass0
W2_60_IOWaitPulseRuntimepass0
W2_70_ControlFlowRuntimepass45
W2_80_ProcFuncCallRuntimepass6
W2_90_ExceptionAlarmRuntimepass13
W2_99_FullSpecExampleRuntimepass4
W2_E10_ExpressionDiagnosticsStaticdiagnostic13
W2_E20_SemanticDiagnosticsStaticdiagnostic6
W2_E30_MotionDiagnosticsStaticdiagnostic4
W2_E40_ControlFlowDiagnosticsStaticdiagnostic9
W2_E50_RuntimeTimeoutRuntimediagnostic1
W2_P10_BrandHintsPostpass10
W2_P20_CrossBrandMotionPostpass6
W2_P30_RoundtripPostpass7
+ + 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

+ + + + + + + + + + + + + + + + + + + + + +
ProgramLayerStatusDiagnostics
W2_00_MinimalModuleRuntimepass0
W2_10_DataTargetToolFrameRuntimepass8
W2_20_ExpressionMathRuntimepass0
W2_30_MotionAllTypesRuntimepass8
W2_40_PathEventsRuntimepass0
W2_50_OperationProcessRuntimepass0
W2_60_IOWaitPulseRuntimepass0
W2_70_ControlFlowRuntimepass45
W2_80_ProcFuncCallRuntimepass6
W2_90_ExceptionAlarmRuntimepass13
W2_99_FullSpecExampleRuntimepass4
W2_E10_ExpressionDiagnosticsStaticdiagnostic13
W2_E20_SemanticDiagnosticsStaticdiagnostic6
W2_E30_MotionDiagnosticsStaticdiagnostic4
W2_E40_ControlFlowDiagnosticsStaticdiagnostic9
W2_E50_RuntimeTimeoutRuntimediagnostic1
W2_P10_BrandHintsPostpass10
W2_P20_CrossBrandMotionPostpass6
W2_P30_RoundtripPostpass7
+ + 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 577ad5cd7940e2c38fb64e37e923eeca573b8266..f59697197a5cb13432aa122f1a439fe6503faf6c 100644 GIT binary patch literal 50362 zcmbTeWk6Kx_XawE0-`jEG)jYjbV*1fCDM&_hjfFKAdPfMNQZQnbO_QpG}1%IFvQ)1 zdd~Ts^S}4Qolhh4?l;%F*7H1TZG&ISNuZ+2v8LgxH1)X-L znmgn?Fb46{_q6oW`^D-ydZ_GDL?KkwMs=FiRMXLx(vPUhLhjyaLqw!Rz}X>xi4_1# z2P4G!nZY0faf!~&3qxDOm@S^pPCuvd9}iaS!Q?zlT||NT+PsFbKzbe%s_RQmlW`Njhb41tp|#Z5AfVxBJKzX#oTao9rveE##p56k&RXipRc zwW2+{;1$JPjNe_MvL|y|^=(x2(8B*9wBb60axI}Dcz#2QRVO~{CBS(fMBaP2);~Kt zYjstb(~1CZhGi`?juL_m`b>J3ZEN#;aYE`N6nrC8m`#@%uzItxYIIg>To5_x>%|Ye zUBjX8EAZg`pR>f$YgOhCyq#@5-V@2SLImNFpb?Wl{(%bb)_eqsX+$u|zpAO&i3t>UIT1jYz%+=2@J;2|LdTj;l5?%b(% zvx?A9S$$RNDX`T2PXGSB0IM7E0vlc6+ly`zPy>SWW|yr#N(eli|6x$dg_Ar0tG zSevv+sy4s2#Kj=G7FL_VU{T@;$GGeX$7p|U9sB)n3jU_5P1svVhU}` z#@now6KfJ%grL_hl^Wvp^-({MH%C!0i1&3CO?BKqGVwZDmY>KzPVTK_;c#-rhvr(= z?39z7#m`n(f@eQOmbtuiL?TBs#m8)M_0qIbUIP=^BygF;p^};mq7(1%mM~(LNU|Xe!=nmX`ZPn$M!mnJ1 zGb*y@LP#LQ9_Z1!)s9?Jc43lp8|cq7|+zoJT!DC_j2h zvE0H80x9TOS`JK*k&?=7w-&cWmAvGB_&P-=!K-hxO0M)37w5fM-tb=b-QrOX;zFC5 z-sg`bQXox;pyAcI)_~U!E+?EujF7!Phd&i<*a~}1M$SjZ{`49KxF_D1T83k%=7K>~ zAVrpMM*WZ@b=Ky9{=(Juu{)1K2;rs%*f()Gt?lD�$`!#45I;$z6!mD*id%v?{-4 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

jF1TIm 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 z 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%0A;$%ye!EP_s{X@h~B0`hSi}W_^1=EDXeLZ-6 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 literal 44869 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 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 0000000000000000000000000000000000000000..56e2ad0f91944b692c03f0402de5d26e03b68dc0 GIT binary patch literal 2217326 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 z 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 TNJjY@TGz)z;Se9GBGhW%val5 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 z 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≺C&ZnrMfUlERDe2 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

%)Ytv$B>Am@8 zaAWip+(kER?g}L{d8RE<&aF2)s>m!|rI}zQj-c80=kuA`9uP4=JB~(*a%J9*{Tayv zLK51#Xt7}D^qsPApW*oT_|$h3qTi7}#A1J21(xVF^@gU{2BM%V@MDMGMXE$Kv!hP4 z-Vk8lwtHyw9y?H(iq$q@HBZ)aVUOTX{yYjQT@Aoaa|G(GykEo8U^i6cgWvH)UWCez z^|fJkeJLRHuvWg4l>R&igln)$_P=UBFs{!4%l7Kp+Q3k0H#S)r}cLw33o4Fe128Matd7Zn^C$hYM4>jP=!@Kj# z*mVg2#m3w^$YIj6ZSnp?HcB2VBY74rSICR7p~7Fhn!}e~zD&k@n~#IIky0#yqi2AR zWj#$e&iT*X1C7XZ5bWI;+a8kDRCg$=3xeT|S~Jbb4msir1_geW^=Wpl{&}dpUv9Z% z{p4k9NS8a3>nz%6Wsa7KzKWNP!ek|G!kFrH@af( zfr`7DzR~*?`hzCRAI6yjn0Ox1cIj7j8sx}E0gY3YoG((nfBx~8#}8-!`NZrK`h88G zjZy>8KDd7M<9y?%52xGThUPqse}st*yvU#O!M*ZQ-RI{QC4X*VdWZ|GNUWH8-f%$v z`Cz{t{8k@XFz#A^qsb%~uYdnm&o`jl$G+8K5sb8Nb-9Hk4g6LYNiame)iM^0Kfc*a z?z;&8b$l1$zl`r9{Cj*C;ol=I3w$xDBUawONLz2;p3?(iaJu$iUo`Hp+nj)zrUBo| z_{N7g<(Pg`tVf4D!2j=*QTCHHB;)=;a`Ic7Qtqa&dAV=Qb%K8mKN?? z{IMSZXi99eTqo27u+b<))+znuL}oo51&xRQ3l`?P2>&_0i}3I9U4(y+?;`wr{Erkt zh5sV=x9<-8A1Tg%AKyjz_xLWte;MCJ`1klO!oSD=ks@Sg*gzQm>yb>2~3%`u{D)-rhbpH@C!N6!$KFao*jKbyjv80qt>be!Q1WI6_$trnWv~W-nE3XJ;40 z!GE6R^{;n3jqH)NycD}ZW0V!qo(=grne?L_M_FI{^X-4V*22Q#ngH63Z`i+TOP!Bo zVrFJ$V#0cf+|Rkb5uQ*UjHEj_G$iY_GO|9~;pK-xW#umd^2ND7fK@|kd?DfI;t0-H z1;U26$o^UcmU$*~WZ(Gsc-Hxw_;db54hPlQ z_2-wmbzd$RvEiAi3uNcj)zf3u?9aQMaUSIl4Gd&0Zj^-|pZ}(K% zT|H%5oRPH zM7rl$`%mwY+qLv}!}|kjystUVX4rUkRCHRq)2XYhtFn~kDJ2g{tK{J1RFIb^@3)!D zxQZGC-+-_7r>u<1A*jx*e#7(6=XMFG8E**Xv(TIzt@5|JeDVORXZW<+M0d})$*-}u zqhn%n_*GR^zxmWS9ceYF+N*M&mMJOVU#9aYP$^769!W1x)JT-|m}!mu#|4DDXW<&I zlI6XTDYw8EyALd3c+HU2CXWKM6XMh5y|*efRDEIlhbV@9{rd zgh$DP7$P-yp%^tTviB#c$Ay$TH*XI9u+OTua!58QyH}yi5VfMSk4+-2{5O}$tem_) zO^PXZUdm5D9D4HOiH{GtuAKelHNFVlLAdhx=O2w{8OZ6Veh+`*qMvIYgKcLOD!zME z{`zko$oTK}ha?_;ds2Vq{hQ0Op0oeWedeD7Z-0B;CVu~$X?6MKZx-&m7=Ic655@S5 zy!+!fasmHuiu4DBZ|=?VU9ta4-*V$3yEHPYy@-r2hYkrK478c^8oZZnx-N_loBERn zDPw+8nqEr-TRmDGhX+1-jrn-=WHHY!Y%a?Qpy-0(aPbQlu-gmlDP?B3#go#uM_J|G zyDK+U;dY{|Ps7U(!P}qqa!SHUHEhgR3tSr4#NQ=st>fZ;y>Fb7Z&2(>lG4%FziRO% zZMubBx4^W*w)e}%#`(cP@?yV}c7Z9wvdvI?=W4NK+jGR1G;x9+)vPVEU1P+;}#^ z4ES;FnXBuzFxtEUp}lo`tjHWLQH)-T#WwpHp&dnDdu1Ay+D?Oc+gK_N)3fxRYC1yb zkiaZ$!kKPg9<%LSVqI{D-Ih6z)T*fy>tgv=(S?P-cJ}3)Sj~N9Gc2*@rvG;GvUN|s z32nX`_eY6&BNDMa&#P@Y`Rp*Cs~cR!^Z-S`Z%H|75Mys}eSj1l+lsAR-ijZloSQMyXhy@b;30oUz^^X*?)LJkOxPf zE|9FI#<4!6%C4b(f@NqhC)QdzL@yY}SljjGdaSomN^N_uP_L7h21Qhw5-*xBe6-l- zvDi1fkgpuEmhzDB6pJ01n3%}c$#L``zP)%R!YCFi*D=?5#;Kg}0=zKV0B;d9T03lt zL)KM#6a$oI)t;bW)!zC+OQa)FPRz&t^K%%FM1t3HDcaJa_i&k}p`qbyyZn>na#1Z| zRwK7Rvum#ihxP=67!%LFIO!ZN2Sr74yyM9+FpJ|s(GlI0W)Z>QAq|DC@xnS}aj!{5 zgrG4iu%PR03rN0Pw)TfwgrJpm%{5JYlj6s8@0;6t(y(8m3F# zv!8BW1h#-;(n_HV(+(Q%(AN*_Wiv(4mcxE5IyP4Kjn$5Xs^x$7Tc2sG+USzf%QK9% zmb!Gw5xbfMjCMc#AN+DFI#3BdKg?0v!t+)|C1$14ujDF{E@CvQZ)hlM+1iw~Jm{7j z85#MAUmP)*kK0+BiZbyWToz<{Pt(^WCApg7?a`x~S7#G;>YmAu6yBe-c3GS1Nb=uY zJsrKa4rle41B$!)KH=DzvMMeqXHkZ7jDk24kCNYB6x?Sd1tvq6R zMSUpmH;m_U5GT`WxC|rAzntW=KC}Pg`gBb9ix)3gy>gkRFZlV}OL3FRauidFN7D4I zb$3@+ezmXlZ2KsB`gqL??v}<-+QXp|`mKe<_t1~KA=KRRB}u(?FLpRuJh?uLPNmja0~}3x8BH|tus$4J`hocHF6b1 zQi-HRt}!}kF(PsFolQ4SC?9OGFR$Oy>^)dP2~)a9f(tc0gr}~`$EQLQGn+JeSBrsq z%d((ljKT!G?+pMaXC$i)v{@2k@4T-W z3zkLzoj_v0^NJ(&bF$w`RiQT_P(;vsybJ`uvwc>rZ{rf0X&or!;=^_Y3`$pb^d6tb z%1EkSLA8&MIc1c>i=);bF~Q8(cW*-Nw@YrI7>hW=GW+6m0x+|~f(la%3Vy8Xx2W?v z>az12T&B8k|V`Pw`Lj+@o!u82s3pQodtV~c|pR{rGPgq!i<;axc9 zyJ~;VZ2FPD0y9)S_w2RxR`?gTHQ`)?;_dfAE0t?s)?xMouj95ynfnZLbeGi=D{n3X zFM2*n5VjI=vlHu+)7qK~Rx7%MGI{VyzG0~=@JT6GL^7SWVo48(*!2dx0)|`tW9<7k zXOt4$+Lg~JVvEurXY0VyGkAFN*-@PQzG|+giC$XT+Q-J$&%K6W_kxIw2kz~Xxm|z$ ziEGr4@lMs*PktNwx-oB-;J-;s@|h_TKYZ5gmZs)?svI_mGU{b_tjTEX`H=!8j}V?b zPT9G_ak;JaI6VWNf-J3B)3Er7HRwuB)qT(d?a! zjK9e3<1tz5>mvF3Mc1UH?201@nK`<7w|jywj{ymU)kSj~!vsxg%z|qXT)yNXG`-aU z&6sY3nY|cVTH0??xnV!}QEh!D4@dx1TN(t~&Q$n?3v}5;&$?%aVWaLkDk=*JSGiRbZ=Osy!<7AK1mq_K{GN4*Ff)u`%*sNbNSB<`~fM>o0en3$y&#-iP zNIKJ^r3?VVI^M|^$;?**@~)$mrNQPq0)w;uNF2L{oWBtKc)(Qs?N zwL4=P*jqEC1sQD;)0|P!(LB9`Q2&iiKgG~(4HBMjAb->mn0tl^Zr;4dvXbhj7W4Tbl(Iau z+?S=<4Ps+|mZsPM&y65czR|}oUoHT!Vg?XkORN1z`RX&i{69FR4kz#2;x*w;)F6)0 z0&%k)Ok2`;OA2L*+@Fm1BQpHR3r0I(x*zUZFt*9Tz9Z!t(D^hTkpxoX%BUaO3D-DO zniC^w#&bBPnSadQa5e06X7Vd#j;XdU*?yxQXpgzCA6f_8IvDG~SzHhmJ+K%hrZ?id z=;1X=rT{2&$^65I_)9*Gp?u_t5RJfkNz~S2amR`oh~`txSZomhRi~=pVBQ*+(eR`G zzEf`+1L5~C+7G;&b66TI?x^QAW3BqUbKnDn?Oi}@-p zdzF^%aM0#3v7_82xx}WpMGZFUH~u)N)P7JH>nCnl(%zmgs6AB2iI;!ynJ-xO%$dms zKB7&3zW-K{o~e&zR~j}8JaadV%=h-x&k0}Cl#At7yxlwGF^Xb!L7ao-F6MU#f!NI< zHv*CL2s(NNP;$0jfq+8!R5x{_`=aJ3uvpUc0c2#Y7|@fP)G~lsyzmVDE#NXi1ib7` z%9sV%X=-YG<`3J24CYS}KTTE5rQ}EeN^l7{=JrI4AYhd#p1^ZQOPH{d$-;nL+Wq_u zu-J0a?=~)vsqnBVQCMo$mJ|ern0IkW@j5?*PG3c5CQC_M@vIKE~{?% zU+5M*2AEypY(OuOYt2k2)y6|%Zeu<%O3P37t%sY3oUyTqUqisR=c>$@+teEzGPd9q zL^o}iQ>g&|(f`N=jGd1SI0U`Y?E;;z##HG7;?}iVP=1(E1 zoi#jXao64psq(PW;ic2NDEz?`u*l=`z7Kmm7yA~`IC-G~PeK37DQRhEZ7F!>*Mraa zV2*L8f@z85xgrg1-eVUMWu`Z~+H{Q6{t0HGo}L zdBr~V8uO9P=DT8#?G2IL_-b~`!^LG4ghRb+_?-S~;I#vYQ&p6)lL`py6m>9f+Y9d# z<-G7q50N{c4T>#qF8j=y2(;@tPxa*u^Lq|BrED&v%{ah6lVyli5E<6D6D)~!O)2_uz zz$37469{|=xfGa8CG3*pNY)eq;P|sB@TTn!1wP(V+;*>1K;Hb<_gVlBq;7U=G-_W% zHT|Nr58q5(O$|C!A*-30k->4?*&MhcDfpISr>+jQja5FxEPXUu(}^i^ znQWN4Je!+aSrc~GJBffkV=K09eG=w4R5Y0(`MWFC!-s$tM#w)oXaU^GLVXDD-!4Bg zNkvsPVpt>@K?Sf+0)FLTlQh7I0S=c@J0n?R{uFt%EUw>lG+7GZ+1}n^ z@|8ahJ1+FlAMcgq=zw=_65&}+_<-|onQJXJn$T6v?~ca7oVa@f0|VK4+Y9bpm5C|C z0%|c;X4y7W6V}xl+Z|CH0IXRn)&wAzKV)l54hln=8hf?Slcg!X^)D<~(<^e%|CRRv zj(^G%aL(YA>j8=&jQ8gnw9KUf&(Rhu1>)7deX1#yx_Nnx*?k`(PAvTdfs5_X=40f}R4>k8i%+Jrq#v0UIF)Vl9dGy094-b#<5WB>2=dag;bg)8O zzZ;h2YWLWCdIp@7wpDa+&35uJFd(0&UPk;#h*Dgx^soyMOy9>|t>Oq>CJiPa9{p;8 zjFA9jIepwvHVAM$Kk(^I&8%25278^_5}DJ8L1x)K~iQ zyke_>WQlSV>Qn@09dw1JR^|+`(k`fN#bLD4Bw&B&7kjf(TMO6tD4h?t$EJ)7XMVEK zK4pP1Am|t)w+6-Z^8YA-E~$Q_B!KBPY1SZ2$1u5fejGk0^QHn@=}{bTu(ts3T=T?- z>2*mA%)u1wnmc`!jcwR^zN?-aQQ3=O>522HJz_WU!5MVQwFiXAhnALs9^Dyj1y!5T zKn*@C0rkSo#DxG@D&~_l^|@=P6rI!zY&UUJ&hG0w&EYZ(Sb^7$)^w^yN~Ka*Rf`jG zs8mlojGvZQHQ5mQVgb@~eEcbk_@pGj_4D2x4c{B0s;b&@wn{k1$ZIhc+qr&_o0}UL z^9sO%sZoGtOwDSHEL<;xpQtD=&w8SPj?+yzr6h;i(F0bzPa`}0e6=de>d_zVW{^ME zUTmc2o8caVneJ4Hk&y4Wwmy-Scx|iL$g!de0K{7HvK`FC+Q4w!6Ij?joH+PfDly0=BT&Ur=y2U8PXk!cpCu zbWe%B!*k-Z1{b+2J;bSsT={sfQ{KI5U-C)dch!1;?r2lF>{As(&||(b7l7iznTT3bKM(fB)k!5000RA`WzwWeyjN>8)Z*EUitPt8&Q6dDfv;ls z%$f{i*4bnxQmB)hJClMG5nY8HDq}VoHSyLQiB1=nw(YraPCq=WyF15yW#kMMxr}4J z54+~7(SxKCF!0*jV<)Ar$ghC7$Rj@V(5j#H&=S?)52zvC^CAGUt_L_e0UIj01n@Ez zJMzLyh^;5zwCd7892AM<)F~@|O5~>p@Cmjc&Zj*dGa8CN)z4=#lct=k7$WbtQal(6 zJejIvM4hKtA;RZ6bmHyOfJ?Ua2iNH+7-L>zHZv_P0kJlpDC-fd;7h8J0}_8s4+V=H zypXQSyAO{MR*NgODOT;NrmuB_Nv-knAouc)`VqxdV=+KRfA>J|9IFfK7BvS-mC%sf%iFSG9sMBDW%47m7i z3|Qe99O^xyqN02Ej~p}c@P_R_ynyyxj%#zY?{`FJjTIR*NA+iRJl5nNOPNjbyGB(v z^;_NoL>fT|6w#2KCmA`OCN9-GZ@nZLJQ>Xog-EXp{ZslK~8bbYaJSprAj&N9Jx zwgIP)Mr?gNIFstTy&(!_>Uv;9m>~bsRY3jkYT>ph_Sb8=02WqHlm$-fYEf5}AMxNO zv|rF~f>Z8KykzmfdxlHoRhR+@hwY`dy<#`4lj=HI08hT;tLQ7E3k_?^XFDp ze)+_+Xz}5j%Rz$Gw5BtZNWqq-rmKJoq;3LCi=0i=gZX`OW|R%@+_iKmmcb3D0dq|C z1q`OSq;Jf|#)g}?+?8(Sy|WAGY`WLDpx%x{rFLdD4Lst8f(X(ZO&Y1rEA;qk zgQW=6^x@N9^z`(!q8N1VP2qa_E^yZZ5$C9bvU0OWzsX&FeSOQNsR#{d^xV32OV7lk z1_T+m*cpW#l=UD+b92-z4)WYZKl=uKajFTnb$&( zwB}1exU3eO)BUZ>3q#f5X(Bk4so%XQ|JqfbVh^ z6QFP|F&Yuow1Od?SUL?|mbcnKFfi~)jUwqBz@xb|uDK5sUMFl#O;10A6GArHn ztlH&>D3RO8dBwrgSk$!lXK8k4nHJs~TSjwobcoY0K`1}@7Z%;MNQ17Ud!2T_t|4Im zD6&~7Q>iEk(B&Hdq_(7exnk3`^ptCd+JRCymPaQScs+#!=jzy%23_)c#gQnh)&3v3 zfRSU^VI0##L!NBi6CEABf7k&~5EOW_FBd$CW0*^R7|-RXc$!OWeL_N>)f(V7GTtPU z7&GK1v{xwx>{^woRplEB7W3G#3kF#4`?2BJuMv*H+w+-tW%WK5_H)|6 z7W#$n1D+^EqVl{gFx;!o<3fPVos;tXB5K7CG|hrXufS9qIMZ{lVQ0=v4%s=`;H%9c z$QYZFl5!6NV!U{9cx-HM%B{tBN53dhGBPtMb440LW&4+hiO9t~&K1CRrs@G?P>;Rz z0dd+10Q8{4e&@t;97zn><&t&JVTZ7+D$3Y#MhaU31G2jWPd zn7n)yK-`A&y>@t&6^Cxi7}D?2l4j9}5~8r;{m$vqOPVw4C&BQk-j4H zS@SS?8=$G2$e#!Yj6HhWtP)%h6S};-yk=gbLeQ=IK;gr!wkf!kew@NiQKP_dshQL@ zy(6{*g{##x0W2QL<~8?KbRZULd8VZo)2c^rs8VcOZ6{CmF~?wA0l`qO$%*%zvSln z4h|mn#QS&1dRz)f#zcwf-A2|=4r8u}`G&WehQs~r;+ zt>%CInU`f&sBlqD{oPYNTK#Azd~I!Q;c*$)Z`Y@c58wTEL+$5m|G%8Q|0PQBU5x)e zzKijf@m-An980C=0{(JF;D5SE{~F)L`0MyTS`21#7421Vw!%6aGUJZr{^N0%f4ClZ zF7e2n)cip1sJBlv%_W1Qq!n)&f6jV-@Mx$$m)-5H`tp;(o%$0)N5yW*?#+61EM2PU z(;+Eml$FfjQ<;k^Su7$sYc9 zvMc|c>}h|ugm?dL2}S>A3BQZ+*YRD9zl`r<{B`_)B1Y36>35-TFN`^N?%Yq+2P1^l zSd+J>eLg~Dq~

hv?5y91##f5Ghen5GesEfdmpqL{tP+1Vl;{q$mPP3lKsCq?bqy zHKBJBNGJ8~;QYSl`6e^>-hb|M@Aus~|AdF<>~r?oYpr*^?>^`3-C~MU@@qN5U%*2D zPg+1kOEHCog_7?@w6yxwjsB(+zwiC?Tn&d3rK2~_F7C~^_%3_9QIJo4w6e7LI{W^K z-V4dIlV0@?4p{HS;i|oR_u?wexKrpeXU<$c|MKvgfVm!NPwu(oD*2hev{T13h~B6s zGw?hRK7n5Nq8+wQc1wd)6rHGEd3WP3o|x#CnwXN3^6c5CNJjg3@KlPl4^I^Qd9r0^ zra6I;Li>K8I?(!^O?QpeF4{9wmA*HpBBU*UZvM?vlC21mopwZSMG}oUgVN`1vHbJA zE5)~u2Q3bNY-nhB7zS5=NQyC-&880FWTcur4O)rjtFVCf(+W3l-n?WS`|R0IC}?2c z-@G8V>zf0dfdh<|$7931s&MaY-dFboP4v3Nc#-m)q`TDc&D?%_x0JZJxJxscPrRx} z1q`C}iy?QtzOAV1{NZ%uHV}r@?74T~-0bw|*}*dDeVSHz?*7&rZv|+GZ(v{`aO%(1 ziW}{!Y0a9rL(=Dq5>~RX7k3;+7QC>wSYHypc;-`uuO997$*}%nkH1McvDvrrWVM;_ z=fS~@1G%)wAM_(iPiEge_H7{ZNk#6RRbeuw0SDtAe-|91Klw6R*-&~W;>4>bHV5S; ze<91_)a_FJJAMblZVkKBs1|-RtErdcN1Y z{O5YSTJP~Zw*9>Jqgtca)9z1hc&YZobFt6PWk^u1@(IDH)U!P~YV|7UMMg;gYOzyC z%HN+!YTDABkl1>oL9!@yuMc-zs*F4?yZ`t^tkAKbh%ki%ne?9)M%qYBzi1_=p10~1*k|s$X z|C;faOWBBfkL>8lt2Q?3KH4FhrG zF&oViPz84;=zz%S-tKyPvpFV{P<)w7=fqVvZr+5?^{BsxEZ?Y#)Di_R({E;E z>~$*lH=O&hF~`J$8~N&p%Q+ijs%_X{te(Y9o@}J-k(7f61oHI{KJx8izIy8%k-Z$td(K0V5U$pdmZ)92^CiE30 zcxrc?MI~=GQqCl33UJXt|Lo1m26Cz<<&STWJ35|o`z9y4`JEVNxybcfQ-c<(pq_mN zd#{MOW6OrE;~MJfW@yt-1Kx^1ktA^>;6k%tL*)T;im(a+p8|25$v;A$PUk4W2jQs2 zutLRS4bt?x*Lr0G?F(a6Jls>MAt^C2SjZaVv6U}en*`F0KyTXk{^5xf9j}gz1d$JY z9G+tsi-l26jUpyn2OWr{cOep*Ag0T*0k`Mb& zC%V)<`7lb_e(>NG&UkDL)UWmQHR*i{KV~&asO)Q3d!{(a}+A%%6`W z>W!JoyY90@aWa$g03_DNTAHZXWPwqOp40bpeevQ&7eLOAM!i^UFeAP>0ljk@kk|cI z`)JIW*wJz*0hR$nEKd;L%Fs(-l%*aAn#W-2@8P>!lJ!}z`;_*edY+Y_j5h1 zI}F(g`~@sJJQ4JRjF>}b%Fs6}>2V*cpQ$5hU;X^k2qz1pscekkMyPH(6RB0P*z!w+ zQXfH#ErGb_UMX&BYDz;iz2L+jvj2ITX{rj?6hl=#@4>JE8Ttdz_ITjD78trm{ZWdMswggXp}wG?U=#r=mvv?ZsWPMEeZ1zb>L9@=XNYYt&bNS6eloi_G8i}zs%+p-M$MN^rM^1uab@s< z*3xVa?7Z9$(M6tRH0~0CO2)%0?udn00Eox4>1QMbE}Sy5ng~JPBBrj@*Vi|HHE%t0 zQxLh&BE&E+ALre|{-ffJK=8l~6S|a(B`f9|i3Od1Gje;r#qLvJdb%let6OfWU)x@a zkm|mIky%QA-%^WD<~K06>RC{)vgu-})-~ z)FgX*d+gvH7|6M>A^H?VycB~L1lYK_xy9@}F8aI%X=AWF=x13Q0J0loQN5voYf$o= zQ~6N?L=%Vj)ccCfO}t-;902f;nYY#lTm411@c?+zeho2CF$l=LUSNq4;gKAV_Owgf zp>$JBz?}4}v#aKVSJ={pt=qJm^{#*U3J8Sh!qZ>eQc=9MhC5M=Rzht6jV#=GtRa82 zK`m8pPc~}p+K4(Xvya+pDgNg!v;w^RbiLNi3V19r zCB=y)czJ{a5pfGgIP!K+JbOP{Nm=|kb!BhuRo&j*@8wC3e!jj-53+@9EZS!z+;09> z&_e%l3HlD~j^2KG;!~LS5TY1HIg;%v*{HU^$liwda_Qvnzc;eA3ti2l9_KkByWUx= zMNg!dgwokHzIS2M!(kwAKt3=xQ5Nmj8u|g`?Jsh-n|Y>w93oP z3=6A!0AnE(6&-tzbT;Fn??A2t?W%(R9J_Yw z<$@bl-8DE)=_FCBVyR9Y>)E%ZxaL6=uLm2QcO3;P>sYzhfH2JIYdH($>vZvALCA8} zrA?|qSBbBA-2h;%v(}6T3b+oEwXc{8(w}rX|LL6U4C&rYXr{FyKKyZB7LtQ@rMCeZJXSZlfdRnh$z#{n zD@9%dCeF}LqvG$|C#Q5b1fCS~phg*&a%^pmfUv`eg8~-~O@Rd0h0wRE^ z6LPCc^Q@(2p3nUafxDYZvTqFm%q>8LT6L-Te)*)9$`z(ii?7v8`3e&V0z2;dO34CS zmp&C+rSCf#^#g^!JS8Vt?_?|v{F|^?eSdLl&%ywFzOV2#oF+0xFk4$&rRPw4$5uG# zqI@IhEQ|(51W?BvSO5Z{lZlXd<}O9uZS?^Fm~MB!FYa`jCBc5QAuJw}QSQ=y@7DUt z*4bGFc7;%Ri(JuXH3R}KyP>spq4$%Sjb)O~0pSISBj>{8M3BUa8LJYY4}ybP_na=| zlNBs?#hts zraXGDg)wXJ+3tEP$=tU zhjt{~(%t=cc?bB!nack}sG?c`%Nh(<5EVJ$HpgwgA2R`}i{g>%x41yROHVC)%zEE0 zkbEt@B^wA*Gcz;N2YY$XW)1vAya$?<1DTwhT)1Uo{ICR=)|2a?tqrHE-UP~VYu7^{ z1yK9}=xG*n#u~vs^l%p7-5E)?y$99Jh>~tfaZ6o3b@|Zc#StFswCv7tnStutZf$~H zJAa6|fb||?TEB%P0;15|)O5SMKlre(ReL{EM=RfX@sec4ua-pdlV6~q2QTOD)5>H08LRB6lfH{WNodZ2{=8XT?NXs+R&6^_a z3p3;6;!dvtwb54Zboc`pK!+Y*0%H?m`{>)qCn3=92gsB3xW4(O8|g74lCYZ2P?V(Vh+6M9MIjl9MuRGM?(0%9@OvX9e!wMXFPQXiSezA8D+uA!7kPJ)dGv`EG#S#AjMBtwS92F?#upZ z$BrE`sv(zch>6;-+K1 zGyYfZgAHi1scNVIurnmdDdxCW{~>2It6Kro6X};SdKoKoF|V(TPjurJtJRNciu-_RAw!tpmtD=(S2D z$HYo9`?BG5>^?rI29?zz_0ckKu^v4iHUw7n7ekHy0IFREngXIdMsKt?8({ACBiGNP zP&L^aT3V_=tAP+!ANq7ELem$2XM#SQl;=UB!iQLw0e>5dgHu9xOJhIr+icORr-_MW zk-mBI|8bvcO_H~H_xA0Lo)7LP&Gos%HKUT)8sUHtNoU_(Q$8_1Zu2rmJ6JO1;XTxE zo}^Q2hiv%8)Eg}T1%!%&4U|T$3Ca1nwEUI%1Np;n~R6s4;kFhL#1!B$z#~H5#^Y!{&F)pM`w1dY+h#B>++P z{Us3RP6SMA5vFWe{cP+tJ6}f*_%kG)2A?E zYi`XC?CoX=nkWzxs)$iHWWIjD8A{x6N~u%uJ;bL7KmRIp67a!lotF*sDD)MgoS#ajta04F=I- z3oB!fo-XEjGFMMN*{7N_R{r+w+YZwg)NqA;Ujj&ZLk?JPMVmsuwz9VlSZ81U=QR*$ z>0C1kqAiDvEK z-l|iGL0?K^Q`6&tBQ9rbcTQcgDe~_9xKVu%JM-eZt60Z??wB_HskhU9lu(zPm-7Rh zr`+$H5i@;3_>S{rCd(_aqBFf5=!SsVu6O>G=1GC|D#+`DCcJ6md_4PlMl7&Abg>G0 z9@J!KeOg8Hz1f7sME&buUILu7a&UG=b(-77y?9}>-Ei!Q>P z)`x&{j1tcA(-3_HdjS=Y6|I#l$0pE;*lb+bk@!GXF$>F>BECC(0T;M%GOSXudxSPy zr$_@u-NT%H@T5)=X};b`R6v^0?4 zWo2b?ZS{#2j46e-MD5-0L7>Y9&ZkA@wGd(3yB$hAcWAqg-(PR};qsEb(S<8l4B*rc zVga!k$S2OysFkVgY+vE7?4QhE9m7w)N*W6UcEbmKUBVM}y!ull;i_0!)vRea21K0J z!7B+S+e~5&sip2++1GB~yxHC)sVx|{3$1`Nb-!&i@#S;JLJr7+jok8tAV$dc=4qM>#nh7pyc;>4$x&l0WoBC z1;=iKyqU{Wj5YD=u~)!@;xtE6IK6Oht*U5TZOYZvwFE}-1%hejO`ediiULs<3~1eN z3xF$x&603%0#G!@haN}j{-%ycC|9J9s2KC=SefRE>1j|x%{^t0ue;F9X=EOr{hZ5{ zGg@RU#>U1DfZhR)>7}|+(IhcatMXv>$u;YgOl~wJT0(@l>`+Fl9fE_JyuYE!Wt!PPfvYSD7?!31T-@V4 zjXRv782HSc3tR{M=;LSbq2mTuHs!NF)l)Y@0E^tI>%EhFI>;1okw;MLaR9+i!4pL3 z2Se<$i4yqfDqX#1vslEjj2Y0SgiHWPcq<3;n&IGGrUp0-ZxoD(2Ny zJaaOserj@ZVha82w1mak9F(^yLJb_`m*+cdhhu`#N@HA$D^-+4*?`m>tE zYc<~Gd}=+PW%!{3_d^N3^_Np^N)QoAGU&;2x6egx%dLw-`tU=>c`U`Z5aJ(eWFYL` z`->YG3`Oeng~Y@}Qx*NiKV(EcbGaOy+g*CnAZr4m~GJHwM7ZyZ}AZ~Nnh zcKPkOx7Hr(F75fEyY4r`Y+R=2!#aQL8MBOT^APn`+X9Ee%zaL$PpxjZP2U)&{Gi%4 zYNwNYu&>8Yt}m)iJ}tEKt|@;jPCt%j=v_o9lE7fO0>MW?w zCltDw^YIt4-$!6La2SpIdN+h=P+pFNi)W<*>#orK?BAOC<3DYKWc3dlF#X%$-v<9S z__x8o4gPKLZ-aju{M+DvqXsg!{Wkn}F5v%z-TVJ#gYkkxlBK^-gm2gNcH|iq6&3A~ zI_Y7SM69fmpU@VeQXDlCq)ym%aAlLy?6VP1do=1o>Z6sDq|bS~B381ME?v45abZm3 z;NU=4*9+;>_I$h4p3Y2j^-cEi0TY!mY=wIjvHQ$-8YBFrth@X4+g{AiTT+d2<>loU zNXEzPprHZMCuaY7VpmU(MT$Z3VK@8u^64&X%iR2YOX&gowimd~OUa{@m@>yafkVL| z^?8gjGEn-;pTAwXdXusNvqhVDsKq{B*<R!7!LUZk2vUN@1<~;oEND2Q6J(Ttt`m zFT}&zlJ%vf-1ToeX*XFzp%CBEFV)F6?bQq!b{l8N4<0-Kwo1>Ue)_go_vvzWzXzj! z&?LoE-8tom%NglDFMjLuuif3t3Qmq)-UB7Y#Q_c@moHuF&ZpcJ31uc?*2t(>TU$$) zyVuuO%3VmKv5>iyF-5uTsCk9C_^E!g27@f4Qc4r?(YB7!JC9FBKq|739BN91XfZ^jc4omsg^%i0At7Dav3&MILiyQVZ0v%CrcofaQV%QT0zy$U$#8$1-Cdme+jmdMf3&F6_Y;y0zqh8zshU~bTYP3tS1 zDrnC18em&2wO|RMzSf+^-WT`36vII+;zTqHRI({tqcre{QY+Yz^C&}=$ zn+tOqcIfiQ!^*QUa3L!y!_7kfCS4BYW6ETs1AcxYtd+3Ti4nk;YjLoj8ru} z(YL}h^gf!Z1b;l%U>L$}aDd^Fgk7-2K&mGZEkDVcBmMl~r`=~#kW`BKt78)ncSoO% zi2CJJrLBV@Hy5j;5br_C(UgxIfjUJyJs% zd-PCLgU6rEJU!$XgcLnWC}ecoL7UJ+aEjAdy?7x?w~f}G?sm{YGy?-=`|j$nizH(a z_c^l`$!xc*Sg(rWjy#r+arSSQpNVWISMC-U`;IAUXsCv+La=5-*?m(^s9(Czk5v#O*Pt{$RDD9OsawGF34bqlx#Q z1>VZ6X}rIFYb3)=%b4I&kGx6d@+tXbSeY9!mF_LvKkSekA*UM5Y!5Z05Ip;8_$lr% z$`Z3PCM(aw!voLmZ*JN|kH78h%)--J`?X|4E;J`-SvV!2)#Mf|NqdRLSnuX|bAF0r z!MNRw)?V>7s#S~;FZ?7? zJ%od685hE7WMF+s$pWo%fITD3%^iT1-6Yp4=<4V=$8MGztH;>x%yuet?Via(&%K5( zkny;poFr0v`%?8rv0umUE^-Lk089*Z4?8Yi<6ntpOh(O-@(;9x^4SBGp$^wj^PfyJ z&nKpqUnk```As?7^M)8P`EN$%J1zK=z;6hS$?f6KE`ij+GTKscCA}%qEM71hr7Oag zF0)9`6hnBAV42g?vssg2sOeC`?J&!4nz-{$JvDezcVWS>L&0;VBjT~&QdBD>C1CCq z;Jld4jl)%^_#9QA&t}WI=$Z#40|PRJCdf2boNVP&Q{W>0>yuD(=@BEZgg5tooI0jr zEIKK&83b<0)hZ&07^lev#^lhQ`A?_BgWU;Gl;}{;i~r6AjDX1W_I55qu(UI#R6`ai zC7yjjo#xn#n$Oeilos*%;mkAQp_Ds&^F)JS=uCCQSFL<#CnDn*Sr z{~7eQDfPUUg}2(BXn2k{3ME=*De8J}KRRA&Qvwx?W@VftAF$3OCThb7qB}96w>@M? zB#d4tFTAxi#~ZhhdHokShz|}KH{9bu<1r%>9>8VfRLX-HNz2y;N^*f$W^RwN8`Toz z9|&TWdK{7>Wx|srHkz9JInOih{5qzLR;6nDR{vMz}(8^ zNe_Z>p+ErFLfxm+IyA5?I6jpxtr;-b6%uSxf?%OrF=!W{h$etLQ1n>zLg&;pQ~zB) z#J9g_qj%*pbejf(+W>Ark-ufFcuvch(E>w>7>1qKUcY}oJ1%ykS-#GxWblW@YBT4~ z?mF?q>MdJ#>4Y6IeAwMPyq1>Qa^CIEb0hPCw`LZG?u??uCj)QoCmWBsKc8~n=aICG z@i%bq_}z6Ws6tWO`SYRw+?Cz_vG3W}2PeMU^UIewuJ{gm36>YIdZXf#6Zxc(5aJZ> zT={dVa44sSuj#lAj`c$3KyW26iV_KE8PQdr=3=TWY+S~%O>rKh zR6k;<+B7yVFK;T9?^{9ZFSZoWwZyKN6Xf$|@gD>{62acl$Uvp9#H(|rGb^uB-MEuI zk$~Rr7}?X)>Fc>P-?#Ce;#iy=N?P%gd?cEgt{}a%Q=ab1I|72Rg#oMpA|@sv5r{PE%OhhbF-Ls8D|>W!U3T_Mt|DPc zMl8UH2j=HhA=*MJTs&K=fc|mQDzo@OWs+N4k+R-L@owywH=jB)Ta&fjuGy#>l@f|s z%x>KWxZ4gujI-Rz zdb&Kzd1T<=tehNms_muR3LZ}Z8e)(~`Vg$=nV^YBetGz;{j8}eUlCTZg=y*M=i)du zHD#Gs_q$18P#-$_pU( zI1~zhjv%6y<8bNJhG(Y<9HiJqz#GEn3%F2zd=AZAZoz!dmdI@ygr?EmrkgAIR70y24D{ojiC5VuaIIPo zXT*%mNpZ3vd|#f~xw^Ha=_E?XWQ>^WK%lEbg`*1MMrHV5Fss(sxbaes%0pa!1>N&2 zgwLV9%QfEFJwj3x-Tz+qGsqgfY+B zGaa}w1SwBBB}LiJK3S#0(5` z=%wanzqA1eb2ek{%x=Ilg2lp6yZ#^^^Iez>B@zb`J2Wn)qr1BpC1m)*7y8x4%HQ6Y zPdnZGCv-*V>FF5=U}APsm2B*JQD{8Xm}9g(hN(Tu2E{k}abs-OC0mPynVI!@SOsS; zN=a1-HP+PBH1>|ExSWf1Hk9O2RY4)%Rw^@nTpA^&ZLhfP5fi%HET#{Z6_lZ0w!!``<$*jKLw%<-CHzxHX zYqi{_+Hz-xOiq3d{Qwn**xA|H#3DJ{i@JU-L-0$UGd*kh>oQFp)@%!J(HE z&~yQVveEkqnM@#d$P(Hg{r2n5U{?1O5{b;OoC794T9clx`drV5!wbER*Q!_?%SV7w z>Tm;T;b3*-z0EQiZur=KaxmllXw||%{>v$lhcSeX z#WVZW)#dW$6Wv5Qd4L8NhPvA2mZN(=R%cVEZ=uJc?C!-Jz0vR#!+VFZR9#Mo@KV5^ z5n=&Rd=YF_uWUOSC@9_2%g8+InRFsfqiT!P; zqM{-n#hNR0ZI$&-1tC+<`s5N3w)$%0bKF>YMn+i)d-`U=Lhq;Jc~eB_7WvxR^epqF zpSqFkilM$f-#)w{+#5e1(Od+hP`R#+O-+c!s(SvRvwOC1DB@d#p-Z({VJL330!pXt zr|A0-c}XFtQH{|;E&Y)ny6|oaBSu+UpYjnJafi413Y*l4&Npv*%*}WWh<>33fn-TP zBQK--d81YcL;^bPAkCTfKccEfWL3IbTcc(u)HzLoe(>^yYTXd%ysWCp-zCNmhF$Y`sA!p1%Nnh12AJxa7t9^OJe-qM zpc3}wMXNh^?x2Juw75W(*OFMGO9^4ch^7gGd4TNUT7%*)YcWp-!ezg+)~HgmzEu3H z$Qd?N{w6nAFYvy?37c|`QXEzUt1;b?_Wd^@tS=( zRWg{;`GR-Ww3jBKu7g0H5jOJPeDvYk5qJ@n#;gGlS@@1ufH%(%+6$-9A{mIVQ%>BJ zF93|yXb7+g?&X5Q!m+zU0H<>uIP-C~KuAE&M=9CANPUb{Hs%b%$I8>LceErHYT-N= z`c)~zFg&Y2QQNDE6*%5dwWz>|((S3;4aUWU--nU@9=w#iMN)vV#oz`Ra00tH>s68> z|HI7uJhvFi$D#%G=u0-o4wnADVZ(zuP$)L7d$8AxikeD!l}#@8K*Hg0XJ=>Ly@dg^ zQVH%>JDvFsAlu~Rq;o~kkq=m}ffvDC01cgN&F03&^?Ab*ikPzXZ3ogW&(SXJ4)_1sOcr;8L4K~#*Sg)TBM zVuEW+se0*|7$bTgK{xIYP@=eN2UrUBY~~I46t| zFA;wJ`Df_|FOIO40_W{#Z*M;{r1unX$8ZSC8X}fZH7&=|AEU(m`N9DRHw*@NfQ)X9 zBr6atFMX>%fApUjqHya}&#(Y{fm1(hHtkTD?_H8htQc9)L9zwRcK~+)gFO8PFQIVJ z%BjcP&lwF24dLC0ZKV#EijS5SxM762QWSub{4E!dVquJ^7AnB*?#1j*h1ZX^T)FjXQpR1bQ4L6+$>D4L$2t7MCo|bt?Bi;J3I`FK(xa zs2DJI%y(Ip+vHUAKGHm($k~E9$lBaoNZYuwG2;B;!{=XKu(!2UfscJpZUC`EOm>f) zUAr-Ua(tZGS9!JSd1>CezGRbPKR3zfj!~cQh0EA2wizA=0p+VJAg{Hv1vO-%>9{Ya zRsplwB>v5*2(lk>jaWnx^RShyd5WObOp=H!T*$~y)$wxWI{n~%SHdD3Bd}0kRf`A8uJYWjc?J=!m6v5Hp1#{3p~CY; z%#-mrKv>pdTBh6g0uCoIBQSF)yq?09js-4k4c!((L!$A%V=?zUd}(+O2IJz9^`HJb z7r;p86_cDRd`AAmn|FZWdjOs52EGsSS<}_6Oeyv-9TYaiY$4ABK#Rhu8qRYIwmkX* zs86Vf0b#K6(F{v5GhfXjS?Y`HRX#O)BoCa{#X`j_3bbTCmH7-K?1Spv86VCx&o>>S zh0@S=Hs=w5rmw@K0YwTJW$jRVdj0on>VR{_!!nfU+46E1Sy?r}-_ogVDcws2rz7Lt zs3``l=x4hl+mhWk&JE$f^$A8 z_o3}*t{h>hj3{go^Ti@pZsV6RieM5m6v_z|Lfjgj{vsK>(MZS-7b!wriep0RV;rEM zR?p7v0jbkIyeB68?&?6G(_#=?wW|0AM&t^ z>m-|8hFR_sWL5wbAhfp!bh6@29uqd%(&tk5WUKVb$&2nQB;&+W3`Sg>FZ8`OvY0(E zFu?E57ttkz%CcDz_Q8yQV}os;c9bhvN5mrgT0^n!F{I# zf^tfVj+wG@@=X*_BUZxCYhnO(;<2>+0|URuv`Df=WF(cFrQs{F`NO?WE@tRCtZ2Zl zlD^TZ&C||~gyva7d4QnyfOM*owY7tXG{@_XQJdmC9&FmNWz!zO)hVS*rdD_l666NG zl0(M1Z;W?xr&WhTQu{&W{811Zy^v~bI99dS%+}c*7Qk`NUiel^)C&t(I9q& z4bQ@?gdJv(py@YiVRK$}PjDSLK*E7MeP)UpRitncHWHJe+-l-Fw7Ab?Yt+y3QCG^D z)ZukMz@C=oeMs&XZ<=Pa{fI^ktd%m#BXGVK5eGAtO2RdE32$jC|2-f@o2Wkch#k4j#ti@dSpU_(1458A)2Vrsc7G4nf4qKg|NwEm{?F)OU0o zkEA?014s*iB~%7J-8A8Rs*%Ry`XMaL?r7rqJzFHSQNiYt(~*@}R3%MJY^`Kw~FqR z8N9QytR(kyn4F1dJQn%{XBw>}=qIJlE-c7;zl5RrXcePU2-V`%v711Dhpo=czSULa zu01A+(dvOcp6OH&Y8y9f$SVk~y0_P=9h7T8``g;00iF15_oLrN&jnXzSrmH?mH$FD zp*OgNd3*xpV7KYE+96fZBCOL*%c-0xA)u0(tRdaXrHHv6V-5)|j2iA==wk#T;LPbG zRmTr%s^G8J&SsPGNHf{Olr>!UBl>$)B|s00mv zDg_|9aY;=HAT)yBh(XZ3^Y zx9(d@asb)pk&k~NYOhf|Sh`IPB1jA}v$P~ibdQv2!|^M#DR<=>8ylBF*$nIGSXyf6 zv=n0iW3upZIibPsPh2V3V;sv#F-D@4OmRU=^c-65 z`zy~%;3VMSj!awUK(nC23ZN@SB}xAH@tKt@G*KieD=*C07qxpLlon}X5$rz3;VX>K zUJ&63e5fy+Tv5CG%#%%dLm+sgmF$1+1~N%bsaK(!^y=iGWqt*{29&f?ey@vof9aX< z@R}N!>0szcIIX_DQOdZ%Eh~ZhmGtpiIAFc#7Z~V|F@hP4h|FGaxHosLK024cav%tZ zqCQKBPk7vWYt2$a=#fhN{zMfNSB*U%Z1|qD zFc1o)6;RZ*h2n9HU~Vz#qLa|ph>jK!p%28=3O|cW-Ax4rkLmRF85t9xngQw=6{Ys- z)hv9zcc*BMVWkp0UdWiTTdPVsC1<>xLJLt3m8hNwS@lhzz-H})#pCdn}{LeDa@H6 z^CV|EborU+L()55l*+HHZ0xfZvK%XBrXp1y;<79;yl$wlW0^4(W_d_m-2*TM34up1 zCs;x~cF|f3{Ab?J&sP%D6*L`tF!;_aA`t3_8K0XqQIm;;sJY*MUHW83ZwF2SrEUh01X=qlyNGRs2qWNF8LK_5|^7G!`u2mJbi+N=j{zdN4CX>XKNxH~L zGeE{R@Y-yoQ7cSF6B=9_0RWhJesgKwlQEXH43M0`$6;IPWh1UVoZ2trPS$L;`SKl7DsD) zeU=%N*Tf-+c_40JnvSJKrKNjH--B@&mr!;zA1l5Ec*niDUxaES64ntLA#g=3)n;iq zS8Ru?q6HhP)P6)+OP)Fi7eSIrPX!NdDEO@o{9^x@O|Y~h_!}H@rC1wHrH-!R-T?Qz z0EG^Gyq zc2`dE=#7T)#?ETAw7?p4F8KQ`8@DU{!$+%!FaN`5u2(<)!xyEWum00Fs8#>;)oR#3 zedoIFpSI81wCx|hrQLq$|5ZayufWpX0jq!j7C%d|E?U`8Gozs3sMMM3jK5hnn7Ucj z#8EgaKBs!%;K9fAU^6qbv0sn5w!BPEPL{Ur`)}4AzFd@1!673<>k11BBunPLCNp)8 zA(+!rElQ)lnLW%d@)@a4ghSuw=fgZbJ#XJO2&Rw6**cf|&)jID4&k)jnwy)!&Fg_q zx3%3?;(Lp>I8q}OEyK3o_8_@C&?$Ktl{jTvHqIec9>u(IPt%ezPgtuyv`tKVRVTQDS&AGdjae%|Q$bNx#; zHa|}=&WwH_A91O>k2xcCr9mS}Al!B6eYV?l_To;C{Ny_Lx>bvx#wRB&&Ne0+phY2} zp`l9cNhttKVWCcj zrn$9sXNFlq+FAwq8xH?tE?^%DRV7&!)e*gR?OJQ=qgnm^{T;gz>0ihnjf3eo05`j7 zIk&LjWzh$iJm%ft;Nbpb_@GRhf#=4J8>I)=V1&y1Gx$ouR0PeNsyj4?6 zqBj2ths`c2D*Eyh-uD*lvSjI|b6HLmK}QhW=H#6Q{a`s=2cgBHMF&yljkKl>0=xa5TFb}RpjMqS`5oZW@csrBxW)0147<1KU7dq zu+m#^=*aHjaS(UfZf$Q(nL3&GYa3(LVjIW*^j2eX6Of=65o0=S3mS(GNv-QK9H=I- zkNXn1n|FiuU;&6eKDxT$+3xg)A;9UrEaCR<-Mf0#Q`Z|!Pj+bYowf%_vS zB}MtKH~XA>YGp%vm&O|fm6axs2crt%HP5J2Dk}Bq**$eJsu-0DMfsK3T6BM;^6XTi z^+*kZJFH^LJmZVELW%^->dL+G1!%FzWUQ}GG6V9v+-%eUC}UE(Xg$@IViq$kd3wDsHo;h<;?Bc( zC-#~sWy6wVdyR{LAZ$N<`m|Kg53cN4Fw7?P^w@H)6&Dw0S)|O0*Mn1Ms&H0Lj*d#8 z7(W|1(3xdPOx}>M)Uh%?@$vEMYk6=u+*Cm&(Hd}y47;aigKD?@HRKe{s)1pHCYny= z{`B!i5DR+1l>UJMV27=3PpR)%M;JW)Isn4es}4VmvPeAcVT)M;Xt_w=9X)NX1sde} zUjg*A{Y5kC_2TV4+Bu{o>BPma43)#hqluokZcWGHk)vN8ZB)=?GVTL7q0{M)H$A$a zwSLtJ^u+l1Z;54z)*#O|Y1wrYBGTF8jj>?la2-lJw=BvtPu;)jq;oIoaDw zZ8!0`_{S1p(HbWJ2~Mx}|AGDV=~Gr#7DnyoZQER3Y0-+hnjp?VSRMhvs+M`fB0ND? zR#rAj_2Jy)Ik|rKP2HH19A*6y-<-*-^=Qpm+b67=lyGiDcR0q9P`m zKi!`GKk{b9ji2v6!(br#8AL7!{AzWK$w~Y(pue1FivENH%RO6M>Z4m*W;gSoi4I6Y`^X zi~2p$5blk62c-34^#{ufuv4dM{tI=HTTrKv?D-k(xTK^cm3Bq!SbdDv{{27v^}eM6 zD-jqo28vL?4vSQyKJnHwPqzPbla{Hr82{qM_n;b*P6AQ<0w8MUi@LfxrcPH+Phdu; zCSb-+^qUs4$_7QpGAysdf)b_3z@Jc%QwBx_;1*_n2;>DA5RvM|ix)f8P;e0L;o;#R zFLY~4UzGVxv3C%HmaZcJl={O=P3z+<=KicoAe{kMIEnZ5hXsYcjEj@n!^B5>j_v`(@N;u(Ys%B-`rTx*N-iVNq||Q3okyj&WRng>2sxYQr-*wKyw#^7ZT2I$(`gQ7|so5!fqNuAmK++4L@;*Z%cJa+foMImpyE z(olJH#xB&=$c$%BPLB6J<;mWPmuFF1p#LQqMLdbd-#P{9B_$;_HNm09Y{{Cbn z9a)}kwHh^hSV>7qO6k~NYa=2elqbzUF3l0;=jSIFeDU+$KM6sYnVGp>`Hgs*Z)+Go zu|bTX-{eX@SY`a*k|;ZDHa!boBqshG8)#DQG~b+44M?3~#^3D{08Ro>fh>EnSt7nZ z-20@^!NQ^sz0>4JA8JG^Xo|jg{=Dm4zLC_4j+R?nB}8YjabD}V61+Pd_8%OoLK#fc z_EXHE zls(LxF?@vE25RCtl*{dQA7^_-r+KLzs@Fhe2TiL(X z7O8stu9q(dE_IfIlKGsgKHg+~BD@$k4B+c%@hp^nH489vuRcw3xThUB784W0Llyve zj~qhVLE!;{)tF|XcEjlcnp74KM=V?sE1%9ub@ew61C8fPB9{+%vc2FoLcCma?-O17 z)2PWwOiV1^wyM%^w9Xx^p{Q8!aPL`xL?`&yl`B^KYYj}KEiA=|u0MC~7!#c_LP^m3;RSqU|ogi zZT>)cG|%>Yx(~BMS6A2jf#14;+gi8)J@o38z;X4Owa@e=b*G9u5+1rL4Fo%TGf+!j zG6m-&ZFklNiQNJjmzV75y8(jAkSB03=JG7s8!otSwt~e3o=pH~`1b~hgKlna|LXD|q|0lZ2zy8M<}Oc%#=}QUi5o!5GOILp*CuQM z@o8viP|1Ytlj%;TU;KG{-bC0xaOFfR9X!fuF|OvY<&9~19BhkOby5#`45m--#Hmx8 zuKmBV)Jn*!<_ME4$}!6mz!64;Xnc z_Ru2w2~}0qnfOMCk$W4nv~_mB^wU0RVq$XX(y+f@fAWq^!NLPSS8}@ki8W=b3p$p- z9A^A15UWlydma;0nQWmCT4{aMU&WK(ru)j!YZrG4Dmh3oMD#&uarO7_f2@NzTpp+V zyTpo{oFD;N*S){N^xyB2GO6EiXa2hbJ+yD2$2~5Gqf6(~iucW%6Ce5%AMJ}tNZ8|1 zofD^La?#N}Mft!2jW;_@PJyY}Ytc*gwb6a__ZIST?i|Op_g#7xtxS??7mC+ZC*pv5c>~af++ZG0P%N>1%+=(X4R{=h}u>P!9eK;zdBd6-QqHp9C)8g$=G=KdO@fJn@(C|VuDQ_jg7Tx$~_X3)3EKC4FsV}7$jc}2wrNr$qh`-Fu}_&!4&3z{fmfq=&MIYwJoo#Ijoy*21a6h+!i zH1_rD*AtwKWdX$cbsTYuVO zpK@Z6z?(O3KCa2=u*wKfn96+HFUf_xZ+B|4LoH3Ybj_b%r|=Tlxg=(2tQIaFC=2+e zRsS3u3?HlYV&>9NQT1QWkqmAJsv)5TgVd{*Pf-N-bHlxjSu-n>{o=DyE|{%|Oh& zMr0t(Qmd_yR)?zq*2{ZdnHqn6_|oOqAgc5mO-kxsisY|UD`3b6^D{_vXlSVG#7NoG z^r?|*^k<;y(c7C-At#>s9ly`Hn3`Ij`MIvRcx}Ych*ww7j9}eKE2{ycL?X{ zO^s#tWaQ_42L&8UuHEs4)%F^6wC|}ZtE~-5jYM%hdv+num%{-4vWarhX((wB2^Tg$ z9HkiY_JA2e|@jr!ylhf11 zSI~V9lO+lra2#y@A7qCwH0FbkLaXbB3Y^Wo#Wp@sM)wylf3)iK_laxzW7oJFe`d{$ z&V&X8ux8iqzbJj?L%Z}IkFwIzi{!oIBRv*bQzJ&KYHDh`PrU~E@bdAkrs8gZg(RbH zt2mW3IlX^JDz`+rLCAefO;ol+!Qybk&))gnzJ!d;vk#WThkpNlB4F*OJ|cxyZ0^1z zy8D|a|AR%+>ncRZ{|cV z_v7go$@EPEhR5Jla_VZ5>)gb=+ewNnEG$|d@u)_sMPS|MP^JsA8NUM>@2)i&K8k-{ zF;&yi5qFy$Lk`wTN)#6U>-*a4BgxsVRl5Ol_&o<0PRLPU`jgG{X$yXC?&xEIdkhW% zSSzj%gZLThncF)$DiLshKl?h@(N{c|8!YMol>t$nSxyTq?|*K-R(()L<`a58IbyT8 z!ycQzH8g$zxSl&(HEG%5E?TD6SNCiQ!q-gP8p9$imkV$L_^`e*}` zfIZI66Gr7VR-d-~2R|o&{RCN1H5UaO8}^s{_@SYy%G~nvI_uZKl{ug4(t6)M-)U43 zd;oX5AUi5LDvIEdDjA*{3OFjrw6wKF$qeOsWso7=>?~?-B*#hZx@@Ydu0}RD!HV=e z*e*HoIX{1su(=M6=u1)CbCiz7f4V+WA?U(|3px7LU*dT9`1BygGe+rY7b{W8JNE3m?vv>wF>U( zl(x1YE6e)zWUzGHd)I~22bb$_Klk~2MMcGrAM16V`1<<3TGjOF&i_@8`9!6&>)YFp z4lqeWY!If!ns)B=ZnA%p^y-z0`Dzz(fjXzI7vF+}L6yU@9hy*TcdQ*)cb~jVHs%;Y z<@GjruHGtsQdKpP==ADj{Fv~Okxq^ya7+|XOPxNrLf=rts!`fW)`EzS!BaDL_gXi9 z9{Pt~TwI*M*wyg<#{5^Vk`18tC_@1)O-)uL_&_>w)HRYWWBnq|!nf%A~l;Z3}sYV4EKK-M*I?a7%y3-GA-G+Dun&vzo z;E?lIQ&+$C;-YN5|M!v-=C+@aTqDlAO1=t3HqgVe$Qg zVJ~0qm93S4=~pW)FCT^OHE{--I8B;Ag|>p-?++ONCR|sO?q~yc{`Ip>khQtB6=v04 zi)`#HtoMgD`p4GZzOU-duKc#zG<%EIk1lXVV`1#qe)646*ame?r9^o0>%V^e+B05L zdQHZx2JULNj-JVx$R0SK58s-fpQB+n@AOZ0k1WV%l^xj&>^D~<168Ej#6nL`@5qrO zo72TmcObL}etwIxsqbZF>bkla2O{F)dS96W_*!^wvhw?XSem>vF#TX;K|uk8UVqMM zKsX$KzRulaf3+5bq#5Sv657SZ#YLq&fXXjz3vT~kwd-#$aW4f`)v zgde#X?n2MI&$X0FCK~~{e-lHC)hchftzU8g@n}-rxpQYu`O)yV|K4r?eK5#eso}88 z;lqdhve`r*p=^r_djNkyB35VoGT4#~boKORCteIHfMk^86K*m<&mT}WPf1!PlGlT4E5YQv+$RID zzSODazQ47tO=ckN!Gj0u)~z$x3w=RGiz%00zjsKs-+8~b<(@qEk*1R#*gh~JLLVL8gHYiXG;4ESKBbJ+H4+T#~wb|Qjwnt=UX2O|4 zy*_^YXDmn;J{N$G7`vnz!ze22^p(b_&XVq$Up z`0w(J6j7nZEb?e`f(qdr3(Odd7Ep zj=r7m%gV0;d^T{CXL-A8qkX)|UPt%0ygWFBhvJUbP75tS?^I2GjeQ(u^V(Cox?7SALQ=z?K1EY=K!P&H%X{Cv$v~-u z$I?l9&zYNN{*e0aIT{zJMJD16Ht**x%)@lHPi{j@f^yg=4xSVi5*oH4=Rmk3)HF1% z_cZ%aDZ1$p{T313Rd1drCkxxW^IXmxzM1~9dslzaC@u7 zqtI+;xD$ly+qV}8*U)9+W;8U`uUoe`yN4rCz85g;-6-MEf4cPwiV{i+3=wNOIwBRI$Hbnk30wf3wk;?ZL~nF?`uK9YAWSfe}@5@V{<9l=ZH2t ze?B!*s@>4Y$Y+b#{@d-0v|~q)h_ur;%w6k2fVGYiZVvLmYQ)^{J#tp{{~=~`7F!Zx z8gPGM@=MhyMI_a#BvL^;+1w01Q84J(U&e)@8M}>s#A@|2dQ9KVTUoPv%a$z=G|G~F zxJ3chTO0O<11~#@BhV)s2`gs5NpToBbN1|6mLlz$%L(RWnKn5lkD!^GN??}BqkLp< zZtl-j@`%mY7@3Zg)}91H2?TZ*(h({VH(}ZO7qPJ{!Aq}x07_?AHRVDzWR23D0}~rE z-W7u=0E6&RSFT*4>Q4a|mR#u%RAwpAR#mW;io7W6A_N2a6^HgOJzyaWy zpPvu9J7RWjsJ&>xo`ztt-xD@8 zG(;SDejAc)PmUPuUe*`0e)q{gT7D`9?dPTHMVH4f?<)D=l@X|PEZ)2#fqa8hlWODk zeNZa%d4!NX#rNdJi=K0j$o>}$i=ag3E3y}A0u75!SPRX(O0wbO2o#_&8PN0FkZ-;9 z_JjLcw|@N+iuO=m?{s!&dwXsD%y%X955f@y{wp?Fg7eD|1v2(m+6FpUCCp@bK+KcpO{ar?Nki`1L^h-5)=GR9@W&;vgraJlGC%@>`mw zqNoZ&#F8QTLBfY`tTy8NTv(`|?l6E5=G=_#*E&gMM|FV?7#SIdhld$?tk&q-jOfEi zj>(?F64#+Cu9VM3Vviu=?vr2i?~TjMlw3idRe|KBfRr<=4*;Aci|q}XbylkO8{`>U z!~L>BjigweMdP%Rmmk)KSht1P8ygudri78%`XB2g^{c@T5D>}cwN*cU_@{z?FaE}C z{a1#0-ya`lAhPoITgeD$&y4o&?(UgCkqaaSL1dS5b8(baBfE+7VwrLe$Z8qX-r4DW z)&9=r18b82(S5zWy@hmOV{T>I10JyPfddB?WUnJce2fsWG5vdj!Fzu`-M1IYo~89= zI+HPBcGNM%lx>;*%bG0rnN~lDR<8Sbk}KDGeSkpw&)g4=W(RdTdl`*CDrzY7*z&IS zO>by9T@{cp{fplYrO*?!Pn?+VmUNiV!6_Vsd)t?WFCs4ioxTW6<>Tj9x>Lu9^)05R z`svPnX6Q5Aa9`$xdFwS>hfmh_`BxUNB+WCsMQ<)hj33(C-w#~$bukAA#}|KIZJ7Ov z+Z*<7hab6MX6EzLu_^rb0hO5>p8So&%R3o;*n|t5P3IAAInmJ!x&T@rX>pVNVZeXS zEaq`v0_HJR<3F#+Uley7@*0W+fRbYH{(5U`t7Kw>Za$2#=8IEroQ69G2M4Ko$7k`eRGSHIk=3C9F&}4+6dbXOOM*GIhvY5kDs@~Wuydc0I|KFmxgoG$H&K~#rLlbUm1T)qY-H z-UbOeX_kwX#dJE|WdE*RU2$o>Z^g)#-vTQ6)sG)PxPyfyqLX7{VrGvbdEQxx%DK72 zsVST|w0VHTO!g?89t8z8k;&&M0AZ?9=sWoW<4nr$u$+vcs*T!ysDpH5Cr2;Lg5{-b6xGBWNX zkU?l=Wo2?QO~=BdAlPxZOtTINhY~a@xV`y+^|wbtWSRszCYznJhvq#_XlqxaKXRON z`epgkJ7GuE)!ztkxa4o7EX7D>aloS@Ke)ZT2ELIXN};!0mRQo8+hjy8xLoK)h}dHV+P%cUGi+{r3B;9;QFa$}T|?yuZQp z>Cbes!IzQ2p1M~`DhozXVwPg=9a}^R(=%Ns^pp>i1CWJP~GWl4o_XHV1yELWxmw3V=Gjr=z<&R?h3H)BB{yj~~yLB!v0V zU+Hkoe{G&Or17{+zL%Z-aYly33bM(|wrSIN;!D)6Y`u?-18o074<%)ou-jY2&`*(( zk&=nHkF1H_G)?l=pDn*boCKX;zk}m`o;}^s8jiR@oF^w;D6uihfc!qFcp?)XZIO-@#p z6GqD@-;di(c=u7CO-S7;6i*O&1ar6?(C9GIT`8G}5T!vFl0}{?+P>U0y9f7~Ep-0k z#hL_z!w$74RaI>oa<0wZjee?ii^OP6B1mQS1j?0dE-`-!&NlRnyVXi|RZjVbe?$!( z9e%j??7z&YRJHI^kI63!#TelN6>jay?B zLPUkU8$*OlH7Lso-@KLm1D^JwLPA2&iL3ggNc>5!|N7Y`Q+^*xZvo|UQXufwPsb8w zXF>h26kn7E!Y1-ucxTSikp8{%0cQ49R98P&CYms96?Yh8kU>kr-N^Lj&$1j%+;Py4 zN40T3nfh$lph%Ol>@LQ~@f2EHYD_ zM|-~pD7|m{IQkT_iz~f;6;;0?XX!nl!rN5c`IoP9S6sGk26aCiM1ua zKoLVAZ8>25*XjmF8A)qRJ3G50M?U)PLnqFTYbl$-<~;HS@~QD*^1vd^w5q122J#-n zoB?;ivvcQ)-$+_s1P>3v)1S*`0qNBOE_5}PK~>PZt_OsGlJEO0J2-R6*0waVw5;r- z+1MeO8Kn&pPPQxsY{|@Aio5@Hbb9tgh-J_}%ntAO%hsEjnofMyg=Ps{o<8gP50+I_ zq?p&f9quact4xe4RC9BihC1yd(xo>wiV({N0G2>$zduB+W*GoCGP2c2m|j5&?nsr% zet!OV7^E_^H4vPKXE{}0b;;g7N@nOs#J+v|-~)z!dZOGTQEFyZR#x*8YY5L}DK}oR zJe`?SzWshS#PdRr1@Ta<-i@_c?(Vc06fc%BF+I_z|MJYWq2m++BwPitOn3SD4SZ~v zDJR_y1k|}N;Hd9gw*0@dfWc;@CNMNK6lw@imLOu)_~F`0)^W!ia0i!S@JVImHA&2p zd;b0O#u8F&$=4wYJvs}}KVZ7+I~XE@lIc74@Gf%C;r^VlB>80EtQ zd8#c;j)rby)pxO~eR~PgzgJKQcUSgYvkue+O;eDUx11UygBn^U{#8R$)1o4w;hS*X zMRW6BL2VV4SE3y0SBAy6c(6sic_Rci@IE0`SIesg$=UKVG8q|QM?K7ouXHXjVxs-6P!2(9IEIHbGdZDvql)s6MP2XkUqo$r?OZH_3*GQ;nK1;I5ArqrUV~t&L`n;0f!=$b1^` zt77uJGy_Ut4d;6LfhXfJ*_W96V{S##VMZnomi5{1t}cBtR-4e<-ahtOcjfxs(O4tY z6HAU5#3xm6S5#U$H28%-YcPM;#Asiippad61zBBB)f=1Eugj_SrHCEF2l!-tIbe~} zETxf2hgM=Mx_F)Gvg{~+mm{Jp+7y^N&1R2NpnSc~6R6F!lOSWjdCS{^<(bDK8Cykd z+fP3N;@qiG*VB_6W`KTt9vdtF*V+ZyJsjy$F27m=%3o*)Y*f)uQL&zx8kHKWzxuQF z+ZVFU(@rXuLBXMR!bw&^K|vr;o(5nfM;WJhW|LMU4m0>k>JP4wq&IJdZJc4yXkm2t z`W7-gn)9<~8{y;v@-q7V`gaUVS4%HXCzhwDCu7{-*Vh-~TR~yRGb+W0_>BihCXq^R z6FriuPmcP$otd6scc{O7#>Ha}D34VqdwPg}bLe?fzTd2hrB?G(&ht9>$!nT9 z4a5DQpM}6|QBhH_v43bWo2X5zyj1cHe%Dbri|T(L8#Lcf3iz0bNgGnb&H)K0Vm-{e zL+19aMEj@+79zxx)B1a@0JHq*{f7__n%s9(2KpdgH_dLK@gr>C0*dAV1$Q|2AW!(KoE!tSp+Yf4R9#y;XltpqrY5U|@ULTF9cEQd*KID!wc3?)8`ttMN%A8>lLGQM zoAP8YI)jN_vZl7yb(k0YY&B_quK4NkE1Z|#b@U|HxphPYz@o9z10wG*Z4_vR%yb-U zxB&$j2)w4^b`ih~$6dptWR7<}M>tPmRkTX*7~Oqlib-y)4=O=u2t3 zZTT0q;X{sCF{_?K!$(&A*!XxQ_ChoOjQ@KkDHrJW)aQ#*tO!;W=V+SNIktuThll~g z-GXeH-TmJWGriDFONx!%O?haa7~AeL=39h5zvH?sHt5l#+02`gB{6c<(9nPq7-EtS+Rxj)gj)0t*rDz!XvY~DxD zaE&xB44tx+MN?AQjGPdiBY$LGBqtlN$YB|&apkjT&(bOn*tAMFr2lT`#+-nbCzkXl zGIw&VGSFUAmE`SUV1s7|gR`9xK=6@{>r{Wk`x58@jkt{m z$=Qu$x>HvwR`m0m@clf)@zSTq?{9S*Ymi}geNBeA^(EWM!iXyy=4tq{siO(H>gIah z74dJ0Oqe~XW65^Fb=;QbM<>T3;w5#Dlf$O678SRNf}iu_u@AAT))EL5w{8E9Hl6`` z9yyRsPAO~A9z0N2R<`=IG*XGCM~-M%9)R3)9PfxCo|C8j#-p67uQBR;PA+{Or~?mHY&^3Oja|Z0k>mbLt%*8xtWc zdY?;1E5l%~L5^qtf_-xrdpZGvwnn3>x*FsWE#Wd|DG->RKYr!P6*RQWK$z@l9GC> zlP%n5&o4H9@OmE4&&!*!Ljj8+XGXJSj&t6(NFT_xDU?VCiX#w1F{w6flG9^NOcFz6 zVzux$xL%cUc#wIi>qmgT8+lQ5Uw5}WZ3TY;!SzpDoiDz-vRH4NI(=gK%#fD8K6}g0 z+`lu(173ynq9-y+)7ens@CfiU^BRPB@5|cqXU{fG@8jj=)zk{Ue_zmXuz91PF*yNY zAO?;lR>i|qSzCJ|q|c@8R~tUTM)B>M3_9dj$d&|IZlJ88 z!Pz(W^ilnO#B#&;oQY^Oe_vhJ48+~dDoL-qt}HApHTMK|7*)MKKl@Zec^tR{LQ6?% zYKUyFN`}&CS&%bap$_5Cp2~+BhY&Z+reD(&FY{hHI=z7ImSdLT9oWn6OHkR>EoMXdUvTE~p>s zlY8=~%t=o(ce`s$nfEyrp2-J7-l3H_6@%w(x%Hn%Kx_UWrzbOAa~Mj~}wt$;Et zSz>2%Z>9CVm0QN2?el|9pZ+RX=+Y)u7xVnN9J_wf#Yz*YiAtc8Fc}TiJi-#cv-|k? zNR7Q?3UwW+#9D?1yqLKp165`p5oMRNu&{7-odT@fiIDynqe@=$EhXg+A6-)X?^%6) zE^?#8j5trMYhDwy^D2!n%1>|EQER49uP}>#b`t+xF*WYWXjh zt)b$5&IQggy^L-4^ij!C=SS{QMqm67IV>0ngsz?XNt$*>;*z`3LTKhR{6Le?$_TlD@3$!r335hVt1b|< z4{>P!i^uH2PIccMPHaLK)DX$Jdp;glfLav_fq{X9pnZ)xOJl&z`9_xbn^UjPSwXDb zpz&%a#h!X|VNtfE-@SX}91(GfIiAb&s+q*P6Oc=qT@~8&{2FR0+1%>B4vs~22N7|6 zW${YiJJ}r7Lk>4XA@wKz zeRava@nPB#PX4=0uZZT$%XaVWF#rE=7)=(bI+T{hi`B`J3gjxP4B<6 zfJ1q{9BFnvPSd~I?AyQpxsV#U-M{8*a39&Wg!A0Eabs%TQ%D7$O+ps{B=>heR*ut2 zofl$pR9CYx%tA?&5)GESG)DD(;ksQK%>rcKf;aIsa1xG+L)Pyfs=^)X93dD6HOwY# zeoI&*PUlx_V!_+`D=RPjh~2oravMZNcIZTFkOkRT2+(sn4-NTj7LKz)awAiz94Jo92KhNT)N+x1i}XXcdu zDgZ9PPw-KVXKFn6vf13WT76j4@+II7#l0w}Xrj`DMz-1p_onM*IH4p4P=s1Z1o)RZVe(9MRC_dd_Ajm%M5yANJNwNGN(|$^Z%X za-sMC{8=capYCAQOPd6^?7vvCXH8L1{e_!zmU8eVaMwEqAtGO^cE|x0Npcx{6c#J7 z%>I$Eh2Cs9atN;ywr|e6e_z^}3{kF!udi|(_{fT1y_Zh* z@}VZn)idLHHm`T7uyQU`UX10nuSPtf*v~_HYju6k0YTdG(3bPy={K9X-q4o02k=~}R(imo$p(X0i z)aD%qS$#slv4JABR46&I``&voToaKBS-lIt3yi69i8^#`#Tx1w9U^09?30vYpa6$s z(?*lvqImtR@!>8RibW2jULmXzdvc)0rZ8hLe^*|B>k3oZwqTnACik)TSeZ0+@K1or zqvn6;{F!6hN0q!y%bu;18M;pE6q~agOG4&L!{W21o#4irUVVk|h%!JIUPKXW_e@4f zA&}k__x9Xd8-JpSltRT1&{a@fs)`3%UVY&sQzXO(F3ZF9JhCt|J(>m5bdNjrW+(mO zqeo6Zv`iQ`>^W%7PO%sx+>eAz$=P7zg5ZsAN<@LgXbtK_{kaD3LTW|Eo`7Ho$XmN%-Gimv-HeTm`I^}F zo%`M>*3r=c>bN~Oecr1B(@%JsRlYI;X*Ru*r%Ad->H8=iKYqR@#R~D#O|v66NO3>X zcyVgD;_My9t>Pk*?)P(7W|PrgLY8MtKALZOBsmM_d@p^2cM(itb(9i&UOIK+HHrF2 zcP07u#HT|ALBjkycI=3HXYlwHfRH!K=JTI7Qg+V$+Rzi9^O~=1=iIU5?C(<%Y*KEM z=%-|mU5UYsEp{hw?1oI9g}#HzNnq0~ljDZFIc>Xs^gv)e*UxfWL>(t9tHXM%zK8vt zmzNICYJ;|o2+%u)evc523Lo;wg> z5fE^EysRS0tQtL^dxu@hye0+Uc@c|@df!3M5(Hh0y=`O0z!eHA}zR+g<`qXkoZi5COoP0 z%J4Yf)vmJV<%6>cB(*!|XG9nYba%JRt_S5a9TWn7( z%3fedPj}3kY~e>?Y_y2c&zcr0*Rg@PK1$tX0G+e!e7sd+xKtIoVCr9h1j{`n7fjlxyg_t9fwV%AX2A@g3HslCm^s*%1&_i}-^qOmwr^bh&Gh9Eck@2K~ zv)5M6-T&(rL^4mD1fa-hAqQz_pDjz(qE9?Ft4`YTYM*&cg}v{B)u&1BYVGSXK>QA0 zz=EzlZ^{8udl!1>0%Q(0u&fU!XSl(zFHXMPPOkvI(k7d^V2pjRuu?F*G2Da95GTL0 zF|*`K(~?Mq>fNvf_EvLG!k&%?)lVoG8@EDEA2lJ0PVv(|-~!o}dTV>W?3p^~Y6rFY z+%C;Hm-@>~uQRc4wLpUom?hW#K*27f2FcTe*R;4*0K(mM=tk)`D`X$+ECa-%s63A% zgY7wM+du3k+DpROZY<$q)cYKl{ky$U(MbyauV25Ot7gIuq77ZmaA|1k>GmggNUajD zFA{d>u-Q@s_pO?8X79lf__y8m@o4P^_=!9OhZ=G92lWDB_~s5%J_`n>Cuov^;+l_X=ZeC&j7CO9 z*%w%&CH%ORw=WDkng99o2JnJSp#-bNfsu-{WKOzM{h2hCkOufX(Hskeu+N&PWwS_M zV{yJNbBZ^)#=8IAQW@wW;&zo1Z?Q|cy}PnlY>O%)zMl6K0Y9VyjVZ67;4>GdtRbOR zd_}rp7s>Lm3`XsDlbM zCL_UrYpCwM1S!cWm8mcK(}S?Do{N(|_@5{z4>_$^w^N#;W_I!aN+;MG%;9pX?bh71 z97E;W)uGLoFl`k#{Csz~tK6je0pxJ1O&hbKNCR>}&Rr~`>KuDh+qSw66`?&j-UjH} zRkj4^hZ1dY@NY6DHfYWL?S1CvVFn+8#F1n--5UTSFaOtr4$BUI6w|3#KBq z$-|dJ?s|!rw4}wXBLCk%EY1Rsf7TJ<1!^+suYZTqI+CQjZl{_EDk9Ck&uyqkMlNgN zwjjV3*~8g!^wu%k!(}OG^*f@S(aWe6w;{GyQ`$)vfAv_nPoVApdJBh>GCBBVVz`TS z6P6R#iYBn@uGo7v*JY&A#A~_r{<7zqOzh2MU>b{xHiz3AR0kB87>R3@(hw?5w(~cE?as_`N`2* zEL-1w>QXqH27RkT{pH_Ta=Z(RYmno)M{Ihm=?-}pQybQig6Fa!FfF;(t{MuJxfU8&YTyI&ENxJOXMYX0JV|sJ%;O?Q8m+P)-`KiI zau}7U4Kb~vqB6It>ko3>XSF7;5QNX^0SJ>F&?H^6s@Dg4UY96}c05HrAEE9(U%Ya? zj$_LME1~5*@BnCX`_Ijb>nUc91j2GAp^ltIAhE_i_n8S?N`|6-1t36|I!mP``@pL9 zn@<1)QK65WM|)9{myRpWS%-)R=%QOdP!NqZowJf({?R_3>NudpaA#Q;v8u@PBFb?O zoF<6D8qoYW#MjrlT-QFtIv?(|TL|4PvW<~#e|G>h3YKt~JOo4b9N-kzETFnC6B)W; z@0sS$_n-vNqNE(d%L60-JBrD^6nG909Yn@uVUG^j7(X<4p_3|5 zl+pR@`S@rbJC^oRA!z@#<3kgDSyHgF{ZYVlu!f;I%>t~0U$onm$NT=_HgE-$Xo za}@~&izsIrfq;vTzt&p5XGCu(*rG;UOB963Vs;7&{)Ag0wfxVT9awURnFT&Y2}-j> zNh(7zM075fp4gYy95Lq9moXZO9zfOpWf80VB$uc!0OEBBnKYx1-s@O(ZI!pjJO~in%z@r9jY`Fjd9VL4B8Zr zD2fk!K*!3=?e}}z?*}xVgQdSCH9ZE4=POJmZcwIZXeB~$r|n5?xsDHMrC1uAi;9Sl z`1w`PhfVl4by}YYL@Qv76+FP5%?AXEdLZFL?CCuItW;p-|$}8yyjv0 zbC_iKHu0|5#Nv{Yxq2t;pSyW-0|K}Z83r_d@EY(3=nQpN{zRv-JY1F?y3#~LQ}w&HX$?JLFgyoU|Ik3Bp8Kg(Z2MU0V_3)w3)nW)YjdkhI zjH7V4szz(=_0eYNon)dXTs%Mai1nr0fMmRS8JNT^bCz=fU?)C6@#{N7Sp%b=$7jmY zL;d~j3J$dCSm$xfN`g7ekONp>nn~I@58ecqXv!LaW(%y8o2yLYkt!N+_u$L5k*CRZ$T|1e$+Wgm=Qwc28Y(+;ZNX6@a67RAP#YRN#D9%8lHB5 z?di!jsi?@vqf|m6QNk&eDOOD!0XnZ>;lIa0W&s2=A0N7goYb9yNS5Qz7y=NJy`zC# zKR>_w!0}gK_-rcYtb*dcXgFw{y=m{659C0A%dbJ{WaJ)t{4L0Lwj~b!oz|07O?2gV zZtbM*oBWw4;iCZ{GkL_C$p`J#(EHLD;7S$q;X5st?VeM0Y4Y&ZP@s=R5Ze!eM*v=6zYf0UROrSyf5m z!9QUuRv&1-3;h)Uql<2f?-9?G9`m6kzV`t6*`ugDi zcfwEMF7;u#TgYe$X1S4s|p`31?ow`jV$Zkjw6w2TV-<6POZGP0*QieMvY zisaGqYW$5mF!lCELC(2^K+0qDvQYQwUtjpMT*%sWpQ*)==mWOZP?ZSp7gALbasfxR zDwQ;Ktd5YkeNB@y*@TF5$+N>KC;;lUqd!}}u{(FajH0=X-#xtg_(d%&F#9rt1xoWn z)Z91JW@r9&KVW-bZ(5%lk|-!Bco_1o%6+O!zffvs62bPu8l=2(Jr*#)sj#3-67->> z%wl3<9`ALV9D_kSic22HUy*_IWrn4Z5fL0o=|2m^fKqh$r@89sG`nw}+?pg5BRN6% zrd&_XR?NPae6!ips3;jKLCIyfOq1q1qIJ%XPnRG+;i?I3a&RcM*;jgk4DcvwMIb5x zE<1g^^Z6%scb79?z_~>IxljM3&1JWQ_|MG|(N&qQ6Ijm1rGugNbjLg5gU7C|SO=Wc zY!oPk+Xl81ykS{LFib&#(dXCCHsqoWQo2Dk(fHd^c9(vHNKsC1Wi61Mxc#iLkNo>B z=<{Y)gqXdb;#XifFA>}|r%Ae+qb7kV2g25H@h-2Cn5fWA_|p?2elQ>KHePn= zp3A5c%Z5QQ00Ilpe7Klx`*#ATK*)J&Jwu+8|48wZJCdR>G}04MQd1qsFKQ&2%vM0N z-=kF`@?o*ok!zd_wyQetm0SPrDjfCJ1r&=0xgQ{)eQTfz=UcL;gJy=2o0lpJq^gME zh5KX^yVuA!;kwE9?9+P|dbpaGMk{+Ajn~Wgk2+rAgSC(cYaYKe{`N>o^4DKzxevv~ z#pYR4B++Rgt;cEj|E6)N#wC#o^HNlf6#YZ?H{f@D&*_tqI2aCG`u_F#lC|WsMHdoO z;?a85%o7#tdk&vkjodsgNA<%3>=P0add<4~q-B$ju(7f6+*e~~)Bi+;w?focB^Vq& zx7n%vF}T8&d^$Q3p6%YbzdA~#qxR(`$trF0pkNLU>ID_A-30`!pIg z?4S1P{~a1OS67`vzV7nekdB{!ND*5T$|uMjB)>kv(W{o5*5ZGOXh>&FF}y_ zu=e)4Ecfue<~1pSf+ln0N&J-DJ<|KYqU%RtCEwchY+8^#oe1RnpQVx4nuq#o(Nab zJzw8q)UWhJ(;ca~6LpU(oE3iCiHq|(8noXGZ5{t3UY~YOE&9ZtB&{c&K~;pmJYN!t zJ3H0^rxQLvdW@caU@i);@I%ONiQE^yT?`)JxR)2?>#Op6*U{rp3~JbmJTe;g`M8`M zRL7}v7a_vNhdSoT=`hrUA*^25-3p)%!h84$l)`LK)K8r{75>tyDHjWgjzM{ZzdTnI zKDVa0Pw-SHTigMI;M3LqfHh!WkR5tFPL_vfMnYe9@|JL}c241zPahc7mwROV8K)}7 ztMalrLu`G_v5)pUGNFj_>d@X~cVw2Ah$xgc=v(eq}_3yZGhZM`nt*0L*x zx+~-L%x_X~G-KeQNEOdQkBl9o+aG+{aAbuCgKq~Lb>eBu^zsfqDXB~IUb~a_Hz)tK zBZxPrV(`OreYvbMqkF!xQod#J`tAdbAB%d8H%7}+-E3*Xmt^yR*#IhQ-aGc=;H9peAW~A<4t60vM%&Yav5Vq%2DA%wK^a?(T zn|#ziqUemZKD8%r(nC4&-wvIhTVu`lDb*D>VR$0IEzXgUT#yMbQ4D3#$~&rF=tPN# zHb4{HL34-PB|sO>*gy+;^u;Yc~K^+|0;_CZ$Aed zgW+2KGKxhP7DjTs{RwlA%ZnqQt_BHP&|_4i=GMh$E;P(`u3*bUFyqWUwPVHS$@{VP zn{9&V6q)EwG%bx@)1s=A#h2cn^GL`P(wFtMdF}Yav$wrobt=-M6b%fw$0Wcwdj&CM zU;Y~v;{AGTAw!Y*uRJBUwR6Ge7uWrOoEDu6oux6%EeCc> z#>r+lkH*1`AhHSwi}O(X8Y6X@xMIlK_b{rzhYhQD@7#eh{#btF%Y?$(s}r*mggKRb z1Q%4Cj3`NW>D#xJ93_CEQ1e>LK_sWN82@9%`s8$rWqyA0vvS;cLj&n`r>16QS_YTAiOMMbM^u8v`c2i$Z zWugfvaR>j{Sz@<`JIjdfLo(MJD=BXsbZX3iH0-KLwfXO5i^oU% zXru4Ep0Ct_p_@mmX#k@3r%#^_^;8Rw_f|i3v?^2AJc6=-v>Fe;$>%+&@gV2n>({S; zm#flWk&0=4z8w3Otlqp~LH1=iQXz5va2^(Ql0^kA3mFFD2+hy7^1m*$A;h84Yq+ai z>9x&x@%i+rQdOlFWM3Ceo7xsiHX>?1eNgX!(2JctLop$Z(mj=I9y0N;N9)iN2tt|7 zR?@gHzTfvX+{N1R>sbWDl2!BksKhpuX0)`|+HxHm1;4HUMb%fHM*)?HlqrlYYx$#K z-^M4gIciY+?9=@>P@9Lzi3G#WMO2;g#swbX&(HcxJ4cxo4dkZl%-h=g93ro`B8FK> z{3SSDSwlYew!Ua>D966Hm%8lQA4BRU2oqaC24mKrFL`&BR+`XsQE1S1kHITMbt@O| z=Fv*$kdT;)esbHJsy`S-Fr1bK4U0t>{*wqO4BeNroT5Y1<5JfjQVn3lug z(M&5}8KH)s#P+|ts2U}GQVCW1erV@HkH+8F;WjmXBvtQp{j=wB^W>=nCsMSFgM(ur zq}XqFrQJ0eNdU?DsZ&*O65*Q z7!)xOpor!VJ*RJ1X++8j0;m^o;m6YHcP=V2k{BTTXH8ArOX^9yUNNe0t=lPXw^`DY zRZ@~7WYzQGnjEu|NSZ1$a{JVm!}s#*WTM6v9e#W}_ed$!5Gy>LF~fu`QZc{d_WZbVi#UtLpo zT{5%2LoeMVYL`2j@x+JM0mnO<%z_|x3^yv*aWs$n4a2y;H~TPrnYZE0qu6cJlV=6yRvH5zSC2EEF1HB zQ02?btujkSE}P5HrpMpC*L-p6L3^lG?#60i&Hm(1bd5-zJa6@t^`#-M7i;q^vT9%P zUU7}kXgSJtNy2_|Y{1JLu7&N#`G{jL`5(yhDi4RLtm$UnSZA)E=3=_&fa=Cd#s{W; zeCnJW3%w)M_04KC&72oq%Z*@N6)fa<+`2q))ipU;S)aENb5h{3eHSWTV#>NBx?EFn zbL#$uA|AG4S;k)q9_;Y;>!}X^Wbu%B!RCJ+y?$;vc;|u)ix9um+p*`rf_8YEd2-=} z3hPwk-DM+Q>ux5ek5wO8bMUh0&-}NHj~?9gIMZ<_xuE)0(Su9Wph11#rnz&^BN|@+ z`lf-|AMYEb(e-{W9-c}%l(#JG^SH5YuD?&<|6}jH!kXaLwO!Otu>qeVAX1_tMG#Pt z-c*`Wr6@g!^cs5T=!bxSfYOmBy%Ty3pdh`8bO=FuPaxEgg#07(-*aEvwbne@$16wb zrIInm`#$gejCw`Eq*}t__S;O@Ms6RCozU&D=CD!aINpVSc)p$D6EY(-Fc@-7XlSYA z=oD&7oSrzdq3f4i?r!+kr=0aCIoitE@>Gkj_jL{bFbHom5jTarhNB9j(FMwXy)cgm z@M&L3FAe9J*HV_}K7{>!>YCrBJcsL~^s0Ok>6xvt|Mbk(HKzaY%odNpe|To=e;e}OKmXg1|Kan$4f*e%|82ys+p5K(VqYzr(==5Aw9?d6!2sqe^X^Rf zMy04>33myR(^MBD#b4j5^4wvHl5&BgnpV;}RpNLVPCa&xCfx0*vWZFaTHcXwd>W(- zNA0|*vV!_-1x3l+NVBfB8Q#eZKPP{U4cj8S*Dq?KT*dN8Y;Vdg;7_i4vDv-IugoZr zayS=)<(x`NN&@i2?JRv!pzbRmWWs3n^98GclrPr64NLq()GK?9`ITehPuf4;h7IRN zye!ly(#(2Qy`804Quwk+fhzF~qjH9&S{hLwHB;kY_!m{XDkhI-V;m7-XYo!I(|l~} z>>Dy#G#UavV@m^y&xjVCqI2Kcm-U%h=T+wfE+XAnDoG` z$9;TX4ehcwWQ;}b)@nM(Z7q>@(@hFY$iL6OO(`*MT&9*4d*G!4$hhTXADZ;gB9qwL z)wMd)*eN<||DiTk&}1%7S5c9OxFv@^I$Ai)Q%kOMoS91L&_O_VKMHxLdrWyT@alY| z;;CTw*=!b_CBmVKxw*No3bgoH$#gPDKlk?Hx2D_+4Qu`XqI!|CdF17&-ilMGwiRxz zA2tmUc0eQdKP!0@>XmE#$=C|-RiOu!@L4~l+TV_z*rxAS#LriDai{yPuE@6V3cf>@1LJ#{oroLN zB|EK;gkGU)?*l*Au^GSKLfY!Kh8!;^({QJwWQZHnhsEcqCiwf4YyE$}%ezW;Y}|U6 zZ+%gF=!gDy+>%PxQ$f3G-&NspqetF*UEm+CW?c!@T?0Y?r)|19sKqgX5P_kkToxPi zQlhbLp)<7kyfPH0^yA7_g+q$8kGE$(2bIV6m>~j~jitMH@8TOqL2nblccHYUJ4TkY zUL?3NQjmZ!EYYt#9@glT-&9S!IOBumH|y~IN_KQ;zdSMg4LT0rL zPcU+^sM1hPmk~crb)dS`^AZ?(2!n;`4M`Y!Wyt?!j`C7P!0kjj246q%OTK!I)K2Wn$SR{bLn#`V^z(#K^nH6<5JT=}Jf2*Yup?p)zWjE{ent2))-ZpYDF zX?7FV791gfEDNZ0D0T7vg!6k zTbP@_H<0qeQz$7T63krb@7}Z27q?QN88ac$zE;<$VpYn?A@-hBZqj zoJtmjLCanbtPXL^`V&UMC~%4d=lLDZ$dY?ape4{I#j3*~y2wBMVpq%6E1TSGlI$_o zs;LqWXdm=t0f~6_s3!s8)O9NY_+8`fTS#m(A)QBdtXN;#5w$AcXwh3knF9@D;1hO4 z-5c^>Ngdy1X%=!@O%7FT^hl*_(*A%Y5@rW2FD(Lhm`<9b6I{O5#S+V>i&=~r^xQ0O zNe?*T?4E{rEs9c3(NKv!&iU6dj#Z#VyYb|xa~3vT!#_o^9E=AAP`=WV z;a&b@RaF&GBhoRA?+G5RF0r=fNtqx|^E)W8PEQnfRsK_eD6^1$yy6<`T^y3_lr!(b zJyD-IX4M`^ct}}-5+KZ9um6q?6LJF=+X)oWuL0UM42Yi?qHMItkb{lP5ZBEJKY2x z%?fB!AP@@pYKEFYm31n?FZccIf#lj+3Gb`oz5VfxtYWPB!G`Glo@CIg5iQ@mMl?H# zE3#yeDLc)5Y0}cjdvkag>PRg|`6Z~o?Ec}F{RY7aIp*Ebl4xEbA=mYh3(mFbsmF5` zebZ+YW4I!sD4UBVSHDU~vemdO;cSMv`jbU{Mhh8=bP@NA8&uLPt{sls)|ai`pSu?wytxrO9`JtZkWS|69a zBjp{dF=vqk!qyYsYAQ>-n4=t5YEW$;#&>?@45$VJYr5xa4eDL=GuaBA07>i~SZnh5 z_QvyvHacH*7MZSvk>|tl!+9FeD(fda&jG2FyvTUN^L(yaO#?QW-91-Opnmh6G=sWd z3lSGCFX>hK`Sa%ojwmJ5hHJ~p87^`Bh5{*4qV^Lq*?)wER&lA&T`U7^i z7c-3fQzM7~Cjoe3$$d80z6*oWhi;jaovz#_19#wZ!N@DMa_&BhpJ(OqSD^7=5C>9O za_{u&BA{_eNt)HR``gn&Yqp8afV6Jr83wtA)=g(W-<3*Jct0f##}wDGSQaex>Q1b6 zNvHFX79au27*OKhZXe6zok4Cj9io5V)jkP$b#yR|NOK=M+dXXl_NfIZz;pN0thom> zTC;z*(S`W!k0zL^-BYaqk#}XR&Y;?M9Erbj)+bFCl!*Jo&qpSmR%ydwp;|1wW{IJ9 zn3_|0x5a;_)g7-V2h*^yQm+OOcL=6W9v&udqOXYw6qvpgsiJ3TQ?|tYdQ%tE;J$&~ zTkcl*G8aKRJi2`xA}Ud=!p#ViE1+?0pzK~8EsP6i5`0#5*dbwF)wy!HUL~#6lJM0- z$*{)$Li(BD=gywEIaQA055dgNdY{EGb?g~zTNwI@i1v`On!jbxYE^Bw9gxyhpe8zJ z8rRt4bJgeu*PPq(@=do_(g)8+u~;5X*H{EUcT1cB`8-_qShMWXy-CXI3$7Q@xDc7n z)i9@fvKXV;37Hi-G~7a`Kk+ne3w>pM$E2SJ3GZG}pJPL<>AwlRN_L%@-*$;$-hJY^ zS9U#3ukV6YB9NN?HRKAygV9e}cxU=82&>_Y^Q z2tSWNoFAfg!|}T-n|oYrk{f4@!aZiy5)1HtHM@JoOm&GI{ z;fIts&e8dM&Hr!~kGK%WBb9@h(db|DPxGAr?j)vG1@YO$0{EmGBqv#=c`n5TP!48w z?lADZS|7)D=B2p2f@-k5S2kiCv{-#woH3d9`VWZ9Gj7=nNoi)oP}Jftzz3 zB+cy(S}i~1LalHn7}c9i%%bWm{dbd-7cl8$qB2H2s{BbH22^9W%$Z!ZkW@?4zT`u^ z9No+VIA${ildT+AIBpW)lc(OPK;?6jHPW9+jM%+Ob5N_zf zTu8053LneT06W~bZLs z-`?86y$3_JuD=RQ_g=5%P(;#)oadHYPNZ+W@KT-W@|m~x@dBiW^_LlbOPD`N6vCZ+qQXUhl5fe54R1Q{m4P(kaEziz zoko__^#}8*b;gYzGXRS$S^mcGBCYG+t19RtMrThB%sqD!1Wj(7S~PKieha2Cv9h#8 z`yCFN`0b~Q`w0bXjFkl7dnxBT-1Bb9cwLL6Z1)mw!T0yqXJ0uBtgPqncP7vPzm}Az z*R#m{1%M+iYG4N>VV-kAEz7ai+kl@afZYAPdh!k#I;W5is&hDF3H{8Ac9&49XYodI zltGmm%i8`KCF6}{gBzv$fX-lO_1qtoRW0SXkSYmRDIEgg!?yGtfQ}5wO%=5@lr1|@PK1J0s{1^r|hOrvw7-FS>g-!0z!`d?+HfiaD;#JRWDwG_;QkUcksl*k^K zdZr7DXD`;<=ZL5_`r~3`Kv13I(-ojobz^n-_gp~GW`rm-?BH88XE^m`F>E(Cq{mNL z*lM5;WJ+`=d!t~&gR?T!C^;Gyk;rNBIKt_a)7an_irQLQ%|~zi#Y`?*(TevkDMj2s zw~)mvtp-0(-K6_9Y>0_)?>a4I#q+m@EU7UB(rlOa4yid-ELD8Q#JQcWwYX9~RLZXm z`XZbTUu`|q`tFS2NvG^dtO_M^zgr~Qt@w9Ta03$nQ9!Q0$|L^6V}Jc6Alm@)<(^nP zR)|&Fdyz(TZ`KC-WmEKwt}bNrKVBMtdz)YQ4dO1aFD`IktSKc@E%_w*yAB9j zE;U-j%c22bIvMXJN`i(0^d}>;DW`%wrmHn%@U0jHqVMrqVk4&E0lqhWt{f!$s}h5V z3X9$nJ<2UhoB%D=H>bewIiiTU`jw0!tS%FgaLQr5I<~X}fQLW@tU^~zDwm&xu#IIu z36vWz)~`12&cyG^MxC*3lOwNbM9CcehGZIFpd7=~1`hw~O-0nQk9wvdHI}dtocAR~$o zo1Ur*9cyz-Ag}wGO!|@^E>((EJs_qUx%Mm2No|M7(K)c5T2vB4{@8N5?~7krQH;33 zZo#%5B{tvXq=V4PG00Z}_Tl+Jkq^B(S8h9! z&p?Z05%F#E-tSo(=5F8FnfpeVFgu*_-JOwash!gtm81+;^v)$V2CU z*l5y1zy!=YdJ0cft^EyMIo_w6Y;f{1`A^XzLAI6sTVD(OS3b=ikFCK}Mmy zH{#^sN87c#IQAy;$tTL0HOfsPbBAhZ7LOUP6&hgnuEPpml^lOoVxK89rR=E>wyJiT zLtUVk2_;LReXu2EOSLT|R~O{z$7s&MxTmIH9+>qEYmfzoXy|jCo?WiK%j(*ScM^+< z8YH(6U4{?=e%jFG8sMvad#8vg1)T>+n5FXt{iGD>gRv#g$e~>AwBeK0el8a_%3v@6CyN13EJD-LcRt zy&80vb=|~s4iU9mVfjm<1BTL@uq5W)n{*2;wl%<-QmgTj!0 z#K5J_S_>TIkGG;|&%4Ag<3_I9xKy`|G1tur&Cr9z?sQ*QU89|*oE9SBn8ZY* zo62##sf0MSON)ayQd=Sy2DDsf7!Uz<7Jo@#mF1810Lt|%jZA<+9@Z0n(9;z|n<{KaZ2|ZRO29Gk(a~42 zl>2KysTB3XS%qR6-0jE*wcP&4!zPOOSis}o&eV3kLoW5iwO|^iBPC0faApen^-V2g z(oCpc)BU6G)L75Gp_Z-d{GVC<%iTBPK`6Nn=SGYcj@GT^Hda`;QZDwL3keW*S^Ojq z$1Q5K$+3Ew=ke%H*N_gwV`m!Ek9+tAxobXN-x<)iGX4bQkJe9Uh{vS4bw~*gSOn(U z^4!xKppRPj1&(p3j|u|1V$Q+{4clG^Ir>xn5Kz3-Zr_5g(ax~vV^8c%A=}Rk;xX+yKmL?iEP;lV93Vr*eI3XfKsX(57CD6*oKzvR+C0J_GPUji6@<+ zLPsnoLjf_TG>}BxMy2#vN5m`<2t6%3(Iu0m@LPGO2lm&}5gV4jKHL9bG7(sZ2R#z` zQ1{Wno_PLbDVJZ_8d&6R-dq~}j4WyG^DOxU0Wx<#UnvS2KwQAmQ%?g+L3e#S1|^s9 zbTph#<#zq+gngc4SOt-#`yDcbed;L9haK^%#Jk2+J5L=+I!OP~(oU&S7QG_f2xxwq zGh+v+^DBetmA!Qbiyw~`A|)S)yUBPiCviug@dC8PuB=7;5h<~r$g@##D)8J46Vtr7 zt0jqq)iCzQyI*;H!U-`GwbvtWx4{+k=N_J+Mx(Nyd*ix56+*cU$C+})tp?XCiv1mQ zm2qhp6p{c;ecl4bG(;G`rh)A`(4$O^3a8;rg~RMe%6yu`XrTiReL96N2<|#n722)go=_h~ zMg2B578~V`Z6>D3_)`k68pNt<6sVkO0f{$7&w2alkJ+T)g(S|Oboxl=vtKFEbbFSo0C$2=ADDrFP_G$RL7~FZw8Vi#@Aqgv$y?;co&nU1{QvS3orZUGumMY*Mo=A>0JzO5BlN;71^F z#7u=tF`X$+t#_RXF&c^vXry@0OB_>F8zDL6M>${#0+xJYe7^AWrT4(#{{C{$zaXozGu2(##a6I+*OQ22b;eyK{LUTS?zuSiDYCpd| zX)6x=b$IGQ_nL@Tg6~B(O9A-IK7kFw7n@AEQ4HlO7+H(l=}_6>)HoSGj4A%i5%OMt zB9uGrV0!lCuHjACi=tOsz`8Iw!$Ap3_m|-6NnUK*PllaH9)6b#X}*%zwjy0g**E>n zoJv7oQ00ihLxQsa*vNc+U~$4~FW+!8ak=i7c$Ew1chy5bF_WCi2i)9QN!^P=lSgmP zJgKzgzy0>jO|PMQ&VB{=?@D5k;gy`JXDPL3F^1S4&J=llM?F@!fWS%ViJM7y6C}H@okX#;OD1XWykm?0f%F~Dgj*;8y=PGD=d6^dqKm!3QF&-=v0{_b9!$s3R% zgaD*kRfp%~&|6Vzxs6Y9VO~P%!#=Ox(soH*$3o`(it0%Ci^jJTR z_a(fc$f(}MIo7nyb`-}0Yu)`Q_jwt_4bF0jOC>c%Cc~`$==p1 zxl`DVJ$Bf*+F`m}C1GI!0~GJ-sm*u5#~FJ}x{GgZO_Zy+?0w7EY>SE6#La`q9Q-28 zk2zR(ht{MVn^P8LQE5U}D=%*vHv589+kB*b^VYPp|5A^ICi)Jy{AFgGq5#ME|Fa}W z$j^!d#BLBvjct)N2f^rE3!Al@KMG_McJTJZ3F3y7{&ikj>ZTV~K&Y}+u9LC{o!wc! zaj^+lQd^X|np)Grlp#>YxM5>s-<>7rhsy_B)9|D`x=%_O_k+aS)#0NB+Sop!fWP4h z0>%}+f2Y_}ZlUo#GITynG;3IK!H@zWdz5pYnQXkjf%L&yE87%a^_aMiMu;0f%vJ~= za~BjTOZxX*z{XfqqgOf~r%CV~)gTwT)lfcNJdOcSBIDBcp159a)uTI<-oRvphz!^` z0n6yNeBd+)>Ms#hgbnxz+gcWy^mb2y>d86-jm~{F~8p0n_yv zOW6aH|G0^WbM2mCGmE^`o&H3xuYUPUGOjL>KK{v{D~+`B54{dkDJQo5kMZ@Ft;{uCGQfGhQXss1?4 zr@Jg{#d{2EaCA90AK-E${`2Q60pqp)B)Kn-o=4$c|H|G`Ne~Eal=exBBODdJEaJ3c zZUF$=oxx(!6T9|n>3v`o}4xmo{aE!2{*Y&4pDvQ5zmMOarw@vs9pkczooO zQE910m=DKa`G#2sW!lN8$Ku;g=i$d`7Eym8=lMDwS%6YU#9f#yu1lyE?LBLeV4R?$ z=({&t7RcpHNQQ~rfmFG=v@^)|TfjhQ7riWEhwnn8LDmjic1Dt%wx)!|BUmN&BI+c} z!;J>pDf3e4l*C_>k*Sw)oM~|X@u4>6@L+X^v>>2g;fX<^l<}b7F?+$9ue{VEk+Lf( z;j|L@>H_eW4Q^|Tt{=Cx?5At^PfrM`ePK-_7;)6!SJ3y`(e#hy(VQ>HgZdJ80#NSb zSZZ3LSAJmqWdXw)`>m<{c}HleiOcu1e!U5ZPrYw*)eL`ZA(?V7GVpfTRA$IWvP(bA z`z&OoZd_&kB$Mr;w)(q=lXt8tsPod%l7~B;?93IGR%i45b>RgJHRN*t zQfahyib1U-Wm0>w2~>nIZi@>*#3(Thiqrjsra7J)v^eKO;62P6Z+8g^CD%0 zoE%lAlh#2%h}^+DAFl#5jb-K zf6!S^|Njl{Z||OSVVh&p&@P<_Hp>`RVPU`H#l=SxNFIPo->D%}r8Am&DK2BcpY{7W zxy(bM%|9mUcX#UP@`2=`pyjtACTg4LCf&7PIrLkg{P1ybnB}!8M%*~*7iGD+g=*>g zvI)AWW6Nc!XXPYr>OH*%QRa;EQqR)l)zk)nTaH#a7{`G%|L7J^-_3IA)<$}Gt;2LY z@dqw?MX%9gX1U*xTY66k#Bz`HEuK|itQNDz_SRxDiO-%t2ld>N$G4Mhd;z&DFwjH< zeot8ZrsqIPQvEDte^smWiVT-H{e3KFfqdxIom1kmzcb`!yKELgNo^@|S>jEVU}IYP zPI=nhqQ}Zv^f2+{{kENm_0RhlOBKaZ!`hR%klL`udU=RHekoJjwOMd)?#?YQY?TeY zs3VaJvz&7$XgF@$fOBeNtfXH$_{>c~36ITa!rS{^&uO<(ADAh}YRr9@0Th}QDZ$11 zPL5-0w5@#$Y1Fbv(QTR6wSlKKWbl1;sr+X|^<5ggac*32dM@9qwQYtkn!F=Woq4&r zT%8M+e5x78hpR(;82=;F$Z^373L@e$qWD)s&_q6msXf{9Xv)o%RAEWcoGR?Va-%x$ zAf5;3)DOz0vo9&-UvXa_u>(FwtdO$Vt)5Q3w6ZteuiBr~fa=6HiND6Q-ocoVkEbI< zp^P_nIxY#UGBIASj6fA>|3+?1?f*bg-w{L$m^42+{T6vQ-@VIPFkNU-7ia6R*8(AL zjTGdiRrad<-W+WYN%_bkD&ZJ1>F3fuTj1o9DAlNu7KjZMwtGdnl#=<;YV%@*AAuI- zY<>$bBzAHX;|lqNOw@j1mH3C|UK1&}LQn<-1{cq@8D8$50pQ6MFk1E+G?UX2HnF`g z&`DVoJESa%e4O4GNA&jf-P5lykEOQgjo$)VDbG7BI%|Jj*w(YwQS$kKAGYaxsG_Z{ zE%cwHtI_oCbh5~otS89;`VF|@O#B8;UAIEoDIi;FRNvF!ZkJX3FbO!U5_yT49lVRL&>}O>}_qJa*xQSR#IwDR#S7v*qO0Q0e<)Xr4Mru!T6^=yQa89Pui(8{r`d0=XJMF}P1 zh_X+}kS$+SsjRXd;t~|K0p*Y~X*fiy!KFIelR!Sv-I&}huKTE-EMfyhOtK$O6Z6Gs zT3(W$pMTn2`=W1Y>{h1WQcoNuTstC$;o=T9W5o(CaKykVKHZaa1IEJVIm&Ua%qG8G zzkU1&11>Io82zH9)ttMpC07-1KU&Dp-6-L<>U%KBr08?c1jJ~OaU&FS#=~cak?Nv3 z+rt)|&%h@W6TfP)werG|!k0knO=X}6^!H0l1K}5+`7=RWqNN%Kckdkku50S0V{MaA zR9{gyZ6_2VnlG=Y&&^t;M|69z4XX$?71|89Wl2{ioLmNY#xQ2+0;!x1|MPYAYquzT zu!t31z9Y_jORv&$G|dWUX>ML@P<RELswb!E^iAFlV$u|nlX8=N{ppq08ntk zV`8Y`1y+MX3)c&PE=@d$f%ktIUFe8VuZogbp9o{%Q}C+v#s8{HC2oxw>Ev(A!kb-| zaEp%0%F0pfc@%&N#e_gGQZa{FQNgg82H~Mn<3`7gF(odnal>9Oh4v#drSeT$Oi=>g z1WBjc)v9fUdt&ca_L_Ec-Zd$&sn@G@bjVklLyG`8)5*N48P|-rltW|96ZUy}lwncR z(=`s^xMKBGZ@>Ym4=tX?#=Vm?>xgZmgT*=Y{mg)MY(bj_B5+)WzUDPN?^1M%kNlb+ z*LYuZ+w%TJS(X2A!>Gc1XC-|QWh3HfWEx1}`WpCT1*bFNlN>FdW~O{B_5KFrsufN^ z@4hGi0DLMRgU(fDF*CZ|ASYPHRfnmn2WbNR$)b{2xEAny#^>0$2IFwTninghKuz2L z9#DHe7~4!Zrr6Hu#3-2?S9E{bkDu;t?}%WDsdVvxm0p83Q5H5Rcje83*iR3T;TWPh zy9#OsdPhC_(r|g_L6?Vt)^FFGo;dP~?sSEP3RL|)7404O4UvhZMBEbJ`%HSKg41`a z=g_YZ&}#4f9vYT0?&Y_kHowMk$n|9!Q~aVmNLMx$D2z200ic9QhHgUNm|%IUOVu5@(=&e_lOv{xjeMo%|OM zTFgWormk!f?RMiJ0r1Ljr)6bT0iD9km>Q{;0c#iFg#%wu{ir zdWCyy+J^qvg7KUW&0E4pW`TxwZt=dvU3;sStD00*RVDV-wk;S@NwbP3jflm-iAO^K zE453F@b+ekA3a4KvDc@P`MtB?SawYr5H#?Xu*TVR*LvVzh8Ht7#2bz-Q*TbCfNY_DRS&(XcGe8=~s4pI=R5MS;(jsZZ{V zj!nUR+G5WvuB|ZZG*gUXPg?cg{{EA#^1kI@TC;igyu74Nt>cXPfXL1IK7PIXhl?@O zO8D3m=&3TFlc**FRZO82`JAuirF&}ew{NS--@C4Gjo}{8#nZg!h~aDsS$h8j5|>&c+A9!Z4eWt{hbq?KjJ zudX-5L0TQq&30p0bJGzE^#U4s1m6t^q@3a^E7& zIXd<_Z!T;yj8>gdUtd3GP|5&|&${JZ?%X%{nxa9qxwAi#kXYny$9fX-?Af#6SC+_n zZ&zJRlUBJ<$j@7^N*dh%`lPO0$;DijmAo!eB+rS-jY_hK_m zRk_bM_lqh)o$NmA-Q0)9EA^cn*6&mhu`SkAdUQ(_v`MyRDMGO?*Hw*sgm*{y^5cq8 zOpvkMiIBu`s1Lq+T+xC7Y8u0}(QKe~H^@DDcd*5mOp+{h9qd1{`gFYW=X+ags$AGy z?Xi>s>*`0Dzw~PCC;bjdyK%bb6ylU`e_oxc?#zlpC!>6~s>x|?znBXok;m)d-I*R+ zD32`(`JDJKS6?=I6u9JOra%1Kbr+Y*y)mLQo6Y7iQ9xmVvV}N4-DU#D(71s$uA!|p z=#mWH+#Kn3G^fPm6HF7esMjndds|Kl575H}2sBZjgLYqUfU) zP<`(e>eS5CI46q`KC+WE^R4<4MJ)SPXFTlaXC+~16rHTEpnfeZ;KkZ(%p2#1oXxnf zcDfQYpZn&-{s{qg_ujqB`*qG{AXm^|pR|pz$q=_^Jk{+d%7)l|t_}Vpco*>i8TrncR?vcp^lK6$rl_w45Ux@TfP-ySk5c&~xI$Ksu+ugi^r z)PtGBZ=?fBF(IMK#nf7)_McO_ymyn3$?CSn=&8j;9hDiQ@;3@Pj6p#`0ms8M=pLZEo`B`09)niaR&?;&Ik$h=X_3jv8Y?H!RCl(QvevE8vUn2KSAo z^>NtW3;{3svS>J{uIRyXlA=#@0+nr=4&5{aB^GtuZr`|b9B@4gMDr$DPZHj3Bd z&8PHqlY7xFEhJi6j&3+?teDxf<8q9@FHBQ&C>hqw3M+jeKN0(vy~k+L__I4#H&6~| zd~zl$tHM{L)S6 zU=a+;@~aTg*7LQ^x)$f{XyEsTw?-~i!u@d4icBZtDO!&|m`1SqY!(zqUS>HkFhV$U z@l#^tGmZNZ{L zLk*0chbY%s;Pd*YF#Uaf7a@;BG@iDt3~3g;%=|BrQe*$nOEi^Jg|Wmn{f&ut@v9O8 z9Y&B3aNC=(a7M|4HCM;!8iIwD6{30f(=9=rd{y-EK1-FuwEsx{=Zv%mW>YKa0lymd zq1}y8pRJZ1#}Eiwh&P-PP){^>m;3K7Wij4MWEuxOuICprklNS@%8Ia{al;+=+S*z5 z{v?Tq2E#>R8}hfEXWZclT)~&W8pT@5gq?`W)#y>pO7v6ikK7<%hXvc@TMg1T!m*=e zrdh%m^6`e?%lyZg0>=KSeTxyVnrg(JzCk1FA^u0u3UmNDvf4I|cSh{4`L7I9u_v{C4)3T=t%Qc0~G{qUMffuqh=ea*F|W1OxcVJpP+t5 zQM&02-KN{PvFM$Zo}YGm8*u&6LRqEN=6~xf2!gV`LH$jd6iK*;4f{*`HwI>ik#e(I zP|%OIMYV*y3xq8Tw2^*y6w-`S;BE zJxJ=N-0qbj7jlOh4g^RoStP0_(|iBM&iGrEq;5kUohqlfe>`3HseXJ_Pi^qo8pQyJ zeb(GM*EYL4R-%L}t#@4k#-p>l0r&xG2+BeYQRuxMWjEzU@ZMinqDuaO^m0|HG+d9Z z>iE%A{algmp5A@g`lOf`*BST2D%)zG3v_pRcs}q(8^axDvb#OBbA2J}PS4V%eJn}G zG*3yC^bYiJNf+)oAOBTPthHEQ=!URu#eh=IfKjOYZS~ixqXolPoEbZ|=Md@cugFKG zrftxOjW#-LeaC9Z2ot0K+7b(b>V@*$HSg4www*YU=pHvxG&KadTZE8_5*?JpR%As= z)VwG0P5rnQNoJGuV3YEEUA3;qMvFCWJdrS95R~-7WiQHPB=vN4@sL~@lTnnev9A^G zSYmbhc1v7*6o-osItG&VMcmap@ElDHyy+1AbE!9gmPEIOzLD4Jf{m-FtULro!c(1i zv~bwwbA3SL_S-5=7f+*m)ztU25B$VNOyDzdJC>D})3Z)(ex_^o4g}pQFOM@0r}*zv z#r`^1D)*|25+#3U``^?12fwRgU@-fCqXdPLVDNn>+OP5FD;4?HJ%3NOo#RzI_oiIX zb*#iNcr$|u>dCwRE&+O6d-b$eR{AfhJSB#{TOn={a;a#qm45RFzDF!7@%Pln0822$ z4T(%Y3fqWo;bTb#!?A7&%+pxibVdj}`#2ykMWdGeF+S&+47nBI;Gmr5LhIoZ0j?o~sv3cx58zTiwaZ{qRzQT^EM93i+G zdQd9lsgmVvBEt$oemoRb{{HoeM#ugsYE~^5E_Iz-J~>BMZw_g6*T6W#J>Oi6zT1?e zi$IU*>$ezX=fwhGoYg6xpvR4OfaO<{1 zG+i%2JTOx{+!&X1D{xkoecWFA`aAO1W(``~LGNPtIOZQd1hVwKPIdm%fl8J)z1Hte zeSIY2#8#1+Dnx{FVTr$_vKN=a`zwzAMz@V%WQfqrF#i8OUjH|Z#gBJ7A@dR(99f!K zT$%;_sgjbVbmG~D9v&Xu1dSw|pU#fk`kw23Z78~8C`%S-b4>xz7)|DC>vC6OI%)6f;82>mj=q3t3iH%wx6o<`YSsfR3wC6`J2>6wNwf5(&R@rjBy6#ZW*P< zKCwvhVs}ht7`HIbb|4-40+~(L-$=^6bQePK4TPh*CvF`!(iI6K%B``>lq^? zfOs42``?h;#UvIBr*;kz%da9+OM@dMs+uOP4M!^grBxTQH-RSoTG9He->*XGvFwuKCD# zol4n8ZtND{lz7{iA&h?9bnWXSy1S;Da94hr_ZS)XrTTd*TrR%g&l7hH5vpi4fWI2! z^@Fvu{%qqBH-rHpd{pM&SNTZ8BEsvn(jLy#L_V3;Y>)Y3_`q%T6Ol;#%n`yZD(SIl zP-$6`|Iwg^$fEFWF(?aR7zdIB`lYc!k+Qb}@KR=&7098mtW>~K zTO;QAASbx3Y!OXURu&eV8{3p~#hVh4=!QWV0_%&`v{Xq5^Ef~NZIA7r8FKTV9cR4n zTn(+3_L%jf`?w*BzAgn?ZEY+=*j&)eQWP+0MoxIL(y*3_EypjJbF+cda5jGW?8z_6MQs737R{ho3G7E!aVc8qS@-cVwdD9) z*5-X9mK5w}0Yd8kS1uc82s_ubxCv80JSP{X9rR?0Y z-u81ApDL}~Qf_kUt(g`n)kXO0*cRADZ)~2DgIqBguo831>~~H5M>aSWncs)A0lKYeG29y7dqY0jO1RzeE0^l-x^EqCn3uo)P81Wa zaGW`In68QH5fH5%ct`CKCTilnHfhltA6G`UN{{#=;jWCFEHNCs>VdXHc+3THZkVUJ zJWLW@D{E7}ctvLZ137#H0CnkZZ>^V?*SIl!i9t67-uHm5Er8OUv!mr^2_w?jx&?^c z<>&YA-Sb^9pkCzH00eGNYn-!+881yuE|xtxBJC`6a&1J@VL6{k<3h5$6Qh;UiGyp)h0&Jw}< zvM@UrQz{_rF1n|T$K$gUNyLue-7pb{gS&I(OA~zUttsdhGDKSm(@g02m-eLkU`Z<= ze3@Zmh}qwLLV_Quc%z&y3(lc`N+M5=Rdy`b+tZaf04aK@xr|;RguMx5u+?{ww*SZ| zw$E!4&LkK{_4T$s*1aptW8iO@$Er;uJ%DAPtqfhc8tGrWbCO0KKDLLvVLG`C@axNF zBlc8=N`$D2>rnMiTJi!!cW>Q&6~B_+Fu=DLi-_2<`gE*VvSs|o#UyWqqq`fQH|_nZ zL^K`D3ZsR+aEGF^#BtBcCxO8}*ros-#sZT!tP*ZrQ>Slsd}Jo&$r@8`G?$}YW26&+ zB6(z6GUe5Bn#(}!O6vc3(zKBQ$5vKUR7CIpb9NU|mpMDt{7Kw-{(Z9Ju?ljsa1=w> z)cys#_4(NkgvSZdtEkyWN}|4=fbjt(EBk$?h|RCfpK^3jqU7ClC2BhMx|-Ak0b?Ba zsrP}nt>$5u&f)jhN29PMx-d!rGQj*nWWZ6*GoT7-r)PZq`n#FnmJJ=n3d6@c1gTmDcYvtW~X1qHDu1eo7K#CJnjlbY?p_kV$G zmP$gpRr*MFS0J6tJp(~tp)?`{eYd|$w)!@8NCRfTwvgjT9=#vdz%s?H0{r+9Gou8F zxGw%sn4{UJJBkLuE1Uy-4jDJ9n~rc;>5kzx_S@b%MB}OEJ6<-YSHa8*uGgu;aB92QT3JF zs@D^W8{PB=%Z|1OQoPs2ca}pS%|0us;|TtD*1+DLfF7LhClgv??8b^2N{kctDc0Fs z`v0)^)?rnp?f>Yu1_Xh@0F_dZ5Cv4EQ&f-=5CQ2173t26fk;aUNP~2Dhal2y=?3ZU z?sG5a`_A|0z?|#+cg}U4cmMIuyt7&BiTl1k@vLXB=Ve=s7aw_sMwRQRPGF$x7|sQ0 z&ypvJ>vIJ39df)IeU7G0976z??j4M)U*L8-kV5W4)18J!{pOZws`z)x$IpH$HYi#9 zoX(lOtz7?!p=kVb{qnLy={p(r2LU-)VxhX|-6dyls?Lxs3fY+b?M_idet;9`h?im} zPm`3Mv+26XU=+%^Hf#eN!mK0ahKi_o28oVi)%4Luy=ifG=xq-RYt=}#*G~U}gY@jv z#I7(B&84esdGiOQ?iqS^6^l=Ye8ITeJ+ZE5K)cy4wmX^nSQXe#x78+u-!eE(GJ?6X z=7Ez$O|5m~w-?g#-$vGAfI5?v3YNnUink&5q1;gU+>sduLGM6I=FPg&50n&}j8K_;kLbaM>aFq7mc`yU+lJDTLu2@h$u9wzmF?aVoDq(;=t0#xNdcj?A@=Ucfq$ zY(}=e#kj$P{p6Oxigy=}OyAfUf!Us;J=_aDjN>qWRO? zvssvZ^O=2#pRc;kG%9D83Iu%S6yMz_J2=fy3j%1kl%_#eoq07qGQd4;q$OQFx(#1X ze>l&+)~Cvg$3m66)WtUDX=K$6B0?4bM_k6qa|T1Z6ImGE#{&WcYakx^*4pmxZLgJ1 zC%RR8Q4lYb^;<9)l-bN@^KQ1sQ21=0^Oj;vR3Zmy^sd<7heGm7(WL z(^$8<3#iK9H-0j2aDPL+Qbn}?Drxyb!9?tj6Yr~#Wn*QtX4NMIUxw7kWpqfQPYvh< z3nm12svcCQhh2K?T#&{Zhoy~=a0+I zGOM&`AqP<|R(g3_GSbs4?R5_qDiKj+W@XJFWO_y~i%ReeZi!L$OKLv( zYh(^qn6@7Wi!QpGenzuhOceyKSd}i{z_kJwnLc5c!A8^=Nvog)=?|D_EKl1!Uh}Ezm z6xlLlI5ist&vJi@Pa7NIH$e}DLG*$COJ2hkL-fwhBCf&&vtgNiJrRS&?tIZwb0T}( zDDu<*pEtjrlOi}+aU!!mwP1VNZ6w6=>U|aLyoQE`#b{>ctnr2*4#R=IHs^PI!HXXk z@4NBHfbWKYh9l2_mTEdx(U%PLb_=?@yN3v_?6QH~V;5YT>ph4KPW{Ybx;++fz`A|C zDNTia)A_CXwA^a6Om)cq-odjD_sz*T_F~aWQa>?9Z0CGrMJ=OxUau?NIM6Xx;=mX< zdnv4%0^KuTw7_9LJ!+)|?g|hF;GL}E*y3y!6V5sL?5(@{J$9YSiq6+r$mMxr^2Bm` z64zNe`;527CK%;2**Q!=f;%bZylk)ZM$h+kCkXoq4+Wx|IEVwrYY8~M^cF3YUI2$A z`%RbFncT*T()-zjW^Z=)gr9Vi=ZSOwL%&A2y10#>a{x_(nRR7f+L^9OFSm7cDw*1X za_rn1)eH9O&{-3{)RoDg8ipQnk_$8M$N=qz2%K9!-1JSKS?uTgII1jo*V;@wsPNYU zHEqh4>sE{x&TYQ|KUEC4^6tJodntl4o)LJ;GLvLaT3g;4_3=(dRN~;`RtWFEKl#%j z-`(B45`SiYwUwZns=siJuF<&kq@2={*NxOkVxa@%x!=&IS8|odII^WqojR4U)Qy$4}^ zXG~}K_Km9m(OdJ4v);V%SC{qZ4WEn~S!^G=LZP!_Jo5dTkf8fT3!uIE;uQlR^peGj z8&M+heTqN7dj!Al_2Szv?hR0NST7pfqmg$epK~G}@Ia|$DU|(U>^}=<9rhTDhFw)t z)j7;2KN{ikELij+$AJ&VFa|mkhufGpjJAcp)V#@?ZHWHy^Xmy;bF24BX{FZ&4%T}q zx~(TvtAdBfibj1(m)hG(x5kt9_awYzmCc#9j#mtuzN8`raIf+w@n#}mgJgSia)0x8fTq}9E1`IRN>c9I&t}AZw*~i)$g|fc!UNfj z?XnBza^#8tJFA03xh%a{#jI991TX=;BPSd@sjl4NbJ*?D=tcu<1SngGPnEszNoXak z62xc!`2$&88IEi&-61#HTifUWXT9xy7@M6-*g-(|8z{C32#X{LPPfHfxvB2Ros^ z++iw!9)^8nw+;I}l#o~$_jNI0%!|da^!~~8uNB|g zfJTg>6w4gmjy_tB&$qd<03ye1xmH(Do4C+%aBp5B0ju`MenSX{JwgoV5wQ?(8|!&x z{X{m-@9{{;tbRr=HMtQnkaAo71bOTltzF1h|uZjyAY zo$Adb<6!+ zf0gNVF~9bC{4jtvYxeCbs@B*&c8A@34XiCAAM{KLfzy5arxrq_#;XoHWFeeqbyke> z@v-LEWf(|X(n`0-wY<8ct4}9*TWEfFCud(=0%mrnk25iRT`3)EXEKP5qEB2?aZYxe zI5UK$Z1k1F6>ofE!uery+o_es(<8U5LqfLG@ORGJwtatQ$3CCWo3OxtI=4S}X)cd1 zvl5@{0*RL@Kg{jm{`!Xfj!ORPfGv5xv3=b?dDm3D-1>jBc>LFVEv4z{>0kbc7=oFx z+#2gdtm36hRfD^r{xIAt$U3*d-f`=DBKXeuKMj1fylqFH|-e zjgR(3kipc%WZ3>?TYPuA`p9!r(Q9Xs$C2{?v)t4C2QH>N4pZR8y*#MtIYl-Q&oY1R zdu53i?{-V1vxS?8{@T-oJN7FGUA_yy=&)w|hy3j!|AmqbhX5s$c1^F6^A?Ol3COXh zMGNFVz)>q^cNwpxHS6f=Zp_&ZG30S~eG$&WexzB;bYQtKFjKk{#5G`WdDS~zd`x=lPs#>*aUn9!oU6Z%>lDE^nIopS6IprSCh^Xr+sW zefjbh7XHsok!=FTVYY$6b<|(fcIFfZtS3eQ`sP$@a}-C;y|*qlpUIU|Uc-Pvii4Vq zvFllk*I?EOWO?En){&r#IY;iW>9mLu<6(Pr;d>>?a%b7VWfgRZ%^H>C^2d0LMfixqnRM`}p46=%nNTH&&4(CpbV&ym^e*C?9iUTYA>4&)*1qJ2;8yjh8 zp5D^Ed$rz1W_V0A$$sB=-f?IY&CxHh@YR)^ns1x>;KsPUGA+NTo`;QM%|kLjaN>** zxpf1XCHG~8Sr*22V4gIAdQx6>cZcn38v%N8V`B`8_7f(mcGzTk?D}*T_d1@p%NWV3 zvZaFaFPgU*Mi?{$w;~27?nc>GqctShpa!3%bk9Zf9}^*_!kh0b*C?{rI`Dp9oPSpI zKuSs~TYbP@eSK1W<$i|l#CB0O#$)qfd1VE?H*;dRk!!(@dyVU3eE?JVE%m-{E+c?_ z3TY~DbsBRA)ty75Opt?yg?&pyIn9?>r}$(Op5$1}ae7>4k=M+ZNjDj*15c=w{rp~Q zY@=R#54{M%$ajw*@Kn27rYkEeCZ;nTNqKAdT(ia9Bd4m}FYR^fQV^d{K4aeaS&`*s zn^~_uiSq$uyO6fu?uni8;Iyc4lcLY>CQctHdrb(lQIy@$+l@aJIcYW9Q8cH@74_sg zz59Hjl>pt@OUFsjk{x~9~#o~{gv^O*yLuaguD&4dG&1=8+&T~tBe!ynteWWi#wdvb6 zY0r|DX`-8f6#KQcih50aTS)GjGIIXNLae0CPf@UTjZ5-B>|1iWNb z@E%z$r~k}N#0t5XQkQ}&)TX+Z*m#+sQ(c);ta?cMoq53@c$YubUyx)iTGoGExjg`! zzO~k=X=0Md@;rUclPfn-T6abDs+uUvtMaxNgA8~Ny-Y8&^cUEi{1Ss!-csIg31=iR zZJ=gI9DR1O_XGVnM`cTlXtl=o(rY48mfJ`h%ZVpJyGGduP^Bt4tt^CXRUZtrZreWJ+$Gq&3t@`L;@ z!smR#-4{S8GNxuNaa%XO(=r}l;Pv`#m4!Yd`%zI+VB*t+%$d}bN`@Y6@PU?n#sO{E zKhJ7uYqRKows7G7l4D&YDM^`&t*>tB4hQOjyr7_9{UOx|qo2n^`p;|AEiMrrbvx7-tbchM^_PEpP4$1j`0p40 z{o=o0{P&ChCttWF$M4!5j71f+E>k&*=*?#rf2d1~zjb+O*Bv`zS+UUQ;Wwfow;|Ic z*?MS=M zI#*OgMc{sa3pT2Y{S(uTwiCxuW6zhns{VOhq5IM2*RJd44KCvc zwUHzlwj}kHkPme_b!_#Y7~ns(Zr7{sgI<>q-)@&v4GoXpSg6_6*HTiFzmG-qkf(#orBFLr6ek11(q<=#yXz3R@f9XR zpjpG~B?kwi*|Bnkoaf3^Z*a!oST<=+mB`2Xk^ z4`omK-;?dYpp!sv6QZ7;ad|*_+!2R{kB?9OX^H~N;iETXseA+KkZobLluS%a#~ocG zA>rU3*NknJ+5WQ@Q0gk&cmJ^TsnU8Nc}XkftgHVGIoGjMYAYhwpdy|=!X;)DBWh2Q z^Ez~eBa3&fXpFb7ukX!I42nd^X~>^rL<4Btz}7rC^w;H|Yer*QJ}_Gc+>}3itbE+} z(KVlk;89PaE(nLzDwf!+9S-L+-(+lh7j|DZ{2&O_=BA(9 zO>;O59oKHW5ut1v4ZWo<0R3=;0Mmbl8fKM$1%-TACZ^Neu}-)b@6Wj*>UM8-vJP(1%OPBP2B+wu)T%)0x#TS(j2V;_fp z4hSH21vmCINtWS={y(5$@~@pQS_r#Yx-(w{BG~r5H*jR9Li)GHcDZTa&TE<8j@s(E%u7wAvbotuRQxU^f8~v8P z51sMJ4!a(;IY^vZvzZPC`Ql&WL!qReN=n``8LiQ>|8WoN;h`(adum5xe7ZHgcyfDQ zCP_Ag^Bw#;=UUBI^jCT2jqoE22bIRXg?&{NN{Jb`ultwcX#$zjZ=yHA+ z7~)no1VcVcC$a{EK`+(W8^$B0|g@F>PLw8V9hQ_axS&w?J&2$n}K`KHj zBd4){iHQq$-~@a;->aXeeCWv0|GidQTRYUE=SA&yvk*mNeZ3n>O&X@IHtH8#HtIrl zpZMd)+^(2AtoZ3rE|HxG!kK?$I1mi{SCUo zecxQpEfmhAYW3$C4j!4Q{0R{M7B{N+PmIbo%@2vkCMJ+SQjGtxxjS!JrkJ7eFg_2` zTv~$X2#Tu{fV@@lrHUc4;X|0YR|;|})?~-7FWE4E=)Ga-7R_--530Xeg4I7mvwFaySHHGUG0%Xu!_L(a}DWdWNC0NGRC#ZryO6Unilne*UW`rBJ6%f9MVrTSunKru3xb4JgEj`2Wkz zq7a^9>o=1Y{4Rm+;@e%UESLx@(yH~rM%BqsdVhd&kDX|H)9uKOu0X_k^QqF!3DU6a7M)232xoLB`p2;_uSk=xr&!GPZn15S4 zs_kap#4!p#TPdi2jWy9%}2e-En|7Q06|tWe0l;65LDQ4o^KD z0ZhG5D3l{|+;L_YyYcXgxKLL6?N#{Oh~vSW<}br}?PJA)eEN!~6O%mo_BW5X2`${D zBGjx!7%>z+Yi$YA5?piH$OIpE#QXSnp^m+Tbc0(5-PRP0XJ%$b@^`+!=!kON@`eOW z6Y?VORJK&s(b0+5#e~@dYCCLC#UU{~wX(mnurby8E4P}Onh;#T=UM%6MBn7@SPSEZ za#@ycjR$7|$dp(u4QF9^cU)-0Ag3z-;^W8URzF`ue9^T&)R9fKwUBzYJ$Z%{hl4mK zPQx@c?05nnF2Dk~rI@a$s8BR07$ZP$RxXd#Q=#ahA5an=FR_iKZXB=E62P6o0)It zBz9pceS<-?7J?KsF*QAczoJ2O_te5PkAK!ZEX!9DW}OW zn`+_PU-Al2v6+GzsnB^Yky^SvUC&g;-5q!6o+uJ8=xN(&+7KfcRA-{hje@P+6^yg@ zUw~#_TeG=!CNVwz)^W$o9jFN}uKE0{_upS*Gc`4(fVuzY3Fd!&Sb2krzog~r_ww$o zwn9?tnwY}O#f8~SgUpeA`tH< z+N6=AoJ~xZhO5vAJIF?t)zjx_9-tP>w3d%c(txVvoBHBw0M&xnDj}PV`Mu2%FTknC%?-n>J+m=83#iP?^=cj*#Sy*Vsu^_}PJEis0%SlNZkH*O zBwOn})fyLWIbaQF*i68;`{%Kb>&U!h3j5L^Ac^F5vV4{g71W?LU=dJEaPcPA;d@^? zec}yEufxt9h5c$X$g6db@k*Im!WS>`+HHOyr1FH>$!g+E0>w*+ni8R5Lg_IBciIA4 zz-VvWyea0{mMAk*fy)GWrF(d0o}Rfxm`>#KU>KAy8M~2MwI`V`)eX5+(pzf$UgSJs zz%Xy#yuo(N_VZp^x#U-Xa(woj2rNzp5H;`4Y?kpALy&3$_pg3Dd;%u@`Jm!-e2}?i zQ?bF|$Vz2X6sU!WZay=r#A72x?=DdZx_>}D5;eZbggSZO8Go)lsZ&3%KNo;?^wDz) za+}FWgmBDfI{rS~aX3)y#DCTT{%*(7_1cZ&B9X|x8lLs8V8c@DiBQYOVcZ<S6>$qu# zL&jxsgc`sRen;weFYa+Dr^W2%up85W<)D3*E(V{9BDp2ZTAlD=RR~JB19<`vcJkeueFd9Y0v_-2x`9)oBQ z0^&-D3#+TIzd=uLqv?NwfcsWo4pUX0PKd@E!P4k*EcnJqT)yY zp0n~#+JJ@_zJpy~30@8$A**z7ceG(v!$6CYSvrk}l1x$u2;u%B%LN2m zK*|JiSsGjnxussw4oM4Tgp@jRc0yyL2P!`M&Ye3xPGTyK47GqJVC!pNpTJ^NDP|{6 zRxNX2&m)*vJaQRAatl(iV95Vt=(& z0=+rpoG`L8Ut|ag2yA_Dcpkfk0sO_UdOsq~uY=-1rVD&PbVS4z_p&k(Um9@)pjE*> zu;_Kb&CmR221Q`(7~gX1QAHoSAPH%t^uHSf+a?LDP-m6Tj~NA8|v$AE&M@~ z?z{u7Fd6X{Mn;LE|HAH@hX7KjWEhHVaW8D30xjL*pqPP>U^Ungx8Shh}f)Uq{Nr#|D{Ktx`HlTioNOu5a9+3gt??a!+nlhC44ojsL zUon+CHqD2?EBj@X=RHQxV1Bi-(Gek zcY{9|@#IPc&wWIc*0pQ|PPG?XuZTkbfLg8Qayr8x3z=C61tcR%~U=e&1opiMSL7 z*R}**0((ed+Hm_9vK;#C2SBVyKeHJ+EL9P!8ht$lDc=Du?qI2!g0{Lk)nuiSjRMpN zkIiZqP{}!$2Pew~KY4q5-~1)eSyPN=?GN@gRBfhW09S009}ZcupECf}0fXbRm<{xg z={;ZqtY24%S*@N>9;@gRT2!+Ck!nN&;dYUuGuSdrsGku|ee@nB%dyGS)h z0k#}hlMZ4x)?mkT81t7KZwT_`902e!!taCF8Sx(4-|^Rq=~IzjgQ7V^d#rcsqF0-R zAZEiqBJZ!PtW<8UPPI}fY3KD@a4pwR6U^k0RqWT=k>!Ynz}vM&-;}1S3GxjcM&zRTz6xk?7$&oL?3DznTtw%F67tbM>Hs3 zGx?6;p2uaDeM2N&N)VA&wz~{fRJjQ};+*m%Nj3%KoB3Q%4yeUTmo5?hT1+YbF8%cB z-Is0gMvr&KgAEy>bk z!zbs9z7uIi-Cn<_cvmW#h9>t~$2TGtn%kGFp6}kZkn&c!;Kz6c`_aO~y5mLlmi+9Vv>H%W2??b4Y<&K(3bq*Z%;=itWgAVIo*pS62vi-W$lFcxyZuh(;mzmHhJZ z>gwwL-VVatp$RqEfP5MGE!H&MV|b z#6XF%kOrta>y(_FjO|#G1wQ^BG(^Js3No@l7U*RvyY=x*XPT-L&V|EZ>=<>$ml$8m zpI(NOr@AFZbP!AqT;CYZ$CvT4)`uF6X$HO?F~OcVMOU1ieP9*^dVmVGUIV^q07J-` zR3Iyp@MH{OpSkQ-g*<~J7T(TZ2mGLKOH(~)Aq9QY4IX3%IW9@1gfjynV2O$61I1g$ z;ABAqvl;ZUACKVIuJaQ<4_<9H^~ZtT&RibQ{vJ%@sDcb|6EE=d!eE(Vo`LZ;$D!u< zo6nk@jHy@WK-PD?c(mQZ%>(DtTw2jAGxQ zzmO%vLdVmY!T~ujuX+q-Q1B$b&*H<+bTy-==(-YRl3@HLKZZhh?QK$J)~4G@!01it zlUsDDA1j6R|64tWoTB9c=45@5B9l{JF<(>4h z$yNfM9wcn|m+p+h5?IF@1)G(!E3oQ!^i&Tw2`)Nr|28C?8RT5`Nd@%D$Ndg<0hJ&TZ;t1gX z2*2s!#5eR7Q@MghUh2jyL>aOHa~KFB-pG*rchHc!FRaD6tJ-Qsq4&0j;4z zocu|fxU3d`f>-+qdfcUwj`-%Y#SK!(Dx~TU_V;@83@LPFkCUp^`Ca#=)A}_G{>?&M z`!W!rX8GRJp<(W?_JviUlTP z*lGs>pFe-5(?VbuD+E&46Iz9|mVs3x~xZ9Zy{d!Eoy?5BWdtE41s z2Be&3lRv+{t@fgza9%M0h8Pq?0IM~oYx-G`ogi{sc&-Hq zCD*0_6#8iHwZh<5BrV_&c3-7Hvktj|!M@xkBR+E~#(;eOy@)HGs zPeY-aj;y z?AWX`FaYi25O$4kA0V7ein%up-%htDIg=|)#vz>ksyp)t5PK~^!z5W;7r->gCL}A{ z0TTKB*t0^j7kz5L0GNq*2sDgu2NV#fC#Wgxh?8#2)|CN@C({qQK=XY4J{&b}BCGHY}bZ@;~jVPS%EL{T3Z2eD@$3`J>eodF~2K zFZ^!BVyY!ZslbG=JdeIJixCeONmr2GCt--q(9rWNk@uX$X&kEE90T zIYP!=hdHDpL`cBS6H4y%Ihr#V+Y+rbV$ngscq|Xy(_HofZ0$k+v{_-quxT_RW*(n;YTP1En!j7nNK6cWt&x?E(FH| zfgSsCbee*p9J7l}JB%Lg{Ev?U~hpjIWd$#5**9$zQW6gu|NT9exX; z5NR{lU*hP{2VzAnpG1l*{UQrZP;VxqHA^GahTWOe2Dg~25%&poOkH7JWIiK{fJ#JQ zOl&L-&K>L5_J)=3@c>JJ>7Q66MnN zLrD?XxTRiELn<1;=s}XKm^Yt7ik#&E@*i^F77#o8MJslM)jPxB2UoecxQ=(xLQyl* zSNmO;Ufx@N(H1YYKq^FL{#4;}2KnKL?T_9)w&RjRiDy;m3* zQtmtBmzd;VJ)HUc>R)ENGN_Jsh3og_BbEZ1JA($K3eUR-_6vZrFH08#BkN3(V>;fY z2eY@cg+Yh;_?%@rJ!V%V1N{C0WzjlZ<%R?TYTM-;t-)X^kKxfprE{`TVvRFNnRlhMzb zrlv4Z1&9jsB;DGY2%qSUg|tPO14`c+pRA>&h0-zf(Sxh!OXK_uX$+sy;T)s;f`CH^ z`|VXNK`-(WqoE4BUQ!_J5)+6~?5!6!A!+YjETzVp9lsnpMp726ryixNz4-@f)^_Q^ zD*3AVu#s=Q zF@o#EMyZ8!fqh1HjOBaG&s*pW2QNS{?*6W3ETlztrFk4r41fjspHu+ALC%0Nd<%Ng z5@-eL3?>PhmObgG!K~ZFeXzR{9isG>r^&pKTj=CR&F)O?XhDz5fQrZiH|_dQ#ds~P ztwm;2E&r2*3DUI3Q4xQp<`28xYR|$FwpgM8)o3;3L=4Ff8D_5s+1#mQDxPh5u6d*1 z646e-KRQ&i1eq!l4S)*0bN?$xp_Uu-!~twx3CM90wWyyzn^})M3wc?#?A4GCJ@EoR+A<2bE6wLR}GLrs#=fv6H3xEs1&m|e+|5)E+8l< zIPk|u)evH=%<^tdE%|H;^&5n5qJaC zrTocnIT31Ey7ZmI_D`ojODPe<^cJ6!?zo7@j{u}^laJhC%7!YOwsK#zd=Z{}gix7g zwdeL(6zU@ldfozAlT zvH9OSn2rTBF{=6X%_#)!p%jn@iu%2|#dsiK&|nDH0Gl8ok%cVB6Kzos-I{oJW`QLI za=q?{Ht`+o&ZHJG9v6AdVLI+k!p68tibM?nWkUaBSl9r_{0HX|E`jWF{c1qnUDb$e zcX)jQD>gP3IAkyk2uanvUB=0fLgE46V)+RWW52JMIrh`~5=UIQbmzfE)AlAwtx(P`^3kv;*p;3rCqooJK7ryMbBem z2D$&2a;ti=JX#x|WFqW$UP{g}zwtf+4Tw>2l%sOyS=pF>R<`pjB;1=n--60<`F-+uz)`E^=?|77FHRI6U1?m^r2yMCl^+pU0qDv0GV?y`4Sro@-kP*vl5@HAuU=Roec#EuFo2{ zHO{wOgqkRA<2wSRU+c z2$egGA?cu$12pXaOM<);wHPe5N3tQ|Nenj1@$4)X-{x1qndn^&>k(>aGK(&VD=|#i zEf_}8(0h`o&_1>D{@<6GBd`IK=>&(kEI{vTnjjnUZrr$G7>p3xbX$UAo&iE^Kmpkj z?{v?gF+3Z6-z17&S6GdBu+0~*G{u)I#p#Aw$3ox<(}U;pM?4`3na|UR1^zkr>mgn~ z>Ch!M!-0^zd%!-RXKY5F|9W~=?w|pZ5!rNAnlzlz3uy2o&u|bM6*0;If5@c!J z=L>?Qz5Mlwe=yww)Nz*(t3e+-SnlR%Auj-1U|0ZKxMd!xa-mrQFv`t_D^d*_aZ}WoeKqHt@iZ{^sce6J+fTyNe9Ki*KhJgAmDs zoM+6|Y#<99b~hiKU+|$8UDj^}*ALb1Jfpcu9QtdGAf2LcwMCRx{PX#}1qPX6lPsOa zeMqpe!gd@K|7k*+y42$3y5jngriKM*^w^0%et)oEJ^)&Lks%PKDiD$nd?XMtOzK!~ zEJ$2HCMYezhxCLsBx4Ugye|WD>@e&?i_bY3f!*bQ_5S-lvsUru$0ni3vmMF6-kJ;Pz-G_W(TrkW8u82Fn&3OPSm{(t?IxN+&joG%wS~D0QzdM%<=H=9IFou# zg8TMy6kP&i;bauDWc$i+8%A?C;qg`aN;JROhYQSk0g@EuqWjCt|xTOpf~BaFry zgExG`ceP-AE-#mzUJQS8X(orx*CWz6--l5t|JERDj$Y?HxVwBG3-DFo=727+;vwY7 zLtA4O&x|6N6l7%$N zO$X$&zVH9AIWO`IEn2|sgtc!tqg0Ag!7{R`DOI@$o9+jQAx=;z`R6X|pUQdFz3fD+ z^1-oU3wRk>Fj$-EoG83j1;s2`qpS_pvfix=P>)O82(&zA+k8{Cbk|#m9C;pS)XWV! z8~9el`NzcWYO6$aNP^d7*=-A^(oGE@mSLx@j2o%>l${k==egQdT_dP!tG-S0VQ z%&p02ukW5@MLLb2CA;#CH3wMDXF3pKfP}SOoizS&59>m4WpPlk)Du>5C!7n&^K=lA zLgh{3p`2?`Zj7!zlqn0PJM+Kxr{MrVoJO|Y%Bk94P__5zq}i9ByW?vK7Ue$~#ct4* zesz!)*+4^CykA4*brUh2DE{j!Q*q%c7TwxXEnRaPWe0nX$4&sy?|r=>r$nezJIs*{ z;Vy%k-x~Od^LtgCfT~z00qYMFPXd}h-*_ZeB0OvZmz$b828QFZ`xUwz7ZWqqFC6zc zbh+PpH+p_~tbWkEQ+aP^1Jg@m+UwaMCWp7#gK=2TLLRNu!DaTKXqNYgv0`Ku6hssX z?3VATK+X*A&07w+elombcymx}0O%v#PRSEQ_C%373)!doErG65KQ#2JDJUq>W zoC%4@Wf9P*PwGAe1mOLjgWjP4Nw5=>R=WKXlobFLn4z)173HrS92ox7V2)r5-xF^5Z@M9x3}R5u7&|%ieSgC?;d; zj%0ZNG?)-=B*Rs6Uv=Y?ahfd*@F*=SAUlyzThGSDGx)cRvt*$(}@{`LKx z1)(CGQSr&Pgx0ydL0-Tv5YK7KMXZCYfV>h9Fcju(Qd3h?NBp+_yeAa(o{AeOv69g} z=m7G1DNiyk=ojeM?|8^lc^gkU+SA4X8O1IYy@q8a8da`{305jFDd_p)FMeG*HzE`z z$*HYB=v`nhl$*Nj{@dP-Ti-t>FRGRBB~mRCj5B_}t~nFf>pwwG_V`kE1nlpP$c?HKkLxLZgm zBnuEOg(9)k<1<#%=vwd5OWPZvICvH*;57P&5V>4YmA4EfYEw0fPla!(#J^UQ^;MTq zzj>!Ph>*I1((@*Kwaq0jUc5lgAO-+{=~n<*Tk}X2rKVemjx&gs^`}JPKfgh&bH>3! z>SR%L>uK}PIb3wdQ8>Cw6TyPT*}psabw#L4d@=BtTwKTk!)UE zY~gP-?*T5(F_vx)1JHj#q%>;Q6O4!wn9r37jMqL%jpAngkFQu1eGEbXNUg1{hxhNI z=qM8iQCOhIvms!}L+zp*8A|5c-r<{D6XD2)9LN?oRKyS2C8K*VzpYFE%Mi{HpNWYbja;X*W25FzS(1q6>V|L2>BZbT0c@J5f= zy%3@Gu@+ZSVOIW{24xW2c|_ydZ7yP?aE9Iz@IK3VDMQ(1k2!Ar%RV2o?EdzDk&w4{94Oy$UkX`+JeDT=+NHq2UWhEWk;Lx}oUE&USw&DiS`4vc0Bcb~Yev z^JOO6)Z*c0B%cBSEP9OoIq<+lLj-@Q7&ZHv{T-WBjX4Wp^Wh)ZmFEe7mQF|qPhH&X zyhXD}!-g#LT3D<{I+ORngdkf08m28obsnP9MfX5OTiI0sX#q!=!~b)+@pxHAN67PA z#ios4AHN3E;SN-qCo zd1_mV;zp6KiVvM3*sZPQG0_0VP>}VjQ?1}&GNIiEv$j$9hBeN|tqKYU#2K9q{`K3* zL!XC2$f!O(;%EpiCmDOUNN)U%&}Fk1!tavb$39>InDq0W{{C=b9nTxls_%Smx zgY4#jy8$h{t0=Z!0ZPcq%8EI>8xbWb2H_&zL}dQ{fWyulSeO^Rx%x@6DIhS<9pgX! z@zbXcR-vdu!*&mPip(lL!UtIM)yt5fTjxCU*M|Lab-+mM= z@^9|}`0qdtfBrj=BR>DX9>@zqRQW+&O-=q>uHMKr9$TMOp1~eA{`0q3WjqFbA08BF z*RxK9tVG{>k5%%YwE%2H7q}7GZ!K0@R<|QBu0-^UNP1kj!>d{!Czs`n>adm+#f1+o z(<>O=($$v1b7RY6t%k)*p4g62S%cD(A|)8;)da(gO~8$67^jsFo0|Dzo6mf!X8Z|y0H%#`du7@jRw)p%3T)cx8a zgPO&Fstn;y#*HqH*9zvgu4o8qJv#>UBIKu`*O}@mr0Y*F}C!Hx~&UHi{H2^n5wZr`zMDZrHT|XPAz9D;HWWoI8f%pIV=c-Y8z{IJgk2t)Kwf zkww6=P}o-o%sJ0=yaC?jyRIV6AS@jgY){~H=Rb+5Q~wo_`vg46;=$`eWbG`Zg_Djt zW`7v*w+PdfR}vh|hgzzL`$<1}@&~>hZSmf72?izhgBDSYXVT!oeigW1?UM(hUccp- zV-z*yR>XPv3=Mg!YjtU5`%m16Qkcqi3)knk9)eUz)zZ;PRmh>_21~jB70b|xT8Pwm z)OteM0)|5A^QtHNHa8Jt2%maImt>04R>X)G-`pEq2cNJo@+DP4T@;qjlP+QQxop#6 zu>mkJ#Vbu^=*`OdXr8t4V5aIZBcyaNku?x2FzM7>}`h{tu$H+&DMcw#BgUB(%pUjV{!qFW;l+D zXba|CYYjFmUB=?e9~I);7S2wawcKm*AStsM^M5^3?Nzw9jzz*|aM_z8I;-D&%%3li z%hH05d!tVg+I2&T1RBQp{yA5fR;|;hkZsU!G2ZaPWtwZD*k*q#Am+=L2SrTG%%+P! z^G04yH1Qxu4b0u&S+ld6b)hADt*<^(OjR5etXnHl%HC2@F?}#?U*9m@xsyApQ2M<2 zO|U`X@Q`!(bv$(yLES0_Dyk7TCSEVpdgNY|Z@O0*xdi7_13PlOwG0KCJ61Fxta+Z~ z_V8QrVAk*Lz7o95J$dUhTZ_-sX}*K3IY-97n(z7#Lu6F$3qWX_dhe~^#^AxzulkII zldIICMAUWQ#7o9M2UEF9lb(>m={IXtKIP0y+Yq+bT}|QTFq3kin583AY}Au2oK~`q zS+HNI_z-%d(FFs5_@F(p9hZCzoG+t7wi+09_>1A;D%J1xSopho^`D$AXF9m(9bnux z>)m|ZQ(u^Io~PTaB_e04R}u_f;xve#WFznT=~O+*_k>gV_v4o(`f9Jb3Cy$?i_B_XXIlqzzR7M0hmNhMw$0qLf}%DD6Q zdR=LM0yOD3_B#@HGFNB=(;v+u?-Az(eNKsf*G~BZ|e&i-J{s_y!rM?DyFV5SRmvG?ApxYcXd`EhKGW>H#%Th~|o80k^A zQTjhSR(^~LfIuV+YUTf8?>(cU$hx*+)KL@!MiD_tW)LJOl0&N~hzf`bh$In_oO9}S zL}~x9vhgNEHTJqEej7w*flhJui^h9K+B?hQM?C?0+?l}N zkG%4%(m{vc3)i~qHZ@Y3!>69`r*^D_^_OA{+XNO!0R_u}5};Y%<_#3kx>pLc3+j@Q zW#;|M8*e7zK%H+dg&&{0X7YWcZ0$Wi()gO$x0UuNk>M)w^IRA#f;L^D^9_Wz-J_KH zXa#SFSM&JWl`d-@P|^u#F^Qr$Eq=RcFYaZvwJ)D32|D=u14>k6Z(D4B^~ zbagGsC%X@L^e1CA08R5<5*;lqhcm9^mznq0S`8N+l+(z^TaWVS0G!JFvwp#dN|sJ8 zv>6|H7($37FA0o<@2C3;pKTMgJuSDp_Dx0YNplGIM5$%L8%Z6Mn-RzA6~o%=arr$nWj(dH%I;&AFc6W-5kC(TfuCRN85!6G&tvO=f zmO8IUNRc;~flBoc=;aCOdIKi>?YeJMFzaAZqx8Of>ZJN*`;A+AbB6E{*tIt4Fa4ef>#QnpH)ZE;T+m)|-JcOrK z-(te}kyp)8auHF&`VsudaJDAgu^UGUyJe2}5g>|m}!9yfQ!EwHi zxV7MCqvTc$*j$c5jZ)q-XBO$tCZ9sb=h(27|43mg|EJfj; z0=fH!%67|nG}M$Jg`5Fnvg%3c2PAFGc`z8nT+(jdwY&6U2uTLxF3f(}f8f zsw|p?aLY6r<>}60>~pB*Wav4O>eUSY?XOpj{e0`(y+@;V5Ep4^ab7;g)libeAny8S9F=}PtsQodg<7yD;*yjS&LWUY;``!7FAO=(N?uXVW6rdb} z+CC{&+w8d;TT{^LdP6Gio3^2KOZBokqN*H0V@2S?Ib8%<5h4p)m~cOX7x}(MF7k5I z%bd1B%#X+XaTpdP&Gl0>zoBDir_qEbU-zkCPDvbbfkq}Sh^5A_3>O<#;O1j;)LrNR znXyyw67kd{St+1I4KEX^w*ScQU#a}!P#!8WX>Xhh3K9abK%-!7RhVZx2X{A9A)U_-)n9hEG=&%dLiwv(0XCroA;iym!7oy!f*Q2 zzFkP0f-je3|C5hB*P!Owb{bF_)B8QuGBQqdwRqYaiVGD;B`;nxxh-U6W)Z<{Yukyv#qQ) zH9O1YlW_6EoqsAZ53h zW`i9riD5>MI1Wy=#l}3#q`jGJ-Xi**P&gDSha*jr=l9+maQEp+MfxpG&n~U#;a7OH zd%BP-|J08W4}j`^h`Z2?vKcMg88%IPTKtOL{|+l(NHx$o*TlqTE&^5{HTzym+@df0 zVe)j_N07!1uNgN*G-QJaP#|yE>XyoofB3{IdtQ*0CE-UA3UG3Zn+nKbvM#F=CFX%3 z0YQ|v?oDMPd{2XmvNeUozP-qzuv@;pz3t_?3t)B9sW&v7m8o9P7O;;YBc-ND&74T2 zBnP@05Y=q0JQ=zMUBq6aiX5kGVip zP;lihdYf*^uhVZ?Yqtn!Sfm^KXqh!>15>UpJ-2G6?Z<+E3G=#+nfo4f;zvO`eXh!R zWnnbkOr5aRO*8o^!pt0pjMgj$a=Cc`XDbCf4AAL(-ExU9F1_i&Al=MS2(bQ?J2{J^ ze=11(t84Eby`m=t`%(zFFR*Fw=v(#Ye*kh_+Ah3@UmL|dx5mvLX^kzh9K3qe;<)z@ zQM%}>#tw0fClA?#DtL5vN>0Y3!fTeI(lfLVbFY3YV2)pV$kfg02UCr?&eC1|vbDa_ z(bQL)1KnquKyy{QzZ9V(BHQ;mjpTbPQ zGn(#;$cJb8wRYqb)K=c|W$4L&o53UN;-)7L7e9e@r?I&Pi9b10alH@N`)}Cl@k%sSL+?xUY$cJ zZ`Lf?nxZ!d6_obl{Li?1j)qkBy_8wr9NV$oet>berWR8}*CuHV04|ZZY)wIn{%qFr z*0#1PZ0+bY?}m2n)1|5vINM0Z=g$|gF4GP6Eb>mS)5z)MO$vcF|3Nunyx8osX@a{P zk$p)>x2$p|1P1l`(*Ulny&L=C!{(4N!E2*V*WcH1zGJT$mVhGTR&eV=B`DH*?DUO^ zYbI@Db{K97De?W-tJbhPEDCO<67%rm{YYM_b@1uZZfnC~P(y@ON-?CyWzTki76q*kghq#^TgBTlr>K z(TTJPg7E6l7hOOzZ6{DyKZxp9;%?S>?C?sg!cJ9V(X@GCF?V(m11Z<_)ruIm*gO2F zETC1I`!A{DLKgs^;a2EAKu^7>(Iwqe&g;GXT2EPltHTI0LE1{Bz2CiSHGx`!`fgJ2 z^r^OrD+AVG$gGElZP!3}t6w=v+dIyb*ALe>YgLR{}G|UHOm)8E($^|N!yoER=?_u^yLC6hx zM?4X+R$6|6fnDFp;}c9h0)yIqy)Wao=Y-wY5- zm3w8@va>R>J=C!ofe{+@+sr>|*!*Ac7kpUg_-$Izr93iD-_lh%Nd(yDfG%RP#xoJ< z9^dA($dU)@>Y<|#K8Z?v*o*n|8GcFZjO~b8bI5o;np#$|2fRWxe$TvwG~XG^ioEg% z5Y#jbFEx@7MVw-ru*0lPk|umN!?X>#E9|D;pk%$~J}v-9{KOCP9+iNmJObzaUSe7wMu%!kFV*6eDJTSAqqin&~!UUuO)UbaOH%VbEq^{7h= zn`R-w06|HcwWvMy#~sfqjH$S+tgMCtz+w!&EcOFPUaP>e;3gOW>A!pB6b$~-K?@iz z;?HEq*a|-7`Z{{vu=36yb+q0bTBFE%7w1#0FE7$Wx6OLf^-&jqPuT*s>jW@GHI@h0 zz$!A|HWKLIfs-6}(*7u*Idk#6GMt00^iJSBpEjU5r`FO_6oMv$qL56Uu%nq6j@deT zT8wLlW`jP z*O}SsMx&I1pZViLxMdG9c?j9Y0)!P42Aqg6T8@pt=0hJu0WH+r503XD&Y{c*7twxz zA_?YKB)>NHguqwvG}O^67-iiSLA<2t0?-Dkyn(r&tuEgfSnkVW*A5STS?kBleIknf zsFb+CBgT_noAr!{;GC)J+|EzRQJn#JC-qOFmxLEMx!D-$muJJfnLQa3hd{zIEVY34 zCArvPSy02VS7TqQUma3;`t8+r;E^*Hi_@1Tzn_m{6s|ZY+#M|@Ch$nxz#W*p6sND5 ze9L!zoYc^N4$a#HqAKiwQLMP7{kNN%DdQTm$g6`Kg)bWK!HBI)#EGnnQsfOhROiXb z(PpO%eSV)>3`puF`uzqDt>UGYgX6;rp>jp{yAvqW7Sq(Lt(VleIHMSO;y(&%uhYXS zJ_BGw@_0POPBa6ltwgta&wS-VoZIv%d*W8NDSWeWLF2DW>IsEj#P1cS=bwiUM#lMs zi@t2BwwK<12^Ay2OfAImUR0;8cPJ!ui+rBKOimV=IO^3brsOaz7MEJN4_$4JJE5%{ z%2Na&S(|LB}AO3nKYwWeFBh>LT+R) zP92YkjwaU8+crW=iwkVV_YRhbXy=bzjM8(YQP3(+V7os$AF9G-AE$d2IW0|Bczjne zJy}?;7Vq&nEzNfjDz`r?UG7MPm8*om>RBHGth42V&x}Q)LUUS120N&3C$kv@)}NlU{SFFUvDu z0*F!XDPLFZe7)KijYS*$XY7RbWTw}?RiMm!n}9F(L9Bt||6Ryij7%FA>tI zUz+_+%$?U`aeekMIyIE%&$aYvg`kB5PmQ#D9~sTQ70pd;F6Opi*&ns^=xn1U{msX# ztZ7s}rGr&~wKRwFp7L`}ma`n#2IMqK?#)CV02(rCZ@KXB>-x*S@o)3>JqI&296MwB z{g-uZDU+px6GdA!NxmY34_q-G3TzE6A6+6-c+A zBza3G8oC)3$p{Z-J;r9HR-GJEco2)G;0670ApiL>drNAUIS7;PgszOnvkd+-Q4KZ! zEI~y@M!JmIXPg{M2TBvLalw}|);Qaig|2wEwe+Q4KI;k8<$PuiyEb9Tr9tdlkj~Eo zWRDmuFq8zmN0G&vyC7c5-b&BrTared|BHa&>Oso=8Dhe%zUl*%{< z8wYXd->&F~>dhb5fL?Ffmf22Hu?X}A(8ODdQ$)t^}jS8rIz5ra#~tjB zr>jvC1$RK`Kd~c;PRZH*Fg)IimMs=p*kZiw^&)(7DJui+8WsDtnDtdX$j^zHYBAgP zb|16~B= z>#Qaq`%*JOSY=P4puua`sNpW<^fRULS=t3gbxdKHdI_tii61|*$>0x`u+STs(hG=* ziE*X*GAJd{AE!BvT=A%YhKOmQb}@B{^#KNBH6t zz)aopdDzv`V#V^>^nYss91^QF@#7XYE$>~+tw$sIk^XhYq2tc0=5+x}KQ3I+ui_Wh z&U=;z(Dh(BOD`H+P^a)mVCK8kIWPEG-vnK+$5lzzqvsimHAl<1ryoqb$>>a_d~Vj{ z+M4?3iygX)kq->$_?H0pJht|sqoV`Jf_(jI4~*Z=sZ+XTHl2qN7~`g(%RL59YrRyU zwfOT{Sy{fr*&3-nGrVcti7-j`{T~ZlAU~EW%S%nE(#YsD@}PF={vjt z9+Jlt7s4s|Vr@jcKWAaWVx&YxP+M3%f>Xlkd%9|MCdb=e*C}6ZIM$PWJ@@8^#C4$Y zm4V=S#l^GPjZmOq5wv3CW}B&=TJHs=;F#NVbQ^0rX!y9Qr2etBbo`p^xXUQzAaZEl zJ4N)VE*icDl6bwS(A}fMK#X#*`BXV`o)}BA8ZK(>pS@k?1y#JJj;)1koIvk3j&sX6 zg#@U5;A)a_UQSC}dyybV++D@}SdG>X>53H6jnlIp*?yn-=V@_^(@~DT2k?tMgbmE7 zdZL1~29r-Oh~54&Yb2P6x1mn$k=6{-bbs()bUJ>Vp@MlJS4U7!Pbq{fs^JYtpKD|* zsY|w?X^u)!7a&ur@SAliPm5n^>gDTI-ZPTOdX#2SLJBZfK)=_@eHx>e_pH>zs7z)t z$#%lLu6Lev|KH;@8b$Z;`R_cpCGqRMVVInZB=Ya08RkctDmaW33MP;*S1Cm zgwK}?=Z)JJdlWI}_hc$lU4T*m_MJ#pjEWJryhBI#un1b30M+7ATf(Czky?v%z@+ZD z*-+E2xRX4MFo`xc9#9DzVKPpOTs(m30Z3I%D-O2<%%mwA)tj!$ zz}g3re`o(Zpk7_El6?6IE+f(hS2srGrH-_!$9OH2?Z3d+f6|J#V}boqz6$nMR~%mk z3%i_kEqc2mz)L~y`!DjY?q}B2uJK5IVNq^1j9Y-gcGs&5?lf9qeON%!jnPx3e)Oz# zm`eqbvX`SJWOd1Qu1zxxzoEHLh%sF2eOQT9(SHS z8~M_laGb3^SaL$6+GRXGkFq;+RRm2Ay)Av-_5`&IK48nf!vgLjUdcqm;&GaQ{K>ds(d{~ z7vW^mwz}sLA0O{MYCWh1QzyWK?^kkakPn_g=wi0W|Vk9LQRLVnoJi zh?{?Jwj9h?iKup2)BhAVxwvvP@I0_&QE{pDC=YS7ITc`kY~}=lRzSl=(e491&+ue6 zLpE8b_@uf5aT+AMNw=9aK%f>pCos5;-31uUrCkVZIb5U)6ij1*MZX1_JSQ(}nE0s1 zBUrR$Bro@iKWp>2$4Y zppFR-<(`Y`vFy|?_txHdjV|JNR5a?BbhCO90G8buxB2MiaKzV1AVy((J?b(ps|ICO z!>C|-CJ%30I3|&c{#(kO9H^8vqWV#QJHisFTV|yeF_^E<%~m`+XtmTu^ZvoDb9W&TTttYCw{mYL7quu zLurCM^HQ1D+se&qyvliRTctPM8$c9aqPK)I3BT3~nZ~JCRhvA;f?!Ns2GJ6r^X%C$ zv}WiIpA!mOL(sMt59(2aQAina4lXqwOgL*A5J+q6_MX9~x%Eouv!Bxs8I6&8bne}2 zlPAd4wxiJXj0f_8Q4>~ISEU_a`7Qa1$}olkT6NE+*nKOVo~J_o#M_2_Y2j+O&c*{G z57_(F#&S5N3P?<-4rIWYER?I%44?)ToOTB`3~v{TUg=Te!Z&mUSD=}0x3Gs-pF-^J{A7E?oOi1U-c zXI`1E6&Dw$*1RXDZUZl=2~Ej-l7)*A&pAHlyfSdR@rtxw(nd6@RVYwE=SRhiTA-La zAmZ3ILE8uSNmaIy(b1cNa@>aJ}5C`PimVsYl@WKY@)#Rk2w&1be`@xjIg&N(liGESr2ln!pY_ofH4UJ6o)fKlC? zGB33O1P+UN7QtP1U%0XikS6<`2~R|+HwnLggq^q~{B*d;BvdAQg-LRZNgMkD0YM`rf}xBsd%%YdCppO$${uND4*@s^sLeSI zgDR)ZzO2Ni95wl!I4?;NbNU5@nEN2xtME6r2g^f&ZpkvJ@oVkBHPI>Tu7EbeT+(QL zT)%(`Eco4uAnksIi%35$Geont0n%nix)XTvwr8^YR;0c3`SZqsst{{S{Y z1DD|)d*{}$JKgexg}+Vs888_Nl@MBP-YaZy4Nh*EJyiKd0C?`5lwRE2{c}J?mpe3K zxDjMm1{<{96#1PTbKg(j6b%T<5!6}@bgMlhB(xS|X`?_|nX(HMfd}mhk(kex-;VqYF zcozs}wfvJf8y5hHUo8|)-lw{I0qA0|LD|n}16du4 zuQx(+f6xQuqNiuVe1aVNV1l@{kgHo>_5pjzYi-YyrTIRUGrbxHjUPYlt>_(zi!|on4jA zuO;JP3N)|zuG5e~Q6(iMj$K3zJ^d0hIBsP2O3)eNA9I$#=#Ws?ZS^SyDn&E%Ve${W z4?UXuL-Rf_4p&R3$b^K6%$_=X=jnzoJqp_ttRYtvAfS$O%YcB(3Y)&Py6mPM$Sx8@ zcdzC^ZMfZX)?{$|c_pv+{6~4IaMZ@<@UF4pvWsg!u3LND)tmTY+?=b^%V-0$9{FsS zcO|LrXPNC=uh~$cie9{&d%dva5!|R zzIx@S{q!rmp3{r66V(*LO`SqwQ6M%UL9><)JWtYc;9Pz!aUShbsp8gDp_g{AUn`F} zG~lk=)$wYAN(9FJ6b#+~2)Nj_Ysc@0$gcNgy6GV()+X)L1>T?XG5tOH4-({zrW@>y9z@2*d zK8aiI1+cZB6xwr`KuP;wGzuuyE}+VemVM@q!?0lA>v03A{ALur*>wM)+ zvD#i7Md<5GS-lx=SHA=mfpYsRKm2bkfJHfkD~>-SBLjL(nCS+s%O-D$gytB+rLk#I z3Bx)w=j6s&t2}jW zHooHYJm*Yo$(-hQVT#dSmG!9Y3wKPzt6JBD`%lZPS~E2iQ}(kFyr?{hd$S2j73*l| zLx3^rxT|4cJCfVwcB+zU%HQ){%QL8uz!JLs58?d!K*R$Bx*_aEJmUroHemun-jhjyE2nlr=9(T2xxq0z>_Fpd7v_4`PJj3)>A{3F1ArfiBD?1h?zri z-guVqUfx5@GtMhD4w!ctP1wsPtk} zy*46lsika~!FotH+<06~ftXul(tfFJDhUwG_MR>iQ&XtV$-5j7@Aa?kOy}-p z)X4;?o)tz}^3Bo8yL%-|zj}SxlqQO0W|1%10V$I&A5JBj4(hv3k+A6K!z}kufvyuo z*QXUA9vi~8w;7`JUG(!QeR-p2h{Mq92WX+GHGp`4kJk*K55QLnXwG{2)h?aEk_HMk zV=Yk4mfg=m%0^q?*}$RbYg!bw1jtK`5BF46<<~17v(DM=T@w>yotp`T2??l~o14Q( z!;n;$nFPmx8KLdQ|6+!c-&_Ru9K8Npso!ZT1%(ISj$-~ zQ^zC7OAPBkO^LmFFkI{HDP<1?+sqJ-tGn~D z1#zNARxeaI&L()SH&z;G4(8X)pelb1=oaiPz!KHeIF9;MLsZwOuk2-O3Xl9=nJumJ z$T*;8yQ**Tq4A}m_{9|}G|<=G!}s|(C9 zl=oz9GYco)AVtQwDWY8jmf^8;+IdA{cR6QAP+K_E(MnJ=+iND+^>aqXV4g05h)eVL zRaYSXh`7wU(r@{&+NDOUYZrbtu|yHs1tU*|CVH-S`&+oU;2*0~uFBPS#a=hBb+&9; z?iUO{Z)Tts>Bzqu+gzbqyGLx1 zh=n=xoh+TD;raTWA1^E$x>J|IdXRCHwLgd)?`yD>TZ-BcGIr7$V_29DVWzQ>TYv&JrZbNfvtJ(S|HvUvO~D5 zrK3rc?^XSYIycH56ZF1}wl`SpZ^7{b zw$(8+rID(X2j;-H?%9i@9NzMa`OcJ`a(VKG?Tj_yxzkCf6_@Q%TXYzI!L!oo5LuhM z5%fo;=KMHqLh11IAX$tK4;pW@obN8PaCR%Pg~}+KWBRyyeVeC%OJrqbY3uIbw^Ln*J8Nxrvxl&Sj^-txu+l$-odD(X?APJlX>M2|yL&l-woIL)^X;B8T zwi)LPp-LKQUD>vl$hTQa^5^3@9Lm5Z;Fr(@l}I$ut+#k*0tDeaYbE3$(NKScN$*tkiN4C~oV`Y2QtjT^9N6LL@J|>{aJT zavWK93+nsCBfkx@Nmnevy+pPPMk`7r&-#^=(ENA1TUtKJdp5l}XgIrf$D{a_5RdnE zWx6WM@bE;oR-OxuqVCHcZAk=#0eb((W$~@hXl9Z|-GttaV%6%aWkEJbt(V?x=tb=0 zcv|*leni;;7C%)n$22Ry)xkUFwKcA>d03?SepEv1eJH7$C05LaS>`;+I<1}PKEHV< zu(qSzL?eD(k;NLw3q<~tEQfr`75yr=krI_Drv-*t>u*Ut@vaIds7l1jz2#WP_`22A z)r|96xXmZh(bg6tX$!Da%<&-3uTI;{YrCg;eq7zHO7y60Pl_|HzN4c;mdac$)bg2pPSl^cQjtP~sr!fayB@8ZVy$uGv`cHAAMb}IvUMm*Qt z*Y}{0ECB($pFlopja$!aS=b_NpZYVsGd1N~(VP*B!tS7GU@Xe6J+ia-m1;L<%V@IV z0)S83{%p-qJSz#VfHL#cBRTx`cH-W?pQYDKz&XOzYu)M&YR~TZyVcjxOQP{3x;!3> z*kDfHxTg+4A5)gp5zz@$)x&BaF9NIvlCxJGMu;{wfC2Xicl~(f3U(0tRu=2E_@z0a z03_-<&zxtaBdMX(nI=xG+4s-GU3iz)i-U4IeeG)_+@;0wdiIS>rt!}3eBaBLF9RoU zAFXi38Yg(;gWH9x^X~*|5!Z#dA{D$3k#`Dc1dzM0NFPXP`KgDb;~F4xGQ!6!lX=h0 z(q3FlY^#=JGpaL_A~QZ^hQz>$bAt;E2`y==u`X!p4n-YC!IoLeuI6?oBg?3yNkiF{ z+^t8Cx0VJ5vNacgKT+0fc~w6@hnDUel)7)Fn-RDjJ5&JiDFDCl590ioVsF#Y6|zEj z9txx0YLB$WHex#PZf=fdY^|$+LWt zsEzuh{p-Asp%rdxcAesqNXal)YYz`!yO8=*M_Etw&_cSPI?Gz^Mp*sjF4@cnYNUhw z!~pVgS#d%0#$22rr|TrYcD`P|Y-YSeo9kA5b9>Go274H1(FcaetR*kL0BFg36dJVv zeapMObDJP}s`S(;U7Un4j!52sV=EW@^(5he4r(_`EyPpC`*L*xMe8^{4nyBePfBtc zxKz7v+oCCTo>=c`U833A7h4kr)M4OsZVFzehL_FFP5!Yj&FcfV+5llbN5}s*StRe1 zf{h}-lR~9h;Q5@}5qF`_1YwBvu#1dQLb`hSdPE?UB+b5MIPS#7iS6W!Ux5GJ5Fv&mp{tZgP>M0D+7Qmk`gxtu{vUbH66Nkbs2F`cIm)eZS z6k7LZ_t)#1^)3F;uiZ?!1{fUFm{VgNxP7c`t*k&@z=jjFQmH>j+h(N19+2UwVrT>V5Azlz?oPBlG#jj5?lE=qVD$OlTEIXE-Rt8s@flI@t2-+k z=@XMol+TpQ5-T@~Ecyc)1JQaFc2sRc>&%l)T;diWfi50c7j`)`5TFdHeH&Md z4o{XWojoS4CEUS5UQKzJIVnfUwLE>N(9wrh={2ux=zFWYcUi)+oU{1qiR6@;D(>fo zp#Tzj=eq$1s`4U!FSXQ0N_PN(%Hwc1N0gC!t@d1WxBAKadZQ+BuD5o}n45?78?KqO z-S#}&5y_Ws2Sf)avz1#hAX$g8gd1x*b2*0>FoD_4r6SO)bB4m*E!Fb|&rUORj%djc z!}k8M%}XKrLo4GAqt;m=dHk91s2Zo4U|7O6lNTxEA>(dd53`lSc*Se(`;r>MS{WZ^ zx6Gz(KxOBI5C7bBf>d2{nC=H+ZRi8{7naUXS1&TpT8~%d-T0U7BwkOS4`-)qu?9r5 zwclZ`P5A`0nWdaCVnKE?@b|;%_$9#QUylLj4%f@m%u&1j#eMGMU*UY}cOy8(Wh&GY zXZ~eZce;S!2L^O!%At}_JD_kX_j`@_PwMFCAV{OB1t^>sYSt7+a*n=c^6w|Vlc)P( zDQ2ohT1?eQE;Q?TGlhY@i*jB1E|{_y#6_Gcv(^R9Q)D$fJ%yP}RPc5{Eyp>+opz`G zr9V6vFC5&=&+#~=HVP_FMqYkAKjtVBz%RoK-|ZUug4q(rj+7GauEf z*BK)-x+4K^&RV>tJL^sm$(U8;e)Q^im$T4-4xzT2up4FhrMqjIm5!RI$RfY`UU3;t z+0pj*_wS6&0P(Un9Y_+lj67YaEpFj-``*1as6Eo4QgFxvb=$!lZCYQS*1zq7Lh`*N zLbpMSvu_%nN__3T3djco?O*mVqT@Q_|F65K&^6Gj{`*EI)4u;@>yyn}|7Eijx8(n_ zy$b5vzi-HL#=z{~w{ZDW z|LJ3Vprdo?iMi;@DQU$>_X9SEcy@x0PIENC*Ue_F;}cI1kXhrfs(tsZJ&Sa@A?Yf9Vhd z{cWB-4#qd{Nmi@Dgdcd0be(Wt;HB*Kw|j7%jxIZFyUUrAcSXc( zx@UKDCNMA%V>DD~^x@sYR0ANd6x(h@PZ8!U)9JK7ZhX9MJAtZnT<}v=QfkV|NH|TW z`H132z4V_Zd~MMRYdZAYRNP!skjzRai;6A2CW|H7Nl`Y8)udM9z#-Y$^UeLtZ$|bt zB*w`a2nz@>AZOIk(x)}k5ACL>=UMt9_9xwI>mpsiAC^gNHsXtOhX3>7R^|VHp4DS}hpewGX&(6*c6b=cJ;V9~B%VsvEA^6VknRNum16x z;iqvXlaV~9!9xuF2@NhjJ2xj}SS!Z`gmh1-<>0TENZSANSzH^ADL443!zkCG-z?m4 zt$fCcCfJ!Ze2@$lvasB$N6J#t+l_vsf%VI(o|^Yecax74z#-Tr?6w@IUYhHOiM zwjdvZ%uM(2&VyKqyow4bE*Y2Ap;~X!uh;kiGl#;WHeEHg>8ESG&VJsTt}6Db<6S4z z*#6h!H-sQ3uP#stzx2fjs9Gpi=|=z-LN;bzT3Uj7Z~T4|1VPm~YVk5moDxTo(BAlS zbC7p(NkKbpXQ+pErYZ$9{CZw(AQUn@D(dQ?Oo8ko%-|=f8(=iUSKUGO63ap1 zUr*W!CDnn*x`3X>5 zc8u)8ao}VtsAJ4ZUl!}HM|*`fKs_tIpaGwl&Tv~b0pgx1p z!?K)UXAk9)#(in#3Dke}@+H)i6QIR!L#Xxs9OB%EyOXuv##<4WAOD=0GBB@#K>Y6v z8iqm*#1+UJ7;(#i-)|nuqhBZNm(rpxUAXWT!)c59;<7dZ{^fNIA0MCT*Vp^*M_%#Q zH$YH!{>}Ye;(wms1JKWAyvkS6+Nzj5Mgk8ZB$Z1jk$ClZQpEgMU{23VafV{`{Z*>5d zsGoBX{^5iDc8@X=$_7xkU1)Uq!WWGJR0>HwQ9<726nrWMOs5K8{E1(OSltIX zuYY}+YUNA3A|wRmzab%jGl$Ved3u%CT!z6MFZE`WoAvxwN*NOS8PdJJ>;_MPq3oU( zzv>*Tbc7z(MdRkpIxrCkYz+bGkBd5remM>&t)VGvwyD2EYGE^k-1u~}>mEIK*c<0J zXPToTBY%2T3DloKOl&LOb;4gC>g1^|w|Tq3pyoI5uelBRvIwV~o1KG$gVYuMs_kLZ z#GlV|1Zs;FiXhJzQgKlS4<4K{xpk}l^}Yk?>WT2xFU^O3y&cccpQarEGn|uOB_ILY z{o%tYX#;uEF1)d^k(E!a1N^nM1z3kj&wqj%{p@Z`fvonMg>rsASM5!oL*f>F{9FtS z3_S4NDd={wAL8T33k=a4IlWNXq#d9XxYjaYq!s|^e>2ce+*|bq96@rz&Dbj8sn*)spz=b-**6%SNZf8%ZVi;(Yl&qeCm_%rF~=oFx- z9^mIc2>>gh9t8J=D`%-BtO!5;1NDjkS^Zh9mpk#2kkHzIuC4W8zW#4kLSF!Lxhe**S$6il zV*ONcw?Z|IN&+7Fx*{SzUfylv2NdmcEhHaa@(+M)Ueo@3fBed9UsE1HuEd+ITfWZi zI(979v@4E?pb-$@xEpdh6?Rj=vthv8#I1#9sErhAKE@L260_9}gPlG5TSw0!^v?%; z1n9)I|9L>_oCqR1ApzcTwHeAi^wmJynBrzzfg$H&&90w@!%kl}dq~;a`3*S^{B-j~ z&Z{pP-W+6%6xOdYX^#ZyOdSvkrQp-xLSJt#gZoRAbH`0L2DVFD{L0U7^h2_su=^q( zUnsXMzNlSzw8XqOfK3qURddz2>E{hag@uJ_8@SK)DD!r9b_yA0|F&bfW-t^aRJ+*^ z%0QRJL%kpupf;OtS=AQ%bF{$`b`SZlT#1wS#0Q-cgBqgY(oX-zzQup?9KP`?=aunl zLat76Ju$&^9okm@*|TTR0r7y6sK!dH0g&Mr5D@sc8;SmTBVsQa-T~$*DkeKvLdj-54y#P8d3p#Cuh{AS|~0`NY{n3Gf3ME zML^wxAsd*yG%*1%K`KB{EHyMV8oi;8t%P-`rHWE&&o6`0B~?L*UrH3di{U+a@+5U$ z5`ARhAmhoSfJ=>4*#Dj9zwX zBygQzrPSZ-DxLxCYIlZ-N6rmE2^gGZ0YcryZ^=NCSy@>jFb7_X%`NT<`2A+T*4=@|{mLot;dJ46w7jQ_l!#8zOW>za zZ|c7#6Nu};WA<5--#ibsT3h3W;=lboLJi{#|YyGb)UM!uHOd&`PXrOJcq3M zQ1j@iYqNzI=IWLF>Uv@zc+j3u_;sLyfC_=6N3|df28*1gEWl_wz?(PoK$Ijn59ln! zyBa_Zwpdwzi`iW$3?BOGIkaBfS?;d}DGB=g9bg~}P=O8aj(L;tQ2KId1V%O#+?qo2 z!e{dS-ebD-|FQQSTu~)myUrLGMPL*am83F&ih_cYp-q5_fG9yS2#P4sl5>-DLpM1!^xcK;`>m_a_XqB}tXa;|)to+6wf7Tt)j3UJah8)D7e=%Cy3soJQwU>&XQfBIYX4+DR&)1ywLKY;%+Rq56( zegI!UpuhYEMW{MXJAaj#1Zf3+W^t@xFs(^G_D352^z-);(i<_Mpam6zM6H{n6~U9) z*k$V$Jq0<4Bso|FR1$jnDLQ(r$F?^}z_1QAE4_J>>}Ct8X5DENWlbXFKWa+=rv9zs zBZgFnl4AP9mR0opvI~ZyH_`m1AH8kucXpD}M0!S`d6f-Da0_ZKk9>*tC?Clr%M+0O6d; zMKt>5Z@=7*l7|nMx->R6dPuH5F!eY4i?7i9lhm67;OEN6qe9ql&c6xfO@nnoxh>yu z$@jDdJ>br8wNL+W0Jfk5bQtRS1U?z=-HZ&1$_e-a!i~AWv^}YxnZ(7#1tB^!-=x4$ z$bZhXTlm+D>yBcSV-%M=5au{o(vNWbMqOXH-g=uTQ6lq z2w8Xp-p0V4s99GRwot-$x*IjQTDt)MmTNU`0rC=j)ssq0G>Zx1y=4565~n_=AX&c|m#+do3q54Uy!tb?5ZyX*|=S^V1?had`zPLP*a zK;2>7*(6rMmF(ohfPwpb*##^o!K{Sthvj^{H6|_X9N5X${vZr~1D)M)<~o0VAshmK zWyo91hIr6T`d1{|vM7N>^}{&u3&>0ZnUHcx1t5Q31Vn*uMCSU#S$%MG$jYtt7=qyg zV#r&Y&SiHZUj)mQ$$*+xbAyNnJLgn=BIlMAS%}!*<4!m3;Q#f?eP1_8{vc$? zvX=~-Kg%qmlu^)KwEra~O5ZaEU~T;KL>|=yN}WKwdb;R1Op@fv z5Iw6Xn4;fGGfICT*Gc0+$af5JnD_$r6lhf2E*os77l(`u1P5{lu>2^h{oR;_UJ7+3 z)00x})fCLt0`{{_l3z}=C9?l|-J4}7PFa)=3z{W2){$=kCCJr+HAw`q z1~3Y~eh2D-0CKb%ETFZWr3HFcxWG9Qx4wEvjKz_d{M(c(e?U6rVl+5%tz4UYSTF=G z+NOlO6);KonKIPoqUT4cHM%)cE+8c(Wkc=$%mBE}vR+Bc%A+n;6U`@D`{n+{ibZoF zfS{KL)q`Le19k;<>IF7o5Q4C>R*aCg_+DD>S|8-?zKHuodFyYu!ulVaS z(6g!U-Ll2}GoTFsVgN+v^2{L8Zf2eig&V#+3eQ2efu`!-o3wV$k5wt zen|w_bkzIz{{0aE1puz%Z*4mGbqsY51FW96G7=!R2^1F=fIrczUhh1&?Js^2AZW5$ zrw_66TFUM+DqZ|~`3r$4iC@VW85sf3Izwzy$u5|o(NULx?(S{?Iy4^C$<i^;5ij0V`K5kjOll$K! z>|=g3LFVz`e@a{!NKH}oTN%X9Kw6mH*3_gd4|)`mi)m2@-{pZfKPFiC6KHa#Y4l77 zs#=XELlCmrcALXuKhWVi?DktO{3y6@189boB7zg22B0PqiDup*A=F77>gt!M;8lPS z0?gMIR5k`bjbESCp=ILTO;RjjZua3(#r0Obq+_;e{|pxMUrME0l+d=(W4zeL@*r5* z+04TAsUjM7bpIvaAZlE8A8Ld-LaoQopFahGZgMPjKk3!{^-hHlD_yq*&F;oho zr{oH@t~`57Bct(}dmzh&3@SY@Ge`jCKGw>#8gKN#YzT{qIf6hE5fRbIG+i(7c44)- zv&IVc=(oMjuiB`Z`qdVk*$CJv_!e%tkMkf{uw5CaHS0c{9R$UmJMfxk2R+Ljkd*K% zCy~#r3&G$aAv!ub-W)iM_U1TUV5$@e{SvEVVZWtzI}JkF=o_HTW!@eM#)0>up8>=omZmq zZ&S6H{2Z_i%~|p5{XA@TeNRyTai=CA(V}NGNGy51(pdz3RM;A)<_$kSKIwp5FKC%m za9IE>$$ye&D%eAUgQw*I=n9$!VID!GA7%NE1pOIvzY;j?{@C)h?qO?Ohx1a8Ur>-U zkbQj!2Gbn}HX|W-+5uITcOSAK*pH5bqb+p}4Gkq{n8Bnaw^1mR>-23PqaX(=d_*8f z!T&S=I-;*nI6m$GvNUQ-=n22(O>mfur(t(8TbUj1A3;@fNc^EHZ#-p?eTmp1uvs1K z>$|0{{xKjxgV0Ym3TZpDF<*zl=p7CdF9 zg4I^@UmW45>u94^SBUeUe*!^{_T<{4c9GmSK9FJ3U21?;P>CBgg$C4ERJ=L&2wO(=!qBU69 z{I0gPc9v%H-Lhy!)S&^j{vPo+JUIvQS`H{rBgNpF{U#Usuq1#xR99C=+X<`$;JTb| zzXtRt(aq8DUA=xir|&7P!y<8|QI=0GP3r z4Gbn7dN~dA`G-oW_rL96U~{Sy8U1HdbrAU?A|j9+eBc72+_WPl;@zAKtF;m^SEsKL zsKMLnEC1}Rs;woq z#J0f_iQTJykG79B6Tqs&Kq8G{r+fEW)Zm$r6N@wXXUDX(C}%%ec$M1 zSj?~d`UP8Nu5681DP` z?-6n)!xhW+I{{<+u((Tyft?-RL*SD8_?w3Qdvm{~ee{@Db`xW z^F#eq^Op$B+S=x2`~Cg>H#au=96sEd2^ixCeg&f{SKD91@PaihA=097YFi%FxXZE z?09z%;f_n@>|fYhw{8JS-`$S7wns)rN*@be`>hma+cbjS;(h(TDu-(lfTkRo%iB%|-u^6bo)bKv%`(}OMrn2rM}mQ0U@{P`Dy zxrO-rKOjx-xkPZp4wSn7r)u8`hKeU4D-==>V72HGxTxXngzro`PKs6irKP1{C8DCD z{ABEaGLcPgQInRIUOv20DS5OXgEP~?shLxQYTAbZApidPD|1op@bOkY9-c>#JK%~< zSGXWHh#i*SKVAHx;mmH{Nxd&u_7@gxAg2pxQzUO4TtE`LlK%wj!PPp{W0L#%Wa8hEqt$w)pu@q=qkS7Krl(AM`e2~RJtJp~~6sp*;QX>R|m1+;0?qAgy?S`bd`wkpXv5?&B ziq3QWvRB4i6|Cs&;#60SpGjw0 z_C!oRs!UpYs^ z8Xm;*kKg+!gyk)U)lxD=JL!JBZtHzG?$o?wnIMR#AQ8*^ckljk;E#xoN^Oa8p<@=j z0U!@H0RB9wgGdr?%TLQj4f6HmigDQytbNz9y{y`-*&p2*);2DyJF{h;%JS>`mA4J9&p_+fzY-&1wl?g<}lWef+p&a zLo588oDsGpf~uyuRG73|!QAcr0eKf+oWefaLB|Ffq1=s`X3K@V>YAFGs;UznWQ1Zq zAq*sT_4J3zZ2b}w(P3!sQo^$1p5JMm0w->U3O4JP3g=NuxL*0!J6K0M6{w#zki$ev zY>l7S)uC?7`h0+950Q}%*g#VAm)kcF^v7qtjo^V05CO_LeE#9KEf-kY3!EKIO{d>+ z%7Ui{JFy>b-N+FEdI0ZAnIusJ$NL~SFtVj85>8{VAbKd*!hI@+_P zMcIyL4cQIQH9DY(SNM+}{R}D`ojh`Ia4`1v@|tmG_h{h(scp*-8d6D2N=ix=?bvd0 zbB}`iX#}U!xhi4Wvezo6D z{{#W#nDWLlkBCUN)SCl9g~@**fcPOD78B8aS@lZ$egLp5C7K!w%l>-f`Xd@O|^tR})k{-e*7{Wn2LmPH@ff>glho z?ErrdY%cWUty8ag67B%WaMlaxyMre-47TSwd-m)vQ@?4GXnf#GazUaC{)WLFV32Np z&RKIFtzl?R)WNULk8c)vAD@iN%36k5R)zFq5j5?-vm!$;Modx>3kM-)-K^-d6b~1q ze43&~lF#X8M<%v+Kaa|`UY}t%lf#0> z=zV0|+}uB(I{M0n&L8xBYJuhZbSh&_N5Pkg7mS(RpqmgFg(u*j3+-kGfblmo8axj2 zWNctJftS%C8>P!=b8M_3>>2jFeGMOYv4%oC^_Nj?o=jm0XO~Q)6fxk)fG<+Va8o}Y*CTG(j|RiFvm?e>U!mzIZB+ z5qw&3LC>@TT;czZ8o?;$+!N-gz1=WoGA_F7!s*7EObL7Ilg#SI*x3bDLt(`A-QVae58sKOH-Ef7^D(-wM`M@#Mo9N?-Ptk)#!o%VF5ErBZN5exBXPa{3>hBFsXjZ*fk;FyRn2@OPhw z-06jJPCw0H(&cGTGa8*a_tt#BnaY!y-ix(q(?^*FZSj;35HhLxPH6~}>9wdi4WY1m zQ9vWZ*dI^_TuYRE(BT(kFhinKa&W^sz^t8Oz+X|INH0zOu_YxnKERrw%U9_mfYn^P zadE_?BQUx3CtpWyf+gSZ9z|Q3o>dz-%0JA=d>$ zcJ7Q(iT}tUFbownu2w%3lu?hVoB%KG*(|;t&fXbFt#`#cnC#wI(#EuHBq}EbYo@Pmao(2 zG3mx-qA&j3vOIXoKUJ^&5$#V(>oFDeRIZ%17^(FVQ-E94^)T-BeS*JQ8!WL_&WsHd zFqHTFyOMcbV!7{G#oI%S22U0y+Y~?uO*DT|{EJlUFCb*v{b7*{QZOC99Q4oo66Wdv zAuL?{(0dNQI_53-B+cw~zMr4}Wc<;JeDMXC(=-_mwyLVCBI=G=>5{CvyzR6HuFT|m zy`W{9w((B6SJN7!j1B`U(qlo%FAYroX5`uvf3zvDREJ5QB;>EX+QSjrPmt^DNi%Ai zXARv(NV=10s?`}VR2P&B^JG2I>}p{**%GT7ee?5gt8&EgM{je_7a*qE!0Hdz_{o$6 z?U=oPJk)l)G2(WVyxV2FQMi;zS4Nu938m>vZ1h9uAb@3;DbF~Jy2hg#jEh*LD zR62p`gavG)p5)EM1o8IfSWm{OrABh1(>h6F@I{Gm^(m_A=SwesyRXNrKf1INonf-T z;*lQzu{BiheR*!|1wv&J4ZHaL+7IcE+T{KDIpzD-$D=~f9^#_qaFzGy2Ty?vK@2 zm}s#auKw*|ge{)*|5@Bf1<4h(b&IMhHrr++1>A&E;AXG;oRm76*WU{(0j}w{BiRsw zKbEsyOeI0nzJk@(X?>xs$o(9FjD7j1y*}6rbl3&tOz7Y6PaBk#--@DJ7I*w;9q(8K zYQ0`!shd;QcbntBN@jWb%!!UvL&y}AlmdozzfZ-fBR|rc4`QZ=jb^r79uWHXkHx(g zK>t6|6ndOcyKVL*z2tJ=zkO=+M73_>>v#6gZakm+tv=`}WwBYsH&CDM&IS!<@y}m2 z&*!9nf81q}A$xP2{PDU)PfJ`F*fBVY=h4fORLUGENvY(#B6kDAGWNK3@W=Vzp4539 z_aDqkG|IaS7|5j%Od0mmaR;mgzYFnn@zOpL>K`Y%8jxj@cILNlKf+V>V@=j3NPizd zrSIun(hdeTajUWKkRm&%>~+lCWUi69mv{!4i2t0|`}xO!?#H62p%*5&5Y6Vk33;$% zHXtiNhIEHt^A^MsScb{c15Sj0naF?s1G>NqGTyAk4v^|#fDWJ0{R-I*K^Xv04+;7E z14ITAKfZPi&9Fze9te>z8IO&T0BkvYJ(v}s+<&=Q&L6*p|Dc&|!CG+nw-0=k^b*)2 zd_MhudJ6vb33S`Ui~q~hQ5`RC{QL7%DYX9o{^*hc6aT+I>{Q8X@b8aDd1_VuFAr4Z zdj2nuVA&k~Umn^bUi$w7`Ss`jp@D2-OZ$ud5)9v+q?7EVM3YNb6$*2Nw?)7KLr%j6>Ex;LUT6T?x7j)j9z;)vlcXRv(5qf|qk*!?huTc7ehbL_Yq9wq=NoNYHeRVMMw!GHSe0uv z{*G5mRC?ijo0Xj5-G(@|CNQd>qo=?3Q+N`_&_Ni_AScRDWDr!_ zKI*h-PtH2wwKl6TdHuv~T>i`rx5Md+N4$l)7v05hYcIO8=d?^Z(-;;r{@6-bnTX{J zU0q))+_e~=tS=+@$i~idXTD=^fzwLkr5C$0AGP(fQ?o=X|Mb8R#6(?ta+f5CNnuZG z{Ux2NE7%L2H&*X#Pi#`&@s;wQ`d{{tHM&VIa^JF%!&%0 zs}tkn(^!-xKMJ%`{v}k@u53n|Sfc0g`2%J2r688>+-_T`un2cu%u^$1eZ{$1~pZ`>1 zb~-l^%;mZE25Lttt|sN4tmDGOffm#@yLG``(764K#Sr=8Gf5UP8w2vAgEK<;4if&s z0&Lr7Bl}-6^9G$Wa`N2ib5eP|9#5$I&h?B2pZB1ln0(f0dDMmNV@Kf66~V<1n~7z^ zd-i>}cK*vENg=a78pR{nu{Ba*{zQx=ws3u;+>L>LPn z#5*9Y=qQg-<|)zXo-rHyUSF&iC7*d7OE|VJ)&cjfIa-~bNM#rc!F|L*IPN=fE6ucL z$7rx)hvcNLad(#a21P_M--Bc}*C2zHn5*T`LpNIEtL3oN0H`+b%$EN%C z2nx!H+5*dA_s%_cD0@BJixWE*Q&JOo-A6)X_NR#;?%xEy_Uvok| zl?xCQq2xL #|q&C3rl?O3Zu-RD*xZ(TIvB6-PV96r+*-V?xkGp8lt)TprwH1l>`t8_T>W!G?9jb?hl(?~e{sXSLJy zc4431n99_Vk`0EiXU8okJZfXRc5VAs{?j5N_T_I+C~C#3af0k!4wa%6v(7m$5rFMkb>zYZi`zeQel$}1MG-`lyQnq&?nR$v`^)DaHq$SD z9w?I)r;t-^yBmxs%V+z|AlTZpY#Y{>sIZ`i$2**wqZ2{#d1e`Or07f+td+a4Zzy<* z^!p^450--vmE-UhnjoKoY}9VdUz6j!{@$37HykJ;z97s6AK7p^^T;+-a4> z{eI&D0We4AkD_s_HZ7q9okHGIyAGV%XHd!=lE=IsH2$NWoS&bh`N}SXAgH4={Muj$ zeq$z@S1GzO$X4>;*N_fx1?-V#i2%2=#sC}`U*}K%;v^40^i<@s)3*`)xcJ7Fft#Bkc$6fUbEn@#{ z(pA`FR>FEwC1<{oer~jWX9}VD3*%tU#b=S5$$Tr~x-y&n(28NO{ZM?S_FG@4*{WPf z{v4aBWH9f>9edlr7#9`nHylLNh~Jog=3h7 zB(p#{xISVK{v_WSpaXa`T&-+JOeQp#b!EhVhB=SOZz*@Hf;rGGCG5@kD>QTy+s~PF zhG*fZ>upbOh*8M;Fh0MHm6f?sQpa4fu&)r2(CuVd;lef%Vsm-0V9j)=q4YwFYHxRr zb?*5`DjqB%;_c=Ykx#eN>ey;!>MFc235{M}?9#eF3wTyZ#(w)~J=toK)U*@1S=B_v z_OQR$>6oWIY#BPU%m=}Vg^6Cy&Os!p*%qzH;}+TKdpdwh&3@O^wD$V_N#%^YWz|1R z&vEpEtHV zdp2=lvaQE%FsOp1$>H0_7Ofns+VAqg_zl?D@(a;&gwy+kSO% z%AA;NVwycnm@g%AabsV-p6}kyEl{xG@L+D_^j^Q``4vC`Qr7FMZqJ-KiQ(S@MNYF# zPpC*Ax)r0;vHRZa4zauTj`L%-T_$a%$$6Jua5hETRf!KbB$llF&-AZFn>GwAx5jt9 zkZMbiNG#lVH}+C`>yA8cAuNF>k;p>y0ukCA-=$mq-ZgjPs?$OXlOp5nd{ez#zMyzE zt7u@zv8$p21JWIYbepM(EM9H#{PjkF!5|^5jX1F_QPm-1mxjbR$=Q0$jIdu-^XHSj zo|1?`+w(!&@@eISD}CX=Snj;o;qu2?gl(@gL=rU>ShS~3Gf9__S}%D(^5c0iN-?b% z-0uv-~BX$FQ2?r~+Cf&;|&Q zVLH3Q@ATTRmrSq%QO=E3j6Z={Q2cni>iyaeDb8z)x|o}vE<9nASk&$Y;F+x5my-oXI`eA}2DVlUvSr_i%t0lD+8?eVqKL|492ZY7m8^Wes)hpg-uxE4RM;C z-p)i3sQd(GemC=?8o44H1R3gYc7U&7S<#<=_?AMnP9f@l?)%b{N7ZI!bY^zA#K~jzi~ch?O&g6`D33)=@z=@?SR$iS5|XP~h_Ok6NoLBQIu}F1_%u6MoeC)}6K9 zeZsOne?Ih0!tO<81mx_0IF@8O46Ua8w-(Ur{%UeN?TGbwUIV%m-_+cuagMjL_=}Iqq<0n4&mR4SLJgrn2LlwsZ#TE}_kFt?^)~f7QmU=y2 zzuwDvT{-&ZiFVaU`JjD7pnjXOA{1fLDXK?Y6Av0GTkD zt~WUUgeG{paX3V;>rDHe8s^|8X45Q=%B+v)C#B0kCj^`q6E|-G@maWX|IVF2tH$wc zODe(D?N57wac>2}+OVHguDY0Eox+J@<_aRi#89a>+a3SOJ3N?UHEuE9F*F{vhTfn2 z)2is=k0C6wIs}$)uD@vBA-otCc;oc8_v+^g{McvDoj zxl9x=78h@A2nLVPvDxS*xQV-E*Aa^ZCRq&6!a{+eI3@mWrWRINe4+U=BbQSfxFy#r zR!V>QdHA)6NWH#Av&g?9t$Z!^@f$ zRfTnuYwwOQGmBW*Awwy+xY)(Vz%DtKQj_qgJ;^93YJi~l2R3h}7mSz(vydp!v?XTY5qT02n@eHi=tsuIl+KKvdw!%M8qzNIqJ$nt zlKzQ54Vplz3}pdp=;7`B;sEwDdvVl+)|Vvb@1HzEMTu$Mj-){(7tTgm3_o1zWiOlE z=oDlTCO=b4z29v=`Yd;%ig-Q!AV#Zc{k zep$p3TBKx;M3f${f4x8U)SWXz?OqShns$#x$}!OKqt`K9ky@GEkKeGrII(W{#i)r3 z+gl)UW@9p;Q-7yoDg_NA26a=+VM)5UyA=jlU|l)0p3Vk!gJcPcTJ@5HU}2Vdz=>~*W~ zU~d9h7mXt(`!(XLr9Du4;w_$9V5=1hW~=eVp_ZdH3=;E|Jc)T6=ck{VEpMzPT2DKv zCJm}iWten5#as%kR*&!eV{OhP78cN|UP7y2eKGdI2Vj@AX~#U9DF?A2&>k%`Y<8=W z0ce9%EosnL+q_K8PlqrLh)mZQf9XYazp_=ko{Z4L=2K-cNi8f1G0L&pRqrC6u4`CW zAQyMt_f(K*=F&3;!ZKyfBP{3U=i>c5D)Nr1%tEG4eNV&&XcuB)bBKaJ?{YqNzKo=_ zkx}RT_v79|=fK7usvgoxzPmEkQ264x;Dhhy>V|p@0cZ}A3mxXi-W{ye00d@}V2f7_ zQ|Z)52S!<59t+D{U6|a@$0B4pU%_73l+ZK&$C?YQkL%3Y-b%8c5%A?W?>1~9@1TA!S{V}F6N#?yBO(fXAJ(9cy%Q2R9D>7sn zwLCjLrT4sAf(xCuv z46Lq;2N=?AYx(3m3&aj<@J&Vv$h~wj7AMGiunE=s&)q(^Tf?S;Wv(Kv^QWA-Du>qL zgb5@9s(dtoQU|5Ga}sn!{^~>k?f#R2b?Z)x9Wb`YlV#16&cJ<`i64H!rry+D^vA8;CHDd1Bf?L)zR%!+@>CHV{ z!$(tL9UwSWQV5cItbK;~;97`eedJZ_37vvQ`%x|5tRXN(?tiKj^Mu<>tq0{Z(kMjkEuXr>+^i&tU9K(p$f+AaTxOh|H@seT{0J%SU&3zQ2ZViGhE*j0tmn z@cnSDzd+?-Fl>$!=6BU?cVX7golZbv99cS@OGQs#nC8YWDPZLA^9_!8iut89^2%t) z@<@Q5R_$TCQggmK*iSy62Xakrp=E!|K$D06Z`ykP;SYFpoa8Pf&@g6CA)T^0BuRE)OQ`R>@ zGh03HAEM&?)LM6sZSQgkL$8!<0d=FRh7U9MPIkk3;)@}Tze?PlnSHXw2j)k<1w5;@ zU+$-dYqw`iVKXm^PDHCfT;o0WRIuY`L9h9iKc5}u3AS!6yZ90Dau>Gn^+b61(>5Kv zS&%yYf4r}Lq=t+pZvKUJPcDy ztV(>Kgrl_5Xthr+7$c*?7_eGjZga~A2--Ji)hWbjc^xae{{A>9Ngq+`!zgG} z6EuyC3&4;Hr*f1vtY@Gv!|4bJeSayp`Acc~FT_)S5m{HBs-@t)es`hRmLn;mmN4YM)pa z!!uJWjNI;BIo7gDs zVSKv#u$awIl3s|GRfF=HVJBAQPQHV(-N%9cTL0U&=Pg^~4w-A^JD_t?kMoD7GIemP zgG}23e+j| z&>cKK5nFnLFqU!IQHn*6h0|uLUy@Z~|dF{R0CvAIsgshwN=f@JUxl^4< z4_b+2S>9~Xg3w+2Pg1^aRp_PT4)Fn|{KbNd*-?i_mK0|-{;oe6l zo6{dDED8R!&--K3|Hx@jaU!c@t-uw!=O{q_P5xD4_o_?n=kCiac*$fyLRos6a>(FT z8fB@$lFru;TNXQO+v!yRZeC3mcM9dz5{(ST_d53sOM=5>85oAr5}t&t0*m38i{(M)<=b_f7o-Bk z`2j>h0Y_A(fu+7Spk_DhqtH|*qLnfjUr?QkAb|X&^Y@D`H2!BSN74Wdq!wl>Lcjyd1>n{`gtJxzve6wrXTR8C8)7%` zWT_V~p}tq!LMvB$WhCGkV-zareE+<)Bow%@VP{W)vtyp%lFI=QyZOvVp0)(Tp>Bfvt z=Zf_@S$e3%%U?BT4sM2cy~~9K^yo27xeZYEwv*52|(oq{@$(jT^Z|LKB|QG zq7pWGz$KimjxJL7<4}EhEj34(#zFG*N1Hh z)KbR8ZT>ewG;FN*IsmvyyRFW4Tk@fOn4k9m7rBw=zk1?qrA3YJX`mfZ^4D^2uJw=S z&RS1|L%>FH8w~(?yq$#6g7G)?r0>7IG}$%@R7{wv-NW(nEsF>xGGLlu@^M1@tm9&B z0CqadV)%7h)M=f9c~@?>gQ8Zt9&8>5PTe`a@Z4!-cDUN-5$bi3Z?12#jAP>4Sjp&0 zaGQH`n^v{Qs%gKfmUYvKD2hbobL0sU-t6ZI_RkM;oW7UYyWzM+W*Mh|S?|^j`AcCH z^kw?}ZxiQ6i~)rUsm}a)m!|XPiumtUZ(sWk8RoEtC0EDdqpw~+*`8y)rt4Aap9lBIu=tY9@pnNY4O^BaLTmEsBv#?< zQF%^D3Ryq&ZdZoMOlO*ay@GImGccnQDJle~UH01NS?vk6lzE;+r+15iO9aQ$?qbx- zyAP7(2hLDLKZ;mBTs8@D7y()F<~3Mdbi{%p^}^(JRItO;6PoE)xVx&+H@}zjJTaYAtM(Eca)o@R#IRk!#nkp(hS*kAA%sQQhrqJNlqMxq>Z3)J$;l`Fi8B zsj`2en~F*nsen5nf3X-zkDz1_i26}Mp{bgleE+QlfJ~X6>e6qDlq+)od&ms!ZH5Qi z47f(Ifig22nIFg4kO;O>OS2tsf^j(t%U7wCq>EO?JEOL(B`0~I=gBuW{(QeUKKQBP z=ed8g_JJO5eUA4KiIjU^#k@M?ZJU@iu-aoP3<@GTT08$fIKS}9k#-+skiZn$-2oxb zB}f0|R)j;ub!8!wPGS5;AOs(NZAujqv%eF@yf|U40ajZhO<0ofk6~S);(_u=xd5Po zgM5h^nHLFp_F*{|!xI;!Yd@YJENA9>^X>x2w~wsa=?~pNth`7hgW_;W1fl9GaQ}u| zt9&q}(6QdzarA!8aRk_xa zzIK;DP-&4(I@9n|>7&Ki4@tP0GQ90nC&#h?ZDQKOWZU#ZlX&$7?|1K{-C5Z3d#`wN zdng1|<(ldMgmvlli>#7Iay5z?46zHI=CPH192Z5<~-)ZsN`3@3_d3LT^Q}Ljt`fD^Y zjK@tAUFPZw2e5cC9`kEd zzP;{MZI6cAG;Ek#NocWG@*9Ft@1O z+HeL~o!b?1~?%Ggud&I*klhewGB(GFz-!#hrogX?viO7H1R7n3MUBlmUVsZ*e7 zU%zaMq9U_RoeL2PC+O7$W)G|aB;Kul@0x8nS}@=E=ypXXnEe_BOb>TVTY}cyNB|!y z96gobw;@)R_BY6|Ga1yKtw_VI3~wm17Q7%oAa(T16`Bu9bMKfvz@tK$&Rq+qpS2qe zQr(yfkqLWby)dE7AYo-&h~paqqfmJl_+zRg^$|-YI`#A@A$z!#QNfM-xy&gCrhJE< zoV#VSx)m-1$rTPlCJuK*x0*JR2R$&Qeh*Ub%WU)i8@FSSLG}J#lYz^MX%A*}NnaGh zT2t!_0z?BHzJFo}JEqwZ*U_&Sw45w={p5$m;ChLr#x+tQ$ElaQSLT8K+zM}Pye-C- zookg`Xnxe6IVn&tzLyUPqS;~DXRK|b{)XBg?&9teWzo(sB6hdb`VE;|ji#o?0uR2+ zpyFKR-8Ri8Ye;daHwR=#DWEta?!fE_fq$~_yolKlK6(-auis)VDkK+(sCaX^G=H(w zO=19Jqm`t(pGW1GL{n$_2ZC_2mMo*ppTvKov4-mrmD-QKQhl!38 zIbnL4NwR+K7bB6=k?5+QOk~(47X9;%OD;N7_qc~gDVn@ThGlKo?^%fhjHuU1fLO_) z5qTC*?(+yk#m@@XHr}f)V6#f!zJz=3btLJ(pk=xykqZ7R-w|WoB&T}ibI4>{;$$zi z0p!~@wZZsIZKMFiiH#9!fPe2D(BU;~_Ant(#FFmNtWnxfkgc}JcsM=ao7`D}vvte) zOWHLd80s^I#YE*;(+OvrF*8DYa&M`54u|yaj=>uQ2(Joj@JuI_V`%(uN7YfE_sa(^ zJIAVU?@&W8_{?|gWn+-_IoXs+vW$@RlarX6Z>o<61_2C{Dj9FWqnaY4yfA0wT?L7S zzKNFDfqv&DiGn6iFW?h<%8cs9N_{FS!_o^G-=Pvy*G+TAr;k`ldu)g%2zXcJf_W6` zbvn9C^;6HbNZ0i^rLichNt(YMc<9Sk`;wYLZv}$egrEsdVL&_ELQ0b)s5#QE??LLN zdI4#?Sbz}3jYqU?!z)6Xt&mHEM(aZu=@^7R+2q<7im#647r8T7OstqU-n85O-=ijU z;TTV$cJstf(Z_FvKWJtGk*ec;XXE^j`ag3feX@2Y_IxZJ*{_#JDl z+Vw+nqjYXI4s+pXf5|@&8B@nO@>}txZhdwqvUK}ZS6_7CMaxzq@N?7qqy0OBBpmOH zI{|*T#VGSF(6v8(KGaQ?kX}l^e$Huml-+q=MX480z3mzcbAKTG#AG8*pO&c(7}u}Z zFQ~=#)KA7nH_^L_cFTpFG$Tt3MCr)WRHEXXec;~??RqjyeA>sZy6BZib|vXKi{}l! z!$<5HR?D@?A9NQRM^&4b9MVq7xb@ZW@bDwFKZ-}6E_w&;n3c8|s+_6E6V8A(K<%+* zchIep(ea^$w9@`VhMGxD7YJ8te7QlF6;e`;x8JrLt$RI*jtTIemQtULQRaCTckXVf zCoD&Ki7a3K{ir8-UZ}d8Sa0V2Kv?&ym|9R3bHV!Z_$BUOy9xQN_8ds%QYk#aPP0W1 z4r-ra6(fA8>g!C_FLZqkq<@d={DQyXYI#Mr&D5&mK6!)w;uUiVpy+P_LS-f4;g?P% z^q1NVSd~{BlneFlev@K#d8%`rO~Kpl+xt^$qEkUbbwO(YeU1R6daSt2KwHAF8q>A8 z3iW)4d(;h&@)BCUycCCpkBUKof#Ntyd%0TxXB~B8O;NESyy_@QXG&s~Hy%9=uM`5p z7Xtfc(jd)9w4x51qjA7IiJM~0zTfTe`L3zW@^q5XA~DrtyV$CAQNek=Vr*vG7oEa} zGA5n0Tj*CtuLMmB7PW2!!5yRYh0VbK$=2T99P39)OvgQ~8l-Zs>5Hrk2|%W# zA0HNU^3rjdsY3Ro{WhfY#(31YBDiXqaP#~K6Yv^9@ap1DgKpH99zk_Zl$kX~7aF$q z<$f2cca}lbyWZKbk}xkRy$)AYDUE*6IOJLF6I)(`Kx2Qzb)ReXI3V^xAJq*;oHIyX zoA#vo&Wv>p^5`D?Cawe>AtYLF))~8Y^i(QHDyoIiyA`v}?GL{s5C%O9R zcFSk1IwV*BJfw5y+yexAzO|v(Pj!4()p6d_R>9^-L2)}hGdCVZx_8{$7I2pH`upAZ z=Yo%Ht~iXitd}6XU+eb3$iG@M*4ru&wkJ6m#9x{9YsoIce!-J#OL&92z>opX{U?u%?LcH&eG)BlGpQ;?IvN-MBl}jpUOzfq-$n}<0jK84ij&adb`<|TjSX)xm>jS4V zn&K@+>pH0pdL1bdB`yrBtCL4D6mriSKHNTSshOChdk%wcwlBXWCl<0DrmyjdH7lXB z4Ns0u;&ARVX_H=%C+RDt7<_rMwc_WZ=npG?HC6aT`qoEs|X%V!x<-A|EeKYfsrLc%-E-rXA;W!4&OiymYL`H&(!c0PW>bB$9Gk2d-=fgf$D)q zv)_bDA{D4-W9mgGLrX=>xv*ugm7iMug)udcTrgtBjy{4oTYjeSMFDLjtYaoXVu}FoGTd^uVN1TgaDl8uqvoUC&pY5 zI)mJWS^?*u)!Gyc^KnjcoZe)8g>zttqcJ5Ny;@kco zssaF=z(3V_ag4UCS4!R+To zdZxH&*p@MREd4w;IJ`42y|{kyI!aa04Qj_Vl@57kIdB9A{q`ReFDR*zM4qoTiYelbPpE z8FuGx@DeNr>MTT!$l74T*~lie6QcB7=dTl&^rLR9oW9Q)m5Bd0?TMv}W< z=nMjazVc;Y6+LtEVQXB#hucUf6uIAN1O}F}Zr{0^nqh2TEKol$CofMwnMrWy_tlvG zR=L6Ng!w==B-UfA#5gQ^&E_FNY2=5&-hSB%bipYYB z+hJCvFSlBvTPO`OSepqejU-x-%;yr&2JBDq@fdRy9YPLQU76j_ENCpMSG-i@zPp

z;qn~;_hdWWZQeP8Hfbepr5KEF)=cw#LIMKwjwZ~F^8Ib#FZE`F`%IX6`qsu& z<%sJo0}cSdPfw-d)^kcPf0W*48CvR>`JkZ~7Hr?~B$tXa?raH4Umh+WrQ`4apx?QV zPdh~|mE&P^w9nlZNE=Zbaj}@SdHW39y0j6ITk>A6Tu@y&la7<R#;Hubpcnm&D;BR6T@FGgDaGBjq;xc5JlO@L?F+PHSv@R6@%R4jMn-piz{FIfD@! zd`tTX?I-w?E7qD6maf&;qN;E~$DN0{Q`SUl^C(`W9IK8aJX$s#>HWEn2zh1lZ3#Ms z8|b8>_=?MegNxe|3O5#yF#4X>=q#jiC^}DP``M6ix0Oa~{0beH3ed^X+2I;UVe9n; zs$Jics1kzWU614oPr{Ed7Snev&xBR{pZ2~ps>y9#*R@@Wg1{0G6lrU*5Cs7h=_O(T zDT06qND~{K&E7p#>ptuJxMSR3 zckKLfFyss0ob!F3=Xu+Vpl%+mcwvwSfD~YaA#l_w1uCnJJ*htLktRn3l*a>E6l2d; ztv5~`6@GU08mf^4{qu|pTIdh*vmX}if}?0V{)ye-!5W-7@%g1*M)jli>UnlylafcC z6GbM)9uL>J&lq?ZqX*6U3-UVTX6BC?ym_w>FJk)ztpEL^v;(z>coDVO$(rXw-Ic{1Ek&U*4EST1eVTw(KcG% z=W9H2qFO)Wk=pK4g4m5jz6;JHb43s?5&EY{yPLQG9fLoEm~a>cqzVgSVAivAhw_0lYO@`twt) zKPj}@hhH(-3K&hJ5%C(w3S-DYirI_rNd*BjpXg9s0C->OO>oriM(HHW1A-#J!gzl^ z%NqYagx_o9l}5Q1^^}3rFnzg+CylwLCP~)Gclr$-_-vI~ApOkhe2s2ZIFJ6^4>;bb z38O$KT$YMk5Ofsjw2K$m+k)DU?)TL3&yQZ2p!5Qcn-x$In)4oT09_l(<$Ehru#+uo zY_j*6h31Q0i8~i95^C!U^?943V*>6_GWxZNA>9f zSidWKkO?@x4=quG(m-6c@Wl{Mp52>nN~pDV7p4Tk6u}dwl^14aeR%`5B&=u{kJQlz z4K`{1l;sNHKz^R?s#(iK-^+vK!)9NIO@_tyrrRWIB+cQawy0$RZ*P38+t8C*4gS7` ztzi;-_wP&YUUM#Vn9*N^{U}s|ROI^m`$*iL0j+i(7u5yWnIw+(RmdUPXC^q#!t19X z-o8uf|1?oxX#*dp;f)uTMZ&+iQ^;ze-)n-H0{D)BT~l4DjOoS=L(%6sR=d+(WkjbP z;0QS>=RC5QP-|B17`dqIv-aLS&u<6A-Z)ZfXILb7`u5WH#fSvyET``uMU*wvPJK<1 zQ*t#azV}9`?P;Ox=j5~PQ|+`imJ6%QlOu!R*DnGDFA}88XW6-0lsp<0YAdz(Y&fdH zHw@etfZ5ZgAA1?tXY( zW6dpo`z&K?_^AFUShyp>NB4y03WUygdEq zxbElkHj*FtK|ka6OEq9NtQVXCN+M|IWOKpJRi^#(jnOi{K9Y{zk$~b#q95Lt**bIsi@_xxuhL z^4qep<&Iuy5g-PUin&Jc?YYs*Wj5YumUpHlkA9^-@gDPeI9Q~npCX4G%PUxjzIPd@ zZb?A10ZAkljTKq%@q2qL3~%qiD#`#cAYq46MXDct&epeDS-`3qTYlf^HSA>DDvwh2 zU7XLNHmY=fb8SiKeW$(MD-EOi4?bsEi&vUgF;@`imjJi!9$ZdVkS1Yk+_@V0%9(pG z)3E&7T*{(azQEfz@2!V@@7!OZoGror^Fi#+m_cg|jVCy?*FpR#vkSi+Rp zQ|(DTvMhZqcU}s2w&3R5Zs!WEBdzU#hhzPA0_!Azxcl-(+yG(0+YnUbyP1oMKc-oa z9-qrFgOL*f%zAr~&Z9NVW*?8MMY-dS&a>P8mhPE04D82eWTamQf)}Ea)Jk^n^;=VFsx<1p+9Il(pY+CPyf}UV?5aM$EV74fidDj_{NjQk z(E5~_B+}t-r{)(q`ubSECLzv(s+rjCcWnpJtqC@k8-P0J1Gz?#NupqZjjPzJvJ29E zXn|3RxqSjw-Nf^VnfQLSnWxKtHOBtjC3*r5e0Y3BX|>T1w$fz_T$t(siv8SK)xC{9 zTg~EoO|alqNchVeYTBpZW8$&zL}R?Czf8MYK;O#pTEfhl*szn6CdsNDC#lI7D{lPz zAUjMv0eTxF%J_|y=?H2zkcFP0v@JmAi3cQxpc*8D7n@~6jmSDeSjnAU%r3X7E7nCBL&m7-sHYd zeF?a|7$kemmoxDzsXJU`Ej&l3 zBBMf56i2z2bW!K|FqHGc8f>KgWo)#FHq$(J#R>1Bp6j@jgKIPY>JMu^cKYTxpmCd@ zg;j$1-*yAhe+l&)oHN&J$lm1MK({Z-61$b1yyI*MF!ASlf(t)-%TM&@_GyBp1U@7c zAaGBXUIHROw=~mf*f8)&u4#$$gv-v_yZP_-O<{y9ZZKT_@&M2#dwbi2gXrDdKr1Vg zl)H>?z*Eb|cyBHkftRHD%vx|Sy%J4D3Av(%>}KD`zXZgik=PtjbEGultYz)Fh%%xn zkWz3IOa?JpBpj072f7nLek0|gy&kx9BrD)qP(aCdxmZ0~i{z)?xW#qWB-^r1z1|Wq zjV}uBm_#{bKj01xot_jqSRFDC5Nx{|f_2`2FiwiR z(|S|2Gb3Q<2sB?#s*2!Z@BD;}!)+!d#dBcWou)n$2Q1Or1_t$aaXj?KvB?$Fp$2*@ z49hKm^O6s-LDKS4k(|d8Y72-ugR`}?wZ#tk$-tBjs|x4k6mLsG@2|Q_%gG+tXckF| z&15r^O|~$Xs`f~0YnbXn>VY+NUB&q;s~UR$6$>ccCImQbEhSj*wThBt98ot>{jm~M zkvr(G=kxQ7l!X3`2mi>1p17TUwRNW5%x`b=8`K9>KnwiW+rOcll4M1hPP|40(En9? z%^N9*n3>Cn(niMspF*Qdvag;CPe(fR)BG!dT)9*32;*qoV^bl5&CQ;`J#V@GY0C@8 z+`o%UjqJH-i6Z6*N6MG0N8C|6=ufUc8A@7xc_lIKjG<&xGVnvE*d{;qTbNe5V0azy zZ5aR+T$Nh}iwS)0I*UT?TCr#OXTP2jMP5g*1s+)MPW{ai1J3ANmvA|fkSeSZDHNV> zTC$s!_Fe-9RDq*C`9K#SNJ9{x>h1hH38_0}4g-aTv!8fn>_e{6G=b95n<%>$#>Kjo z53tc;?%NZ6i`-iY;Zj(!&jJ%3GdEEN271q>)4r6M$*!ZtlM&V=@xkGPM^M0M-oWNm6WGRVhOAS>h8u)) zJK`}@ejb0vLQ=B7@R0Y&THTCD4A?TF+QRis+*_T%$k8GV3(T=UAt?7np z`)*V!biBKfxXL?J@TjXC(mp zFM&S|96f=+d>t$no-BRE#bFrKgYkJw#4{b3$M_%^wd0G0AqQ(p?$*}=oHPS6yeO;r z#g5{S7NXCkz{;nKlH6FL})DZZ5(u-aa584%2B9dN%zoT@)>^vg;m>QEdsvT0kyUFn#7bw@#FRTC)zTM@;HM$&~tBV8Zyqij5DFP6j=-8txU*x6K#=;-J`4;Cdy|6OJD z&h)@E(65%qw_Zb&6QY`8{l0g<(@w8ej~J@Al)2aVGJw7gR0{Tp*U0`eE7TOXF9a)} z>6iiwG@r{S$uw7hQc9lHe`14-2d^ywar0H%RXaQrU&Z&;!CW4!eoWs<>tO#jQ32gac^q; z4lquolq#p;@~pI#nB(_-TSXXJD)}bG9HDr58TpJ31S4#u%3WhK*GRm^lR8jv?}|-( z;_7&icQYQ)os~D4y>)qpS;LbRoJ)s(soEN1VeFAYVq#)?2JKs;uZ>n)j8-6{8iRqL zQHU7nyYLXhUbnZ=v+Y&JkizlNW|A0Stw@YVr;&Q+^9|mKg?4VvBuV+vR)^~)VWZ;K za3L$<4%xv)$M!x%DU=Ujmgk&?I;5h=$*?2Z`c*vQqd)pfT%5E`2U#&Rgi|zfv1c|F zJeH{j_V-WfwKoK>1D(n9V1ym_&6Y#@buKD$NuQ;11Fa>St;sEUUBGJqYjBSusrmIe}}vqVy1zYC&Z;Df1( zA7yrxT-wv2u>O^Wvw~IXak&#C);BGf`Iz(2#mvDr;8)E%-|S%&0QJ{FKV8dbCsMG)=zCq8n9zmiyE&zA@_3UQH}vvGPJ!S7tH$A z7KShy={mfj74XJTDyGhNl$+2v7k~c_V&f*mqU@-beRrlSQ6^^hXn8muYf2de0;nmM z{13CDyOyOsgZ|7PFY&TgdoY{jcrNh8S3YP8d$>4I$o{iTTyNutqcrV?w~$Ee&gF^d zSP8xBdM>jCwDmN(7Xm7OghdQidpZOPsaZ*lkRr92rs{H2I z+ElCIzvA-Gz_E&fOW8g3GBYy}h$^YuA5bR0&flzZ>vQj{TMFh$4SNR8hRb?8e_`EL zzkMIu=Oj5~sS7xTP}H`H3OKC^H1RDDRF zh0O%K2D`3>bF+ByF!TLqX1o>IoKJ@E<(du#Qx~ZyG89RF0tV0eg!xy=WGK9fKa#n8OD%xmQBgqY!kY zt1l9ziysi|IGiS4dkDXuBWvz`#}sP{Y9a>!a#v&MWI8b`4a?}!>nW^Wc)!r+(By+9 z>Z${}0FW^2`fJ_Uck#AB6BET>EWmUe8V}nUR0CCHY`XvzNW!y8_<<)Y`$KajYD7VFr;B=%it6< zB^Uyn7E;!<3*cEhPLC?y}<1om>^#A_7ihayv+2TzKwCAXT4!CZ~whKOXsg@+Ro73Q7< ze?1y8&Gct6_9IS>&UTx&-&~YSRNe_eX%3eMuv~b1{Z+b(@5bWL<`)>E(1xWjWLP8$ zd^zA*Pzf74LM|G~j~wY^V@J^9Pp`?8ddx@HkXHB#eK)!o{Wn*bG$x8LjH!d`5iR3>aHBw}~H=7o~ zr|MPXGvECXe;?DUpWmGdgyUg=bVG1j2(i|uM9_C`Mb&@hjB&x`x0kOyYEKksvA*cw zMajuZ-2<%Bk;3@Ym-6UGf#OUO8pyK(D1iEn50%} zu8dUSZ#0DexjFVFt`N#d>}qpB1~E}44;)$ zoo{3D1Se>=BQC`F&c$R|C$}u!xTn`D@uvk8YoAT>2r5jzV1bo?4@Ty?tXekfnFNp0 zy5P0c0(IGvcS=nF_m=+XS>!yLn0@;8hpP)^P|?DkEMFfSrmlhX)V-tXBD2eU?|eT{ zQhdI1uawZw#=l*Os%Fp$(Pj8Nky^0}oI+RzYNe`Wa`&|%9owTooUU`7Y|dsYoaJ(` z^56VU83|@nE^>uk;n$x0jF5mS)}<<0C*4SCAMMwt-=xkx zE$u6?AiWLQMF6A)rWwlPJXnNT=+(>-4bk(SO<_MJa%`k;tV3}zT@T@p1T0)_X6nbK zilnm^)k{DE#UIDPI_2IN;1dHzJuAxWJueptiW_9k)orWFx=oRdt^8#p+eh;+2Q#Pn z%ml-f6xWk#Gh?gK%}6Ch2{=Orc4~1k<=gdKLDrQS7YVQ3-&`>2YPgXkyW$Z7D>z7F zdY+^)A6O>dK&Evh$_Q^x1s-4lKdVp+I#n;3?B0QZJ&$1(g4m%(9&ENi|b?7%Og0olppB^SOfwLvYPPZj8Nw5jS!Cn_R z49byF;e^~N{y_e?hYQ+^bSmk%GU}4@2b1D8&wndd zRS+U8Nmyq9F5z*d4g6uDpI&zYFqsH>j{OmHpqiL2XhWl zkExx4BWxV{Kj@mf!SNfF#Ew$5x3%D-@lV@$RhzJ9u%;GYVxB+rOTDW1TB{B0TpUbu z9H~6Nq|bg*_OvC();avjoJ0jpocGyYEJVqP@Iq$v3$bD62Cz-sP-DW#rvm=bR8vpXT z*lk)&nf$58e|IG2kJP_hh=17qxwCSM(hpmVWAs!P^D8X*RQYgY~kyf zAqC(log6paD8!bhQ9upVZjU)2Xy?3u?o>*Nm9oMfWK9(CozoXhcClCNK?#@H_xZ0> zZCj#<@J?eH&um)&aYN;M!#=YXsp7^3F7a|mEXwE}vko(Clp+R4snW<1WSN%Vi$WWu zVLi3Pol>W<+G{}F2U@TcKEe8@Q7MxZ&=qp6iquEG7>6Qftxf5gjr8iY6EHYq>RHo| z8VpmPqP1zshf3NvP4pDee6c*k4T2s#ZEEQX>k{ei*R_xa` zW13q$gPGrCOk_ljF?ZgXXc~EcgW8co(kfoI4&m=BbBF?>F#H+Ov}UC`yb!w!FIa-3 zQ}5zlqtLl2^mLsKU=npSH%6mKoQ2nNf{o?z;ZuP1}uF}Anz^)g&h-5?PvuAsA}mW+mC5Wt1W5Csrhgq z=@Mtp`x}_?CrYy&DaWJ^qfde3qjMru2$^XH>oML>mA>OgjILvl7z%%oc&xVhr%DW z#df4ndjKT`CRU7cLiJaB)<_K+?yS$^Cc+k_s^@ZpS!VZW>+oVK;OE7aZ%(%v=Nis_ zYW!`ML7QFPAgzCumO3H`G}uW5=4*exS)f(M-SAu4H>&^(BN6~AWx5*^S!@aP7o2*^ zPF?B2;oK4?MR!-8u`c2{c`ZeO$pGbsR4y^hGQ(>qZhud2S|tkCUWQw|yXg>QWvIUv zCvJS+&*zPpQM;{xhdppms(_Ja{E*jz%k@m8u=}s^Jh87|zXr#?w`H?xmaf;U?ZK}; z)1EY1wrCVu+~&C`JNLcB>h0xVydsTjdznfb^(M%px4zmsp+=uY0n8KwGU{R5?dwN> z;l!Z1B+W~0yYB6*^E~HqCSX;Rqlx0|f{XpZS@YWzQklcR)4Yb(Jt_(J{WNerB@bHD zv!PA_lIQtC8YU6@s67`pB@>M6BbUYj%A6U?)k$z8VW|rzku>j}wRfTDnvHG;2%{;g z`jxY=kIP2Ea&7Q_9fD3-1|lLE^#$@^n+Db9i6)ke>g%uW!9gG9CuQp=6wPb$Ql8?1 zk+{9;Mr!5LYL9u$h^y$e%}~+QJ4JWjh6t_*jDCAK*&G1_FMdxwS0_Xo)HUugopPjb zoiVuRS4~FV!;9{A@$W_W%D-|+%e$RFQtJa#L2tThSc7o}hEs>KG-wk&zhUWLAFR>W z+9t^UKuV@yGm3`E6X6W{N{xQkIY%Y1NV0>5#Q8&dR&Hz0Y>$^~tyE4v0k6L7;f9KB ziQIbxCmoI%hZ$K{OaZ@}3DiuWf1Y02iYu%dQfE!8lRW=gq4><}@*OEi~_rbjCk2@FqccbF0FpmcBA0b>H6#2I~dh2kq=O=m|pxdrv^#W}P z(zCxX^|A@pj~P}t2Yvn1V<`=oz%kWCSrw0lrzG_#x`e&L+2|O^Q3M}c#`^8#8W$$~ zA#`dThQd?>bs#7L>%nWlYy?^lxVR4aNtzJL)2w;m`3_P;02=v^RCeiGyw|CMh0$nC z1aBD}XVuYtgDZsotI}l`uc;~eOc6d3I~|K=;i9N0izwGJ=-Z1@xDiH*wpxXNs@3DvV^o6=@%af|K_3Vx$Ia1kxSGe(wWXj%T6am+h59_=u?aAZ6gtFj; zecB|p0acS4EQ3QRM7LLJlv+d|_J26xJ<>IgVEAO+%DDhT3eLi@hT_4J!3lfe89$b9s9RP37Y?DGr zr^M(fOp_9PNY)h+v@-gLdlZwBZV#*6NW!3O=;ngwaJIfx^R|H&mns!_anzSHHZ~tg z6-;nAnEa9ItDy#2X{lpZ$4iloeSj%dnnmCF{&6~J^n{Yv6r3Ar+tq;596VRMTu#M% z-JU4*-Q?X`+`bnjAg7n2c*c^_rGdPWMxV@xqW^sP*?8xVAqr#!lm#|x1y;C~^-hF6 za5wwB-UImuJfk_*&(wr~noQBu)T|lJbQnmL!qL9QS+PYvJHWzi59}5Of6S|xSCiAP zg~O(7z_&?7Y{nM8^D;`KeE{ZRPdX$aXi{A{5bAde?Z;{#@;bowVXy*6AH36+T0R#* zPfjVw)z9!sxG)`i)|9Is2pbJ>iYARxX5jFo?>G0BW*HTj=j&$#b;rBZA7Ctf zFL5ZE#A=LIZ;F|IytSYJoH=g2gK4%sX>V&-3Xb%HeWznRwLanFQh(BNFrR;KpDeh; z+t9PUjkDr=(DB{I>caiz*Fa-f`mGw(B)T^qZDBjHX18F2n9pQu;rBL}=|KU^;jy}3 z<({>OP&O&EpJo!QJ<1NLvWN5Wp;{kzUI()Z=QQe% zbO4dNkU*@$03iztt@YQ%?zpw^v;R8p)pTsYd+z1fxe1E|MbGZC0ZXo*wzVkh#}sA8 zBpDwSI;nc4Q)L@f@<`*gl-2piw_xY>c+ehnfA4RwJAn<{_@SbQofqqd?XuD^V~>9! z!LGZZQoFR~Qh;5IWu#4T)O1@MU}A8n8>c7+2Yj?p5Hr_llg#T~BtX88CJekYly#U?rc4P-B4h?PMiln0SHS?EFDENWIhv{pH1p?X2?vh_t-NcJ97> ze?QW0Z^)qxwwi~DE51{KH9;_mtjc{hUJe{7z_D(mDB2B|=c}ntwI>z25Wykk7B?xn zS^A(8b7!U_1wH=hd_Crja(qqul*)W&4?b-wp%c#vmGltxF!f*%Q-HF4FMy($<6cNW zv)^L&)axx_E|f_CrFbRjDbFXs_S}1J7=N&+nSo)g-MPuYx(CK_hNIQ2kV%u5nQD4I zJ{)E}*^gMe-U$xOmkVz0tEfpWVZtZml>RFFkkg$r{TW+9ydkg2sOEEQ$IYJ4sh7H}e} zJ-%Of_yt;<&pP+~cX(GXzv$F^jlo|J35M`{-73=KbGejK>$Cps+RoaWKtvE(1AzK5 z@K?ZjfMAtG3*hY6L7i+M$)2&HhPpYI(9>_^_|Z$NH*fxg01NUB*JU{ z-9V-drp}i&(1JA%}ioJms406*BNe0X<}72V0|y&lPMppa9%AlIDxM* zx{CRzRSqB)9bc*vZI-u&Nr3k?33iJerap?`<>%^i&i<)htBA?X5pbD(`#xiy)$O%C zExaAvR4@9vz|*B`-*q_1)p?XI<2q5<7z|Ax{55T_&!iy&=$nf$zfovfg5Uqx5xL&% zgj69LnoMbb@$u>81sL-Hou-PjZKhb=myBAvS)f%{7ki0$ANua<6022hsnA)mK1r8_ zH*4YlX9wkD!W6`Cx-r1sm8#iSCy}*FS!wTESeV!aep8*Wrf%8%-L&*^JyCd(_e(7U zgL+l}RHfPE0ALgU?K({Gd|cQFymPJt*4qFLsz`ilhydpJy~O4$P@=?!ovz$xtVyzf z2LJb8-WMPXr!_n-eJyTGTx%=*o8j!^Qoq~$%`bw__n`mF3G91U)N}UjJG}Yh9)bUl z#>)TaMgINspBMR?&wpOz=jSu-lh}-SkL*8vBp}KCT>ahRL#M*G1Aaf1bm$&OakkEb z7gnsNZd`C7tFq53j{S(F9ZUTC$KSI3`_;Jl_J4Ti;Q!&x{y+YLvj_KG8lK!6j%Njs z@!c6t_NL7cz4owUZ2Kq(DZQkh_J7S?l{@3SQ z(eZuzG;MhDe%V)~6rw$#0UkF^TeJ1_JGbv{T5_`FPeZpqReZmApM>-wpg@6aWAK2msDH++2>mHzISX1psIA1^^cT004Jy za%5a>Wn^h#Txo4#XJsugGA?j#XY9RqSd-hfF0RX^s4Qh!5S6wph|;3cYjhzZ9i^8L zmEJp{CN5D?5l|428WriicOqT7^xjLPcM=kk+zD|X!`l1z+~0kkd(PeGIp#l-FJr!Q z%u(JkzLAd?s>-rQ4xc@|XV0D^a(8as+p~wUbI+b*76*R;?-b>E`s~^B`yRPlH`QGu z=LX%JPECIJJSuna^{?m7{grY0*JDO+lEfQhy`E=I{Qa#zhSr$=_SU0ZGH3eCKVAm*gMU%w3v3)2YXDk8{r-8&a%!DYvNj zlivNbnxDdc3i~PS|63Rz2hCqSvA6v_aX~6%4KbU+B3Mf_mMT^wf+pCgIyZ&!TTZuC zTXv`EWSguL)}Nj^6Sh7xX=L0H0da(dc}O&X*RQ_p-8QjZLu~ zsSz*?(z~OhV-Httq$t0vKZ~Z=P>y*FRlMr@G~@>ujb>)s5`hO5J?8C~()IFPJS^|2 zwHG;yPkst=XK_-keg9B1P2YZ@kaNHI1@2@67njl^X9@)OHOn}nU0FQ&ys0F?40BG} zfR`0JA;2PFb|=H*X}Zm~uia3BnbCvMB8QM%3+Jzywb329vvTXR!Uw5(qYaRcxQxDi z6+Xa#bl6-m7T4EN&ymt+u^}!L5BHiwW2Xtf9Hyryt`$0benjLt4!@IQ z*4iB)vC=eCHJ)in=IEMz{EDeu$*>n}gOWmxN9G#%HVnW}qc zN7N1d*k6AL_UOwpRn(NW+U4xw5&Z((+{KamxiwGnXkWGMC-IvomXZkye+oI`}r}S7^j|wK&0sDBTd3T4wqF(12qmJZIHErzzU<94XTFsH7q$Xjw zvS(3mHl}2`rU8j7{!3%#!w%N_`K>h8xsj1;**)O7%BT>+qdd@?+`XR(ww4SG$5wK( zf*!)qjUjDtr945q(gmx2d?ajq@<+15&zNw@yZzPXm2GW!?Z zf_A=*^>pig`YDZEpB)Q*GT+&24S%2e}hx<3EqonA2ZY`&UFUeKxsztWIi zjE&xFZmxG?AN{FD5Ar7GV_1@0P+WYJOV@Y+#uYcnz_Gy2KjjUMoHy3>NYg9ftWa#Vb z8)Kesz@)iUMcU}6#6wGY>|1=;%h;&~we^YCpqhadtB7hb{+OPJUAubM&jrpd# zuhjWe+WVaq^p_&wk1)UVuD9`R ztSHj@z=O&m{URrOd;7Z)LaclRBU$q>R9#>-Fz3yg-IP=clXr$Er&4YPH-ZR59zrE z&2}?|4D}r1jEu&wm^KkUX4qLz7r3qN1F z{-RS)Kwx=)J=d&N>?P|277GqGTrl~geW|->dGj45B~}pq_A>>rid%er4@IqaHac{% zc+91nn)c<*zbX za_P2zkT#{J!Vw>CT2GaJ#(?5J8~^E3Bw~o89N`SMsVp}As@@;+#KAG*_PFzG*8vS_ zcY;)_2*g%S^^m;0JezyMB2c?F((~NfsLvv9!OKAO+GAMqZNKo=f&?=!JoeQYHMHy4 zhs$LdlKiI1lt~CGs}%pIS>>}MC<>9D3FcITUpA~SYzEG&kKF8?gxb0$nxaYV>)r6< z)#5GzOSLfPP8Ez`nd(eTz-O*0do;vwJQzSK)V}&u4}x znmn9gYSokRpypL#>sr+bm2@@E3kfS_n-+n>S}z`*O_NZBhNEjqey9*K3u!ubb(E*S&iy zBi@Los1Q^a6WkNoz+0-7s;eWWBro5G7$*6P%@jB`7k>K`)ND3P9;vb%LJafvCo7k% zwPkw|hjLuzyBu!f*^Wx#mw>HGknsy3Se)nJ;1CmVoLb{f-@d`OpFoKvH#c>4z29X9SOTr^AY; zhCFO_Fl8A|y6FbZBpk&Ye(g2aMcmAvl*8O?XV}$tVvl*V7S#9<~mzv1&b4-VmuYF&lO{A4KFZyTH2QaR^|arzIhUNuJ8F6i}5pB7v5tCE(JlQZT!UHbCt zST(&A(Mlh0#vr-2c0_n!JF`87hzrF#h9=UN$1Y|F!m(6RMwthIZ{wA+v0=43m9QU%G&>}*-cZNH5pc`*v1?9S5;Rsy72 zD49(?Yk3^n2b@ZP)Z2p8DRzmng}Ke==I5HXOZB{&m`Hu&+ZrSL1O*(N9b{HEs+aNZ z%1|*Gb})hF#>T@*d7G=)wRsOiB+?)!UN*qd!4XHF6ezyn`rZ-CXY2x8&yQKy9VDV* zFPtA1jjC5cI*g^}8weVGNd}bzw`(toyc%T|36Ai!wEtxkNse><4t{!8*6%DpIx#`P z3ul@}t+#*r^l6@#O>n04vf|eQdz&ybnKQC%y}3@W!^6X)4J-j;Z~XvL{_~nty?l@* z-@exmg(JN{V4rp+tX=VCg8atSF3axsyarS+KCCVs8=B8-7n72ataEq5w6^VhDRJM< z-b(Mt)B3?l#?*kCurO!uL7UNv%^*&cZu4WM2qDIkJn&qL$+=$mD;80nWmQehji*co z$JDO@BD*=bc)it3Xu0A$HTTDwT@)R#~F+j8l(&ZB!d5LZ+v4 z^AJryJ4o{8C$qkoTG4X=X*+Ay_ zgPVmQ<`|89E(f6le4W~t_APE95;E!wum3e~_ zF2@)*bd8pJEmvc2K8iHlch%9~1>rV?4N4SjTz>2-S51Rox)dAPe`8IoBc&2ChD>z@UzxB@0)&iaEeUBYF z6Yh@dVeYI>d1>6ccN}PZu-sW*&}QJ`45TqaSUf=>LfF?iVr&HXxVTcjTmjT=tA-h(VPveV9K*W7R2Gp2QvpR)nV?0-!KAzz zKSz)CqCW}|aS3AzN$*$jn48|W|K(}SbT#?c06uvrDQ`Srap;3I)@5Ey(7cTYe^X9H1-j95 zqLP;di-n-CPqu>y6LocT+*u05fy}fm)Ovq!j_DZ_Kgd z*l3TrFBbwDng$^~dZ0|7sbO9eTWwq=;4qe;25BYV^p3tW2LZ(F+}ZAgyZj07K*?G) zO;~@*_?xgNYLb)jr7tDMJ;QBvYDB!Z#7%99^tLbv#=WdY9~&Dxzx1}ssOD&A!ZK?y z;|@xVuw8^N$HG~4%xS98Tzn2PF}0wjy!QjJm~y^#U${Q8RrZ2bx&foVuyxwKgyM@kn^z`94~NjZ9w~24O{>b zt1{QsbypPx$R0nQEJp-}{}50i$|J`*mpkc2&!2;5b>IN_q-7aa~CmzBHyVtDh0HjJu=^R8d%|#+9{Wr1uv$O38XcKhWV?b7$*XUDv)H0~yDg zYwF1f<=L+v90k0l!em2vbXew`b@OdPMPQ&H6tL;Zupj%t$i3oy_|Dwfw}ll5Kt|f` zGu1Vxg$8D=qwa4+5$Q!m{f@`GxfRbHMZDs96s4!LFn zNu8)qXAU3c>i7cS2-qU;hsAUzS(lQZ9jPw&=h40j?QuRT@?JwgnMY~v?RAFW(EN)D z@-v+ca`N&od48S>)IXL`iJ6v%+{l zky4ps9u#B#aPhsmiwnt2Up+_aa(9vjH=@8KUch$f`q{-L`-*N4Y*hEK$09F-WC!jA zCz~$dveRTx*LvZskMlA^k&3FpKu?mw`Q`#q*9vjdlov8W z#A~e;sTPksHCGbGAKwxs&Yi%5jY7zc*=9pGCo0|C6ugtpUAZz{3zZTMM}n&O<;COm z?}V)H2`DQo+kk8|)>_E`y>u3X8|s&lk(q>BcO;AgU->xQDvRLGevc#_Xmza%tiD-z z+n?ps+&v#QcXfeiNn*oF|F7-wDw`8QfHei2mfD){hNCi-qZ+@dj#-|O+DZ-P*7{X^ z1wgN`9ye_18PT^U>yC#l`B^$q+!JE_KzReNyK4R^)rLT=-}}1vr5EuV$<5R8W)l9{e`YAK0>*SgMM5%M zIb48TihK5}hO~vnOk(`TtGNC98*B?k+irT3ORRbWS5$Z|e?e_dVk@*tZ3g?yuqr5b zoiO93aMrJ&0&QIjGi75Hb?C`AxVm+V4OK$HqE%jQY;9pNeJ(o6&0Xg!F%A3EJ!d;L zQ+0dOhv!F2Il4Fiy?ngL$-yyMvdZTd7jwH5_f^^}->Nrjz8vM6p&%$`S^*-d*R1ss94XKeEd1aVKE9*qk2ZrTBgLQ?E`Q1t&1PNcgUOu_mu8Sm zx*OvaGyVB5Qq8N)`~AkV-RYQd|JjN~#R#E!DqD3`I7H(J34leFd9jyK$o;i`%&hZ~ zz$bknQrYJ1Q=mY|lM6C&o;5Kw?N*W7q@V~Qrp+l=)Gj@-JYKmswpkK4rT{4wOZZhw z-@X!r@Q-Lbew-wZkh;#zUA&d8neqj*ImP`r%D&=IJlcIGOx(G?1%;dh^%96)m;3l# zm()hP@~nM;6U9BK^kNonK0-+W$|{(Pusy}AlVt`d@Fk_Q@F_9VNP8FJ2A!=32~L`c zJ9MHZ&7hPEk1+ZG#|)?F=B|M1v@?D9z0*y5`{jYc>}Vw6O`;mqw^?lREjv3nZtL`} zl-|9goZ={QWZSf33n@`E)k|5bP}bEW)}ta+;z332C^O$>?V*eZ!g{{w4|X*3wvEp;C+~sG^$a*h`3gmflPd1MMQttqRo5!3L|!+3n86P!hl@R+`k3}2N^PyR2b65|!B5~+ z&{7-&T&{0cTQF-_D5W!>?J$~DMkKq=rfP9aaaQp1@|FTKY6ykU=U1RJLvb z@-qlgxgb|iWGl5!mUV&(PXfej5z<8m{|*qx*LOq|8!C^YC+b2a9wt7W zT4nlncXTJv+$iCo`{6Pgm77?2U;3~itC-VKm$qZFEUTbKo*eREPb|UznYb|Mkq64+ zaO6tex4SVz^hwVE9pz3d7zL(Z2&!GcS54!akHAMh|K$xhcl~yin!0_wWO%^)8y zucWRfDEsFQk7Dt}Vd$GM9btQH2(O+=Q+TFP-B=a=Pdrb5nxf}xB#Eu%%NNCgGtp9r zg}L5r%;gjCgYYjPaCkLdtEDS$$n73-?=|j@`(%Zq^qxX$u(^)3u!_w&t?Z-nq#&9; zn);b2G1gNy;DDJy4m)1Te9q> z7*OOB=hVa#&V~z$kIW>aSZx+dg)e&kwOzNVW|Ty(b4EGUph(^OnzifONV{J6LUYn-7ym zuxR!bQ1Ovh(G)ykwy>Y?AUpQ8w73LOlMZk5cV}^aQrc?_5AnNo@5e6a?iPfX;?HhDqE!HP9_`6bc zqR?n28{h(3X*_pS(mUVZ9Cu%L00rS72~$hnr=hQ3V%FNN5W=HdV25;YaEKBM+m6jf z9jQC_KMs^5a=~`a@W(x4SDMBiH^>I5AVL^=mBScI#@*-O;Ml%{QQ|rZ;%|k*Q{j+c zjdZ~0&YTG=U&sP{`Naun*fm3W5oLM#=H@iaVwqCKqBb50)a^2J55$EiQAcExsR`8=_N=bD_U%BM%}XPtR0}Xqh6mzGpV%aJ|s9KWFs35vnOwc z`kxi_oatx@;U$_ZkL?F$zkLfV3I+wapg)hb*hw_+9}SKhCA-eafDh0oP>|8*Q{m6w zIlAX>uQ8>6+j)wg!hQ<-DeS*m*sgiW9_<`a+naay?BUq?u4*Su-|w?cVE+4WBn;1Q z)V~wlX#*Y=2W1q`vIq ze+v64?5D8*Qeg=Yrw9M&1^oM>{O>O;l;!VlRYm-JAp0ro|F*Etlq|&J1I=#dUusd< z#^0iE8vkDNz~siW12@0WOYLQTIGtw`T7CV7{O{UtPhVBjS9ldHq<5lHw&R|#ZDO*U zZ&lk@r`0wSi<8st(!U%(cx&R)ANwk=+HFW|^}#C#K06m6;ptcj?4~CQv$%*rt}d~+ zxD9qTmraeD_{l5hko7HPYGYHGB zi$RhCMI)Nx?j_<&%d_gd*BALsnrHJ6n0Q&!2V!sWC}ON$=nPkt@AM>BOKY-&fkTBVE~e<)~({ z*_46TgQNRk5&i61%$F43{Z5@DFrZc2jbu^WfFpmHqW--eFS(S_D%SH^enTegVD{KHwQG$lmkt^4HhFP zWYYJg5xbW5l4Y^48Y%Z47oFx2I7N51#*dkaDp4wyM&f6-YbK5FzEKX-`*GZT784*v zc&n!TV&|j#Xxb*s{ea87ysX!a?&Mr3f8B9v#<%^q6P(IcX|2?cJ^X05<5BvM$pREwPBxe)nShsE(4KVRy4(D%Dw3b?O* za}tZ{J0}(R0v?olucj{uHGAk}89;Ywc(aP&hrTdTw;a=kyOXBBgf;TbRpkX>MsznSZUf zG1F=J`O)5EJDNqJR_3N1v2^x1e)( zWPd>X`qoN_IL%D1y)R0X}}ldz20}70HeD z^nldFL~}cIU|`#73r0XkYUwj8SlE2wM0(*=f8EMBJ7oe&Y9FcTC*x~}VRq$T2*FPj zFSRFk+ZQ&OMlMeVAlIH$ROHnqI?oOfr-U(tMt+Rd%86MVlZ9oz1aU41g4rVOWZy@B zOwy|8%OGM{!nE19E-NKv_3afc+_%->4el{N=~@WRnYd6);)WMyl&4A& zd-_Doo z3^VmVE57k~YYXGW>(ZZR9Uvt(9_?Y%o0BM(-)NF8Jg`(6;AM4#xFIW0phrr!u(U*b zuDltr!;j7@OKqyvvN-Bvn`I|MU`0+;Qg-l$*bk?E6veBXV+YJA$auJHpH10j`GMu9 zkum-=LSBSCdH>{uE zVu&(jz9FX}6ymixIn0i9Ee3wkTFpf1e}7Y&ur?j);XJ3!vg7@~@1gafv+i@5VRibd zs!M*h`UcwCJp)tM44WZb7VIs~&dz`auGV<;<#LBhY}OmOb;Br`7M;a)*CU#g(a25U zs$-K_C^Q8{`OD8X3rQ-%Mtg|q96c+LV>`U}F2B6IysY0@G!NQq;{^aJ+!LgXVoC?pw<~LE=oO@+7g5t1+iQ z7%3?!QCQ1|&SV~7zL%&@nzXNt>H*eEjVw2Jv3t&R40$C^sk3gS9ZlZigKXBKBqYPS z(_p1$treH@{g@GVLA+YtYE#JG##H#AGYPR+vKoiKZ(uNF9I7Nf@me~(#Ire)DR2`w z&aGk>nY+F#tE(!K>-=@saW7i=$S+}(*qy~#Qg+n&oWg_S@6IxDNW z&Y|_=ekGf2vD@LIp9NxDJWp7k?S>%+83hF+#xKO&_FL@DMmVCg>_$tB(h|P0%|9bB zU|g3gLWI$Fe-2X}Pn9-xWCR6s56ey23>L+=7q9!Z^TD_R-Rc7K!}~RLdJP-jrPr*2 z@Xx7qmIAgpKABm&aYkxuV2Up#ZAe>9O^s6ianP>g?qJ~Ne10eplKZqNN-S7rNAwde znsoQbUC7208pg!8)ou#yhY%ihrRa24^g>W>jr5Q$ci;mt?y=7lFY&vrbez&keC)>CoBt+OKyVpq!Lii)k znwX)&n2Wz}-IqhH{SLm{WuWH$8()nUT4N9zoieR-PCXCibwwhYOyZRyvdq<-N#6Mb z*Gqu|aB##n!8Ej8%}A4*Se2QsRFAd2&I_LE)P$?ly3636KD7=i%yUsdOOZZm3OY`C zIbzGswuC9h#l>9`o*2U5N*mHjH)N-sit3VQw9Yy7;TwcoN|xwWbsjg142U8oW2`5Gge&fmfk%(I=vnT1kpGdQD^1I}s$ z^8l0q+c~eOs3_q~VYa>K`G}@8?PV9-g5-BwxJ|0B25*koUBGNjDaN~06=+i5#_b91+>d7x+H*b6jej0u{WHguZ(%9Sgu zVopZh5fn16g|ZR~4Zwl`R~Hl?*RHhnvgh43xEFcT6eP)0^WQ`i(c~!Zw1Tqo=ynz8 zYGOQF1h8D!%^pMkVRuWi8`djEFF%GqOwls~5F7-C*mNO40zZ=s;b4k(Z0_#MlN6wi zlAF-BwOFk3YzB3qk{ROuP_p3>|FwDX`yB~M9*d=t23?(5j#tKd0 zg2^CuVaObSnu!Y=;U8pEmhZfSjMD+;-s92aLo-YNtXz4MQ5jI8nmfZmY1$7_`W`YFl znwBzm?O|2VDXC1Y^zmoEiHhqCxzFYTUSOFKUsBS*fLuZs>IsUJIZVD39`@wL4gFDO zH~KWF)-QtE6}sWOa^c7FW;I_wn4-o`Q0yoqsQc(sIOmzCgv0dxM^D?;$4jjjB1y{i z4Gord8+DxQUdz=Kf9yc-&S@6oNg0kUq&{B=S*)3_qoYILxpRWqrXaptqq>>{I030e zidYpB(2Q?K5A~FJd5jZT92+yyTNCE-(S$HSLaEN~!V%nL@&nMLedXEwnq|vl&j!At zRO?#VEtxVAsoI&IAZ>Ml>})gG=Q97Yz9E2%cYYvIt(Pz8ut!H%svfolT?}@N8`8^m zwzOV&Q(rHJm~Kn8?$0}xI#Y-)%bru|EF4|4H)a>z_`0+5$Vedjk7DVw&1GKRmeP+T z#hW+FK_aXxrFK{Gzi${@o!+zibszQqzfocO6WC8+KY{&kff2$z3jWax__qc5p9w6K zCLFSuX_jb|IydAU?C~9f7Ypuy5pkszL>C>qn&g;HjpFZvKV8@@ZqK6(+8zMi^Opf^ z;i3YNvCnH{;v#hIt90S^uQ|Vc{cwyfWuw}9C)_^rR_2Omy8Yv889uyvc~(m!<%J(U zetbC9820@pgUWw>AMM}Po?&8t2X^pZ3|jnqVEwmM;!j{df&B#b6WIR`V0ie(f`nKS z0g1;)8NJT9bn$ncPY)P>H_y>crRUO4R$rrYuwp!UGROHtC!Cv6SpN~%ep2BQw{Efd zx_NRQLAyN3+1fgh`Fz5$TQ^(|Cja@%-l;G#tp4h+2jAbgQ^X5(*k)@w z9(@}vc=F>QcJU?k#{k}0=V>o$hEle^W#cQD_^y0HH#Ij?8)^5^wA;Mja$3Ml6^TTy zJ*}#HR^~ZBN8LLACOFu+jw6(+Kvn5oHx??J zrHFGie$0#YCYQ=yvk^At`?HK2s07_&*Z7r(cF-lIXH=NCxPp^R_)oy^G|cV%u;Rw< zzI6+;h~0gl%60L?mQOxGDpG|B374sDw{Y4~t8l@_6Mt>uHX z4^{W7F}t90Z$rK9cXs|;r%1is*b7dV={63k)U&(BwG3J_9#qmpO0G&?JpN*y&uD>x zT}tBn^0Yt2_&nsWP>4Ns^5iEUbuNufq^HDshZ@it zzPw(0edpr6MD@u~qoWkb;rN--ig9>wZi*y?w|?z7#~6_pmq$J7+^4k99$s~iRQ)>tuH;~Xw1KNxYnGewj(^?Y zeZ%cfSMCNd|20WJsF;C@}NCViGzcG-0<#QpMilAiwy>`@5yqH%WWFf-G{bi zW9z1q!=G{}oPybvqpEAmy&{PS z9ggfb$}*VkvewJBXwNhZwHb83RUDU+VntXJ4&j5T>lS(TW>up-v(oIxFHI-Q1r1al zB@&LwdS2L3&U(8722(jLn3rtQcN+>Cj zaFm!y7`G`|-k7&3TdHWs4S5jzaxGofG^4~3%-6=I>NTEnN#REZ@5ZDxHrBFvwD}1u z-(hgXB3=8fyPG0}O^X9q92;MR!h}9%WEkfd8XFs{NUndo5Fn9ZGuSuJ_X#dfNoy9f zR7FdX0882-2RE!kXtI`SeC)l%ep}3DTm(|z%k$iPuol^+jsv?zT5OSpZ_liym2Rwv zlzok<9gVrIbmvksc{1Y&bJws#!*ly_n}kbczmqs8m&mc9(Zn7@hIz9OcVlXnOOT}a zX|!#b=z2XjWZzbRDQJ*&E#j#jnv^c_r zpj+y$F%`?Jmp6c-MENp7@S_ary&G^v=;@Ye+qX!po=qW_8tM+J-DO^kkN*M(X~P$(e5*u3{tMbQb$=ttOg3?`lr~op9l>n zuc!A+*yDE!zIL@$ zC{Ednga2Yso%jO2bGa6mb{vkM>t}=^2CerUh-4bxY=E=*?Ep{6r495mDNOJ!OHlcE zvWTtG?cd*o$kEsLG)gy!udWR>a0hVxTKTqTHs4*-YKh!*nd-?ho?RYCy@`m(ADpaZ zr$Cptg41)@CGdf)rSp5~SnQ@_FN}?kRnrf<&knaX>$~(mk5h8YC*JctMYl1x*@Q1} zn0(1aPtSxbahe`$97t5_)=cfYB`#z)lCg$RL_Ll17emUzPi=#Hq)S_*y>E6WZ`LjA zYxk^J!o`aSBsFEx3(*Y?4F<@~UbE0aH|)DaHF#YkuP%!Sati`N?eM}>@uD)k#PxwE ziV>wZ3|GSbFu zYnt0qxd+;9s;)6IA_A9<9@NtAagc3D$B-=~fXhPoq|Wz+4V4nBR`qO2#e~Um|5**v zp9VwN2hXjE^hyy^HLD(rBvc}`zL>d6lgb|znJ)}5aI-T=t}VgblJxS~mP^c9Yl~OD zyuA_t-CBb1JA$&ZHh>}n99Sb8iXzJ{52V3r&6rr6RPRclR_cn{+9o@B@@)o%k~GI_ zl*ZiV`#LoY=G!K}8eIy63<&F`?(1WQ!8x}W>DYR>k~FVxZt7VN z7Uk9_1H+^HO#~vf{e&d^(rOunv`C)O!j)`Jb*!wcd|&@EO|7HK_~O@FaKz2B%GinBQqcC*Pj?& z?@hQnzN3H^B0UH^dO(@2Q(K$tgLajS+fUwF+*%I6^kzKp%Ha+9=_ zrsKp994Wd?@FLN0yN1-s5|x86ScU z6yw#Em6azAb$Xw%S}TXGV7b!y^zw|h@XRq$n=9pyf$`q<&~b6u7%2~xz>lbHKP1k^ zX2=DhnaUL1j~`D}`oN>g zPVsHI*1XCeaveu++kP;iGLXX;&;?l%Ax@c48i*kc-K6v4@LHd4PcJFif>Ye5CqvN@VE5`=j1Yi_ z_c~<2R?>m41p88-qtU^)d*h*eKAKW# zx*A2?DjEwAr*C$4f)OB&cjs9bH|nc?^_=*UxvbC-!dp1*AAwlAPuz$aFU)b$Q5TQJ ztl-KJlk439zKbckxmkdAe@|YYXvzmw;mL`K9E;9NQp#v@jWT<0j(IzXlmP*(;w~>- zdb`V9)(~a<7p2O!RvgvhB+3SxjrpqbrjNF}kxohAK&0&QfGon|~$Ul-0Ro zd3kHV5p@LuNk>wEt_Oh&cuFi37_=@FELAiVgJ{dnsdN^KSn%mjW3{ik*4x_~<_318 zBC+gaW-4UeCji(2?q=dSlAB2jU)c4@Wsilz`KL_s5B5I%M=v0HC|Gu7HKNuL1TU&< zT5!?^NU_=eVJYtI6tSIbXK)lkH|JPk0shPO+06R`&M=$K-VHps5m0fZ7}*@wlYq)2Py!7&W|>pg~;V&Vci8igGGAWc+>-ikL%50fO4Mk`y2XVWsLhdcK% zDE5IQsm$)SSc(`c^uSgAOFYT2V*gV2s8j4H(yWJp=W=@g;6Rpf1E_pVnmxtK_>I2A zwk~koXeS?k!qyujNsn#em@q zX&>*H(m2a*X>sS7@UT!mnCEP2x6M#VVK`}+LhiPgI8Pc}T?zm0W6HZstv5E*pfktZ z#$*TpvCfB4s!pJ^Gau@dWY~|_0Hz04ks}~IS3zAiH&iM@__J);FPcO|Gqa;T780#v zw*SQd^VN|O{5$d?fQ{u3TtDys$J)&H1A!$!mL|e6j$@nK z%)FYBNil526?k)SE@C(eNt_p^Y~(`&7Jp+EqqY>^cgfS#bsez6LN~yHy_y6=)8Q2J zsb-+IHZ4F)eP4>b4dGLPYp_iZ6wX#N!OwUdVuCqUi!YXlnl`62E;ozUI?Z&XTK9jf z7xz8@ld$aaXpbum5d{wBKJG_}+WefV%bH^|7`_$-vQ2%!NhbEqN_K-2^TwqfI5|`j z7L5)RMdBaS!4Q5*a5uN6a6#@nlp)PD{Y;alBoJpcku$}^rSE~0e?Rurl!G+Ko~jVK zaN^RyaH3jhy>LUl(A&3-143nXRmX-;L&@YzO5wNRe_jtO8GW{V6+of!eFsVuxWQ1EQov`F#43^aFNXkTgqDe31%Uylk>*FbuQc<@SI6B)hxuA zG|dz`LOp>QhVbg$+bsTsvBDs+`mUps)LJ%I=Q_=QT}+$(`eC)|1w-jtTXu^SaU#b& z9TZVq^y@R7;uEjO$fOp@sdp!0BtK{*3qi@tet?Tdi8iAttw8r_B`Zbs;&nzVGs&`m z;UJI{B3uPcb`Ku;^ERk$q9rkIfSu3vt$#Ix%UwJUCA200#%8!O0VR#Iw`i%WTOm?G zg%yvM8cE4MAZQu#y^v_&$Rnj=e;hoqCRrs!*~4DRU1V-zYS6#Vw}-PURgXv}@_#>p zXGfR?Ej7O;X+#`lJ*s@kas}c6b|LC$!V3c#Hn9zzA>+Fbq~`uC;|P$D?)vE#yC})k zH6CG>f?>!|ErK#3oAFehJVg->%<-7`QiZf{NE5dL1IZ`fygl>gPK?VyCD&2pe>_U< zb6Ize`9iBKJNvvTC`jX#VQpGD=(?t+eg+h5=ZZP|$HjYgzy8~|e|`e{&jH5A{c~#Q zC$RrUzyg0v{M}F@nh}a7*+XS+ux6QT*6gId_ZzfLM2n%KHl^wBHlA=!=by&~ci*H= zIFuZ!mBO9+{GhbC`SiEen0Dz04@RB4VNAzf?dzYM5LiQuZ(sL_1fxl33Fn#)&&H-d zziI?&)GcuDLp_U=k?|4ues>V{@xnjdKKq|>RzHFL1ojiyPhkJ%z{u<#I5wDuGsN9< zJ}Qdo@so=Z6>0{L@A<0B7pAs7eDktX?belpclPUA^6JCmUHg(^BPMSDqZgo^8t=|n z+BG!Zs+r8&^-@-5CR^&+y1P~GZ@e0B4j=#Xj}pThY=3bsd9%#;e{(OiuYW5g{{;3E*uNvN>cBc9+ULVB)~BqTh{)J7u7pX7qR|8}uz*SzC!B$6;aSmf-xarb)ItLle|)uPzQ z?f=O^1utd4YxGd~#jUXldWa$~5PCgqAl}r`!Qqlp_(>{)@?C>($1s_OSA?v?KvY216wi?G(wqRrDaaHFW<^_`1xiebm8 z7v7BBeW681!opy2eD`$6pVDDLhfZ8N$;3pRO|jecNCvwbRpZNH{HAfIG8qJlBBUBy zTF^q)x>Q4?+f{+n)hFDIIq=)**SZ&j>Yic4=Bdw^qn@qEuAe)JJc?66M-$HYR-ffK zeb2$sG5$Y*p1VP7EBn4p1gR`^CTp$Te0)A>XLc?2A!qnLU5dqqxvb*nhR?uSP^IxrWlTV#I&l$IUlAG_#r9MMtQ+VA|oSToZ$R^_+ReOc$v>LSm!z;chUvj7&aNs-y}D3oM*dY^Dk`wAp1*V zQqQs0nTy9W7i6(i9s5K88>N|rIl7lwt6Sn~zQiv_O|AQkl`wIL9Sz$RyrB6_8uj%+ zfp*<@a|5om(VNHY@OQd6y3=~7_h(r0X#cI3v~vH^|Ha;W$2FOJ|D*25UD*|ZRToha z(6t~Spd!6Q*Mf>P=`|wKs~|Oy*botg6$GS4L3*#DqaY$RAe{h_8hU_0dbxvPU&h_N zf85{e-q*KW^B?mJ^PF?$%=^60%sexL&;*@bKLm%*Eqa9yU*Er3YyA6HY2O9=F4%X$ z{?9+1;6RYz>Z~l%v1)kOjq3Y&O^Pv0{BeJr1SAIqzwObw;4 zjW`v%U}%}y)d5q<7ZKN7!c~eGndxDPDikw6Kfld`=tMav%Uwg4`94Vk4y)`r{bF^s zi2Y*m9mQ&?kzbxV`Ms#&jd=dAKA13%3hS^CZP8bOE3Z(C?-EeX`RuYPe$1vE=!GLkv29G(I+VLbGG?FG=D#znVQ!r^QAv+Gwx11V1=Tmd8QhawuerBxDRo7>x+dY}Upo;d4pRRsjI z#th{;IN_v+@?TSM94>FR{_yl!<4xVrXh}0ApQT=4+IYd^Cr;GPB#Z12QA@747Z*1- zSS)=xAA^#931JQP+yq@P>W7o`^75J`6czooNjLYr3dfpZ>HJ6)qG1t+cNv`+u<#l2 zo=x329lWds#*D<*d92TkT84+ zJHCj*lF_V$_z*TabjBU|YfDa)i!Ywz8v)ZQ;}gW!GNfUG2pCD2o;!MU^=KQcD>AX#NSZ=MZS4Ob@ENG>AqsLnx!FeNmHKjyR>wES9Vcxu^>G3)@i?qXP%}r zYG2fGH~!XV40BDp+|7)QhwX1PKCvNT5k9tmBt89l+LDhOZx-7@VXMvQmtd>ukeZj4M|Oq8 zyVYjDd1KZc3-Uq6a&W)T0=Z7a-`BLa37=hpifzUunbt?XM=gJ7UyU& zz!X~3y0sy3gT#6HR~A)=1$le=`ynj)?%2gEqR$-nLqEP$xNQoo5YS6kSxql>(z7l+T zz9+bPp-544f_op9{2?e-zNfEGZN2AynoQvUggHcjlY+Oj=O&-+X;9xpZt+qm-mNGpb>*eZd*^^x6f@w#x7KGhE0y1BLW9mNNEAQ%| ztJ}24GAbrU-ueTpnlkP531gS!2a-^{9Cb1iaheBZm!z1vd9-)#B~EijnU*=vl4^aJ z05Fk?V#jArdM_wyiUI(e>34gJQ}Y?$XZIA3AIzAsiP^en0I`yI(vi4jzr8dsQ$k0_>(qgpU-O6g^&qJFV zc}z3E3BR`Mb487z0*fn#E-o%}u5;oNW?lBjl$B{M5^inn?a$Pb4u_xkn1gbGvCiYd zm6v2BhlNgl)(g4t`+A`sz)v5jS8rnslsUm++5;pc3PVMRLfLX?aXk+o1iKX$?Xzlr|xkrU2$t|H3FDBm61XKkU($0 zFqI`dtvAM z>sY4%2XP4(Ru7z+e8S&q30sUpVVUz7x4J?Awe|>dr^h=#oQ1Jz43cNvR&|webJ`C46>vM7tAO+Cq|luF{(X%W=LHU0c8`6yM3Hrr@ivJ zdSn-a%5&h%3|Sh!^5TcB+X83kAg;SsuVkS{O%E)(H8v)i2?Lilf(8--NentrJTo`f z#aE&ieB@nIo`Mpk@IMLD4@`TutrYUIKu0&#xP;yG>=H}VX*T>hhz+fnK@Vr3v zUo17csu80OlLQ`f-tM}H*IW;GEw#58U&qP=U~AhNos}jN6%`LB77Ggd+mHSvU@jLx zetgMCFi24Ceq3BMl^aCXf9Zg?W9fhxKH%beMvMfEZa$BOdbAR>^YEp>MW@|W-ix}% z#yxkK)cO2@bY}gigt&N;B4M>>V{@ncsIN;`atw=(W4XS#Xk6vpo}d^LCZxQgjHUEH z!nq6`cy2<%Bic~4Ub-dWLuIP$b=QOXoX+@qW1F0$$!dR__jFq;TERMio3Os_)%8PP z4Gi5QYuh#e;uM6r5(J@-#X=afjkiw6?lUgdk38OU@YoGl&6N4K5ZI7OezsfsSw@vM1jRfZc9w6%UNd zM#PAO5iVO<-L@Us*acb%T(aTEh6X+~CN$<^CNz$^rTNxopE!qb*z7IX1|Z8I{b;%rLb_Hm#$86cRqoUktTmeu}A$pq`Y36y0iu%FLg8 z5a#APU()?y#2d4YKoC9w*y9maDG4&FS??PcbS*z!YLBhGL0;Y&W9e_e9wZr@6E8os zwzSOk<=WZOJ|3=fa9v$#5~-aCt61@+heB13dK#Nlh*9@$fy|ohzQr%#r1yZN{6yW9LxYPND-DV2%a_?27o`a z(fU8%bWNo+f>P2(1>CWGD%uIK0i9I#n!B#wbDJG~bMo`Gu}VwjhoCH~ytufbU6STVoGJ}-_)-FJU}cZV z%r8T}t64PMkFjoqge`@vc~e$XQKSAAbK=KmIzh4uMph43Mpjl%W~KwV=ix6n*|xK{ z65Q*T#q?@r-A2*f7yuXmrNz9arl!^x2Gi5hl-2=ajk=L9&pBE8jJSX-?yn5Qii&1XaXtgWHBIo<_+ke~l=~B4b#C>k5(8il1mFr|Wu5N9$Rr(DYzOXz$10nI!2m+rElfz$ZoB@aN-~i zJ}rZ6O$cDoSfCjceaVN?N2tNV3j-xcrJ}lJBY;oDd2Ep4A3qZ>3ON9`T8s0{wA5m>CYZDw}3~{&sQ0 z{pW%5%ISL*Q<)cor7F_l#p>_h6<9YBKYg0w=br*m8?yS5xQOwY!T6l*&l@2rm|IxX z0773`Ib>Nw-AD^*4bhSYAoHlOZYo>Euvq+oI^HuqnMc-Tyc#D~>_q@o)HN(iF7nVb zFtC{u^jaKB(TH(PRE`OFXw-F|JxLm8TH+8R%ZOutCdizp*aGUM~xl=aBOApOM!tRb|by7w7J3Usd_LQa_uW zh`q+~aYOLkTc?LC^hCO@=9(1SetL5y^J2KL>U4X&K-bmAn}rL*#+wUfSH4-5Gd|JM z9I9S&eXyc%#7kK(wDQ(71Uqd$;7E^g`rAvt_vd%Pz6bCY(IMVTstVbwTA#_0 zzaG4>{m1|OXFSz%&yUr*zfC-Q74-N&me=#0G|t(ST+i;EYb&!rjpQjAsw?*zV8SY$ zl%p%RUp{rbtny&4&IRjiMeXVuiUBM`oQacW0*4T*^pa{{@n}Ay^89I0iXkUVf5& zFdjzy%Gdwxyjm1dFGreoPCNF?my2h%*jqRL^7XlC!*g}v*!GK(F{5aC_S-O=$otC6 z+qF){j z?ECh<+ug^mUB(;mdsGZJ2}>o+_T`#sYHG4oPyA-zr{RW-ug?dk*&f-us!gz4ZD}I3loQ--vKF_N-nUNB96@PT^ z_ROHPRpp>F4R5YQUe(ap{iVjjHxuv+$77&yKda+!_NZm};79EeZeQ9|pL4n7u8_^! zyFVBh7*Gz8lAIwBfhRkF<&KMqv7N7=_?wNYTQw6DP9daw_LS-B>Yj2PE@vxL_06?r z-mmU$k3kgY2{xEI3PMB3Ydp6$1 zw^?EpO2qe?-+#)omzvkbV!o8#m(coKvs()P$+Wuu2Nm&){;lNhzwE~R7lQe{=zG!k zqW{~XtGmAbwQys;KOa+IHDc!GVqC|3My1MQN+o8yQj*ofEvKeb{fWcHB_(IrL00RV zJ@Z&uIk_YsORw|i1Is*#gA>x#%h|JfzAKHDLqnN_Y1Imc?hlIx=CO#*Uqqj7oTi0N zg289*rE0{Odo)*Mt^**)kHXT~ao(5nfUGSDd7q`-niJf9#kQJ)5ay?d2yL=Jy3g?K z?!)2qWJOUHxk-S~AC3qxvzc0U%4b-nYbCOkD#;z^_$EY5l{(XaSvYg12OUqkk8&L`eFj_d_%CgngQi8UYF= ztExv#QVS%`fj$^0v{NOt4ad7ui65Tfe@m(bGA&gTrswmj6qS)It^gJdGQ`BgS3<4( z@+>S~hC`TdG^A^k*etV{6N>BORcSGU<^~29CWh74N={SuoK|`M<^Nyha(>8g!N^QmHa-T5$v->kFD1_f1Xk8r!7a&bL!9QnAS>cA&$c8dYn@(J)7^%_F*v}Tnanj*>y1n z7rf~QsYkwg!LI|KQZ+2$6uzK}l9D^*W!)gZwHX=VfaN-FPnX4>u?BTHoReFf1+tx= zzvjBeB!a=DA!5J$>kYf(90B=9xj-tqxFRd7@_aCF5T!@Ysfd9~GApocpKqs_nwa36 z;Sc#+4{ZCm%r2s?Lh(TI!vYZH2D!)y}p zS>zt)h6VFtJM=)cpQqJQzZ>@4170WUot})sLHdAox1gXPg!lkSGq-VYa44(BC1ISL zHV5Ot6lXAgFKhkb!QgO7nU4GLZPCR-bzJ>$rw(hayG~0a-MT3Zm*`{ForrOzjmq|$ zpY~bG-y~f1oH%o+hI|urBtoj~;>C-=^qA?hO<_XWSy^@+0T~53xrwF*vUAoD*iyyr zJ(6)yBh*PuGn$fJQnJ>0KA4Dy%-r3|%tWx>jZ~2?e`&Cw^_wF{#knOWg}izSr=~_A zzG;>I=H3ew90CQb3tJi#4NP!D(9#55$uV}wz_i)vjcM`|zDfxGXp1Uu<&WOb{C@W9MB)r{kIeW(t`MuJw78TUo&5bLbmea+_VHIfAj+ zZ%M-gMoZPTo14d)me@1-5WW)>95P_BGzJV3Oo@Z_za$n1lZS>J%uue9ZLozd%1i4k zwYka6^uAk!iEzlLfq|ECxc9r&vHtU_q)}y;Pj4jnl$~e1wbWR2yld4W43{9Y`be;r z(jp=KZ~4;B_5=!KP{m{NCCDnml@uL&1{NH^co?pzyDHg*a;uArL)6ZuRi$Yq658EH zU$RW|Eo&falU4XyT900M;CeQ+5?{+=bM4MD&JKO2LK?nrkZpLY^^|pOL1IIqG9sSW~Rxq6Rlsd>s{_c8P6 z&0+i-2g2OC@}wJI-> z2Qzf7QHsk1Bvu*0>}C(5p{rLox-f!DMNPNEPMb-Yta^B@clPW8DQ@hU*(W_$c~uHn z21XV>Lk_sn0D{-XRo=vnZBWi>U(uP?_zG|AV)(Pitl9j=u* z`3M;{TE~AgG$y;$MLMQyh(oZ|NvC**mFR7z(wo%*mLEVt2eIXUE@sd1^wS!aVO} z%!?OK4=9!$bxY?JQcCb0pK(@%5ubke@WI(cU;m8ju;SpVHo`wO&(+HDwE#3gEj~0f zluwQP=O%>z!8yVn)-e{{!d2x|&4ghKk6lMv^tcl}T4D!>*`1(?3=oSWODl}J5Xrb1snTyDzNN;D)niP2Mv$ty!*q0;;9^y z?l?6`Nl8`8WOwn#QOtSO9^(uWcB2;;5ppcP_|sFhPI(o#CO-HSwG+^F$JxDRCdM(7 z^W*YN3ZI=P7>?lz;~8rq`bJ3NYAfP+8yG}Tn9JZO3?Hv51Yt^K8`hNFcvtO=ONTIS zGxsYjccz3X<@w-isKmvXI+Rnt6k=h$-zd+r#-l5l0)l6i3*4sdrSt)hk2^O9$`j7* zfJ<)eas5b`>$$Q6GSl3%k^4`LZ@_^KVY)rY21L9sy&4@A6^K(tF(*YKzB8|pvVrrd zF_s^pnSLG0ZsX*Ym}6hsvOmu;_jGq;WNlWjsN&6=H@_KS36*arcV*E#Nw12=aBG?i`^%gMi#(=Q zd$W!5j0Sni)IE&sCk^1bML(f6Y7MgPS`l^pD)Al@-RzQ15;gk7|JoAWE| zk-i}tmOLSEij8-lCw}|qbRP%fe7lr-zG-}^M)`>MDZrO4%A8H$Go7y+)MyKl1C77& zf8oD(KR)rOFz2|sO31nK34b~g?hhaE!3K)>&%EB8UXI|LC;0OF^ zz88Hj`hQZi%vu=n^EFtnkY0}Z^X#taAL~^<9`sy!qOSYH#dBx%3rwA0&V|AkoOE+M z^NGh*O-p%8?S))ROLLpdoN{;HPySiq?pEHPUmVOhe*fApp1UqzUQ$|uMbm!#_{umk z2aOvilO*%r!e)|kTl62hWgaV2{;}LV-29KNH{)9WRL5ua9}~&tk^k7C z^FEROkASc=`Hz*I@1lJd?SHjs7LI=}`qk}!yi)%qqKQpSO>wjrU=u9lZS3dgclGL3 zW6>vpWl`vdjrBp??1Q|>xT`#0>wZ3K-}&m?@7jlQc3;^Zg4@2RCh(=D&+$jUIZ|n2 zGE!UXw~(LNJ7zM@bL!-N<645kDOp+BDbMSC3krYD1)Sr#_?(A9Bk{3cg#1Qwu1lCQ zm!>cw!6QLp`p_3c%M3gM!hRP*iPI7XPVPQ-?PoPUy$szS&r@*q$$-}$zV!6xe{J+y zf1X9tGeLnKmHUSh_>j_-Gs!*rb)UCyJbWwv7OK7VtI!8E#Ked`Q46H**ms&e7jxGwjMLqCs||BapNT-!bk!BPVH!W4+31$diZ3`T*6sl| z&6u?Rt)(+XJ>06{5&PNlvk1<$%l>2+Oj&x8zvI!Z;PqpKivkuejB?STmWAn>ZAM^me-RSI|U*Z8k1QD;)v=E?Yp(*>7hTiV-Ir(WoZpGbT2<{>&# zRGWRK{44K2ztPF5{^2k05Oz`HdONZ)eSxJK&2NUObBCE^3k^LA7lPt}#`}XbQ5*e1y(D(OmV83YK8@(hb6hUCovJ97@l0h^A-um|5 z1M#OecDRS(Kn%Y9XUNqAsR}}eAg&#zrbG>f(1}py)XdTdA8&>-==+-0duFZ`#2|sB zD?J;RQcgv)*o(Sv5gHuKbnf{+8DVKDsjEGJsMRotTtr@I#w&+zTNVw0Rd5~li4?Fy zCv6^yP{ncUFy)nFt^21pNLxG9lc5b8NK5l=cGhKX&X=vvLqg{s z@GTiF_W$JI;ExCRXd{{T%q}YG7+Qg|pPwMzUPloQL)@VgQ z7WOL>F|^@;clZ79wKQ9W3Qt^^_oC9H@FZ2*jsptEGb-qG%`r3&c5b?zGA7vC;mW_% zSI0U8y6c*@c0N-L38!AM932mbFi%1d6VZ}C&Cc?em9@E!RJxFsxPr}Oo%&QVitFR8 zR>n~c8pW<7Lp*|Nm_lpVe4mSlCng9z<^Y*_CHyYtx}hPlL)qm%MMQRsv#~;z z11rulbPWy5tec1#?adBCJ@04Jk^E{zOK9QE!FGA*?ovKA@~tXwq5F=$pYJI{18&ns}cCEW1Xh^`K#igWp5%1{~PtxedQBifv_1W9_g!km0fY#m_ zDuL#iR|Me44u|bMZPOy#OHm30JztNjudm0rRxL#tSq|f_d3$%fxe~KOL@ldj1ULr? z2f>owap8?l%Qz1_7GW;awGu10d9^&^nNNaKyKqS`4*(mq_tYZW-H%xOk+TwL7o zX*5#MvZ+0un~1`_xdP#lKDXTa;>C-HsExf2O`kq}VzeJX&_i%YghL|l$1heO&vA}! z>hFNhN@U;e$umP8Q}`A5Q&+WLXhx#!eCAwrR!PYnCcQ!zR{u--1ut7$Lw$igOT%R@ z^Qkdf*Mzmo9J(Jl<=0H+qAWE^xc9VGjXxm}_tpOD&saA)rb+E!)_y{skS#q2XQm;U zYw9#^=+FGWO=9nK_aYecA`*k?)z$PeOq!+7NNQBD^g~Pk*&qTMLYRuN~G=)0BjO`|I$G#quGM0jtk5^`x^WuLf;guQu3Q@gmB&hC0z4iS{Rt zaf$x|{kc6!bz<048(Ly-^+nTPt-rz4)bqhwx{MyZ@P&awRdNfk)TO6;1xwLtv|Aue zjmnRMAY5o`E|?|CXv#c&kXF#NslzD*FI(6`FUjm zeL%)GfW-_xqHgpeI(pQ-!C)-*m%01PdaNddc~XLTXP!lHO1Q9a65+kl`0GMVCmx0s@1OXUn1a$!>3@88Dt))CaV6E=86rkfcCs2p2f-~&;Eot3FMMa-A z{N{7}k7+ae-yhZb8Q-w{M{xg9`pQ7tj=i=FKPSF5ePstEgx^uzS z*0$#uPP%&KgG8|%+P){F%O*xsNY44fDzE&=o%RGp^s%{IGnC4D&tYvf%4K8HA}tq~ zTUD|D#`>Irk%ia0G)=)>i+b9O^)?yAi>O|Ofx6}3TG~>))hYiq;%~@zg(;$A!O2R!Ojj9r?gH4Fl=VE5NpST_glyx z_4pCwQf_q&ff^X!$BvF)91DT}fT1n59cn*Ze#JNX5wB`(eTe_WGb02cUT~M4+JV~j zzIixf9xG~hd_hu$4>juVVtmGBXyJn(erd4SXSHkjy5;Rg%9v`jeT+1e3Ox7OJ{h%) z*8pMZprttVw5CDe4_u;8vriq&y9Z7jj2kSr(|;)@E?!9*HA^Y8 zLy!85tapxrL0)KG7uc=oV|VM;k)cHlim?*z!&Qo@4V^J))X!un2tZ zg_x1L3m9q$`b15O&uD>_g|Aw1v8QVtZc(^rI?vZB;}Z1H5LTNqzIqn;1d~Z?y{e({VE=wuM{|8N65>N6xr2PJvj)Re&l;`s9-unV)vS z$qj^*{HfrGi6grJF)agt;)qtn)h8qvzJu>L;5)E9mXhMVG;C7ky|~@6aI!i?%A!&T zcrPs;D4i0iC#pui;itp1TU2WnaD_l&$Ns#A4Kykhl*=(I{9QUD1Pr8V`szZ4>dJdJ zK$3hB4P!3ueI}8~a@9E(FJ5HtZ=!Qffy~7N7=#9{Yc>!5@QX-bi3fG9PBWg^$}LTQ zCzgI7@v*frz*_*IUS%8i3GSD7joA1+N!4e`6W9arS6x-_1&63>X>Z;n-2U*8Aq3dg z4G-m8A8!jOdyit>@uORlE0rkRqKS9>kE(Zn`V^)#H;`db?he0l<;v>Yg+cU%4dlJL zYx}NCVJeDQp`oGE?eY9QH)Aa1)`5eqeGo*zRvP;gJUb>^f~$P+{JkP@GF&HW`OZf;hZ^mE3$7^~QXEJN3sI^@MdqLQqI$qLs&8CL z3*aBBrAASPrJp>qFjy?Qv&p@YABSMkte0wO(SYwq;Rg$>8g?H3aB0yKty)^w4CtKTzLVJf>`qgcKRuPv*AdUc2_V>I8Ln(#&`0%4MPJPv@l#-H?Nhbyo zlh5@ngDq}z7VrR!j^oJe8;7M z0}f#)n?;d3djTOctMTtuYqEq>fw(~~7vT_vtK{#d2>C|)Wb)0YXFCQbu1$Cbmg5{%fy&FGo6ZAM!BY&gIJq0A|X=K(>G36 z40yQCB~r}-(OSw}0WnzAn3|dj<3p@AtCNO3=K;aC0qXiJ1$2&XO;qxl#gNQcsRYDnZ_LG@;G~(>FezY*F>30k>Ru zXEu5NqF!Po_RW><3|_=d9T#PvrJu2eJ>H9^x%41_)|b}fWV1D{Uaf~Hvj=Dbr7`4T)@+!` z$@Mdx#6?Vms98ydA@h&b;E@VXn2vz+P{~-kJWkqz>gtQmv8)kS_|-A4PRF=hCZkM9 znb{PQsI*@6YPw!~1P~Q=tkUAl`wJtZqc_ruu?Z;4>!z+Q;G@NWsW3Ovp>5l@uWs-n zhi>M}h=}WBrAIx%O~5K+bjejZ&4Y3-u!Nk8&3ilfiqc5H3Ssw_zWwi;SJx&I9%p6)xEc zzn}y3gZl&f^DLh2m))NA`VVG(Ofig<#}?bx5f3%~8fEFbZ`s<039BvvGC|KNK6W%+ zvYN$&0CJBa1vEV3QGco+=4jXMUs-?FgIWLb)Wn0KtT+m{iOI8+${c5Hef(&Rauxt* zL#eaJL6%mb$$KZmrKP0>&Lo6_O!Km)CXcp7xNr?0Ncs<*4--^eeFNAa0Q*DdN@W4R zl+2xDU67QKk*F8}U9AH$?-$#kgLxKg-g|c-lbY}Pb%f8=fblOvzi}O%6qr{-Oz#>8 z*-SWq+nV5}FjW@->__K1KSdshdDV=N;^5>CIfx6wLBbDp)cYGc5eT$!mhs!cE z`B~g0Aelx0hID^!u)G7(ZByYZR~p>61ywdBSx2lMfp) zBcoByts{SQKp^Co=G(vUC-0VXHOJNlHoX!zD+?$z19ZIR!4AieekfuJMCPYM*5N{4 zjr?`?ov+?8r(0WyKgt$*%}4K%G&NM*-3z=Ti&=3s?8642sk(o*V%ygsGZkU?b>d+8 z*-URXRNp8<=cNA{IRj3a5=d5Rfqwk>Q2_+W`=-wGeeDJv&e&SXigrL+dO^(4R?}}k z6Ff-|+OFIq4)8W6gBP-H6Jud?h5Uzo!y~VAn)W{sBMK<21LjtTT7yvD7 zf6U@sIndDtDPfNBa}u4J5q*mv@o&{hT-M~D8r1J_XarJ^^b*KiGpD|K$g)P|G(rucC}>aPTU`InQEy{ zPEKyIia^4ctd8=nBU zN=HC)PEJn5y;Kc>KtQ207Q1m~=QNK%<9f4=YM9hkgW4kpV6&+L;I+c+;1|WoV3RIu zXb373OELlhGheDEq=BL8SQ`LrBaaQxT#Z=_<`vRyroZDNsm{C-4xxfHHDIODt{=EU zSJ-~9t2zQIw1vp110&THpA&sX9}m?`?26cZ{7GnNx;D#9r!gG%dlnb3N)9mYIhT!7 z`!jf@U5`crhPe7Vn5n&bHA?Zf*MK>=Rj)W6-P+tNF!pSN89a#FtKw_y?VX(wxKPN- zSv@)?5-sRjKDX8#UNw{a%La0=l?mrmhN-afzWcgf9eMrZY&Xk$Hgz`?wwMYi(^X3Y zLqj4UG^_F(`%y^Ux8(|w+fL9rVXhazf9j)2@LN9t{jSOjPSB8^4SIN z%>I2?MMg#@BV<|oorztdVCjZXB@Xh2tLX<-D($=K-_y)du9~DJu79It5DyPi2CWVo z@qDE*rWdd}|Haan08-UqeEGy9U=3oQS$?ibu|Mcpr+zrKL)oqEf-WT0cWXoZ*Lwx> zjGqf6MZWiUaG0gxrK?t32-rYUyFIyl;zNl;w=13pBw?)^Y$pRat!KApzskycC_q&a zo`s=O32C=01TueM;B(;4G%D z`mebFJJu12?Au=~{42!atGUmrdQ3iV8ou2m0%EXOv)C38?vRRv700Dc5HX&~4NoEDo7W*62mnmFs!{yDvB6$NF zOe}k-bpE7OeK@JYiZCsiR|g+L!-j~@yxfss?jvgpgEWvX z@;aj6jBUcOg$#g~8YLRh)yfW^_5n;nxnQg?Ws+mL{EY?=?G_?5@_6tM4RbwG_+b4O z@^!SOc)({cB@PhRVV?)+2C?LJnbW7GYu1L`8vu{PxUnvlM@03OgUBu@pC@trWB#%h za}g`G(D_<#In^9ak=|GUSj&r+G*hu@8MNA2TbPj0N1+IEZDn|9t7ZK+^zBgfX;CH7Q^5;+1Dao+N;e#^0y)e%mr}s4 zGF*Y3-iPRca4lwPQbp|Mmsk~lD18SHUv@!_U@N`i8H14c+&+yAj&-VW$+XZ}A>CQ}vZTs8>Wsk|`%*;{}t4Um3 z{OO!+yXl+MR15DxFIE3FICWMX!dRQw-Y}*JqT||60_I&H{cJ%k_T}O%d{oc)EajLK zC;8(NVhBe0C}8auEXLY`(Sg(*FXa}s`P9gmpSY(lN{8G5 zS<_^*5$^$CJq!xMVQMMKo31ovTuA+E$gHIr^X=Q&t%MJNR!?Ub6 z{DT3#UZhMvH=+NUvyu8fw=v3@Qfz|?lWfn z`R%!P_Xr@asgH51A2?MK_DK36h&w`R_wzybPJ^N&8S0<9yR#7}GxH^x4n@&=SM%?j`Xu&t`A3IKsk8DF__?zLGyT0`g%+*tDPO4qXB;@N+I zUG5dh5sL3hZ|H^^k&|^4y+&pO=$0N6j^V#Ww!~v$M(iX2e8 z#h@9DU7O36E_3LH<2n|z4Fi`4tofp%qmS{HI>)NowDhto>%?%bLT8u)5{hLKjbQnJ z_L+OO=X-c!*t<{8T14;X&?j|rx~yg*jEhEsu(v90nJX{(`uuJdNZv|aM{FlPtXm}} zCU(C*kDCY=feqib-Y@I;+otkJPUW+_76vG5}tL5*uUj(zxVO~B>t;rXQkqQ zzRCakpw6okMdJT?@~YfIr}}vL=ZnAcOG`c8?lH0)p8R{2#ohZh2D%r#f8FjfJNm{U z?u`qPfM_>=WKAr&(oGCd(@ye(Cf5P? zv*ymt&RjZu?pbPEJm)tgO@*kBW-oUr)sIf0;$N@v9BTJ;I$| z4jC?JYiSu;I1<#(?aF?mB&T3^nYXF4=>h@*>hVWIoPB8+tT6l7Lc?!s=^7jRf{MYv zOGrpG>&?^@7#PD>Ba!Ue=Wk?la+tGqij1}HU>?Ce>$>EwNHzLRbU{d%9%rj&EveZ=A7fVq((c6D;gMQ{vG5`@h!u>8GDW z$Zxs+cz!k2Uq)?5YfH=aMnzo0ZnjPbIhQZbLSR_h=*9ujQBl3tKc3%J>;Caj@InP{ za|`i~U7S>Et$2KV9H^oETTRG~#~UAEZPpV0rdFLyhk`YEd2A&7O7cEl2z^;hFO7Yb z$Vp$$7~IKPB@oamgf^X9Ha15UxrKsCt^AfMaO}HEPG)e{J$X<|d9lQ*;n796hbKxR zAD(V|dCHnJ;uFrcy$&b6yK#1hkkVR$XUDAV*@RYiCI!d#hm!-}w5X%De2?$x-c!H- zmZ_iB{e!xYSC3TH!Y;OzZg6(y+q2DRG^;aM?YAd6IXT`tcf1xo0a<+>&Q_{`=bMkI zwkS=#(0dXZ+6}wz^2cpp&15sDk&QyoS|bPxLdk z3YdeOo_BA(mQ*7RetD5UKibNxa3jBl_~c(J8eG5b@nN6c!wnZTv2=g;)27SGe53kj zHToFehQGT#ls@1;^BT5PVaGny0`oLSU!4DIi*DtMLpBluz3OkbTxNR6YFTZej;xs+ z=2a+S-!ns%lK;w}K9O%8-m7qv?TiDqoWqd)iDO!rp+%*HDIL10 zqe>jOFOf$MI3A`r{f1kb?vZXy#NdT~`YGsk4WUCX#Rc814Jo|YSmd4PgJt|R1x`YlMu#l^+M#DwH>>>1R#xVX7eCy6~L%5i`oxi~sL zQBS*`iHDP(c+K}E!KsQnAK;LzfZC>0ZU|acy>!BW;<19+A93l^Gf2DlB8LmbQdt9BXVm3Z;IM2Xu>+?xVK+c9`ApB}@fv zsY*GMPidy$0iW9M4xsn>TtueZs8l*5Z(?tn56nO>3+AQ$hLL;i|+WxkX7UzwGwjUNz*06VuJl zg+dwi+}ioZh0g79QC9ykGc!{U7Z!wHdbYocG)jARK(Uh69wP};t)`bJDcr{GJbbCq zOGBeIQd^DLqle%|yD+F;jg6_hk6qiZ>|LJ(tCjsth_pND?8U|`ork#*9R)6@HQoUV zxc}IZyclVysY!)W9{B%;d!d!3j=fI=paIjpM$o(*^W914<*~y};m9*^`ujlQAjGeO zF_n*C^pAzk-<~*Dy`JmF*Z4ZP!@PVswcN8K0i&ffyR~M}0HNt-RJJ_hGnE>Xsa#d%_5f4xdWnKV!l$AH z8Y+woO696U>Wg{u{aap))L#qRd#Z@WFfz(FE1K*r*FwaGLzpvA7S(>h&eD>3j;jV& z&=AIEi_{04o0yDD&CKTK93yR^Zds7^p5l6KX|B4}77Z+=!$?5VbfEX{Sc5uzS_V2N ze&&$9y?r@(T>Jfcfz?G6mU-iNw3G$CG~c57RO?w;n^OAptLq5=C!x} zUu2ziRFvJ?#w`>{6%dgUC8Sf*0Ra(^5|D1`mhOQU7*LQ9lp4Alq@eX`kH<+?lbV#0k-&bo3Tva_>O%MyAtQ!KdiF)*wpBv{*dW~H6= zLQ|8{eS0QS89yZ-`ogm{_)m|zQV9sS0TYq58_Ztly&{pO zz%z+NEG2j<^UPoiD=94)MxG6WN*x;P+*m1xS&zISE;Zyo9rpA{)jtwhUx?H>>We(L z>x@yd*&{|A^_C;f29et^`|>GQ#Sx`}yo9s$TY4Ro7rX^I#t#ODho|lPahGE4-Z@)o z1<^B+#S8#P!)%9JpO5k&j?-lOuO^p8eFBq>Uaz{sJ(FKB7wnKhr6Z9$+UFbP)2B)J zE z(y%Ub1=An44f_?PFB@?4XJ49BqXut>0T^Y&b^H#wRftw&L?-86O`Y+CEHI}TwH8tIaw!=JLRjjTOZk}UN2hn zy)BTZ`ptf47RIQ|B&7^|A(lo;`|P0HQ~k}G9vf>H7njz_EeD6v>7$>-0B}H$zq9aF zr%}VP5>snnX*rpy`@o!OsIbk4a#6h@=S#co2)DI79`IoVCPdU9Z``u{B8uPPFo<-G zfk8P#=o?rw6mYiw@#*t?S)G<39&M*~W`y+CsK+6s87TF;AIlLDi`yRx>QLPa?U6ro zhVt`{7I_f%XZr}r?oSf)i*?7t@wmAAo~V8wbk!zxwY9}OcUkQckRy3!ww|rjuH(8= ziPTtA$y2u()8`L6g-2&&-xdPY}CMFnQOzg~RdJQvNQ>9Wu?eYV-1Av?)D#sM@t=5^Yv>&00{ z2pJ#0n!|wnR-BNhqo&Yq%h|@+@a|zDCX=Y8~>cSX3Gz!6}#I7xLGToqE_u@n3SN)PLoQ_ z5~SIFLJ4{f-&%W*1#>cSx4&HJn;-txxbk$lgwOM=ZytR{R}J&!f2H&GEtcBx2~^YcSQ{KN=ld^eEu@DTTT?_js~t}fYCQtKM4rU1hf z@sQft0CUGtL-js{mDXS+!u>p_ppJ~^VmH#C7+?&Y&@nVq?)eT<4!Uc%BH+IM4P*Lr zF)}75W_A&9O`z-^v9{aBSMawbNxQL*LYx{Gh`!_v5vh zQqOgLV#f;xP%6`ITUtpY`XRLdN~{4lvZ#H1orb<4!92gxcJ3#xO*eD->F$WWoa8l3 z5pt-=&g7Q1%~q{bbKI75a|5yV(Sk|wz~CTs!D=V-OCb*cDaelC2 z?fFcWC9|Laf$Wp>yg1?UOSxm2KQuH15Jw_LoWeyDHCB5##oE!jI>;zWPJ2*ya{hj| z)z}{K{XAyswzC7ZJmeb0#!Q$;;JJ)XJmK7y#_>ymbh9Ry+M0s#Xd zke6#b_G}_bkc;srvwhjz@c|GZ;(VVq)t@!iwoPp*-VN&7C3d=dF@14j^E_J5s-X4& zZtXUXEGpV{bd#FS{`O7p{B(5YMoU{8|Ix4SPSYL*Y&m>(w)6&xBrizND zPR+Y9us78Zb*Rh~*`qEeXiPj_4>yzf&reTSE9cu%GxGBfRx;e`vY^Fh^K`>+mGeKY zv6T;NpInT=SZ`Q+tc`>4P$0{Jmz~XEU3YBUd*2yU9=f?*M+%bxS0+z-sTIr0u7YGh zxt}_nQSKQ6<-rp=9RcoJVP#=)I!C$WD0B{rq0CB4Nz)(KxFd>WzX>EApgl#Yd;oL; zSx{!pdP3(rk}sPXrJTqoaPt4H<>6l?f;o@ae9mVFd{y< zcVNJ|8{*{Wq3ymiTz9&VBMaHjEw9}mKiPD9(Oi6anWAp--@A9N=D^yBbxuo>@hFrG z0yQYt1vyNWbDu?0p8m?_v$OI%ULc0U;VE^OS%8AWphb*WOIcNQWbjvU_xW2>Q#DP0 z|LUc90fFGwwzk*SAgZ|l_$K$4iDEPDh8)Ulkw9G6O*1^6u6A@p)1~qZ=jWO5B$k#w zJCi*EQ}yo0htKlFvO;IE+pp)Uva(k8hl#}?wE-B?Uzg zIXO9JVDe}>v008pR9NlGC(q~5ofzYJwwBU+A4I?4RKfMal<~y93F!AfOmwuj1AE${ zUcvvkzm@|~<)2hO^P$$0Euq>R4?m|-HDeDZQx?_t-RUy$u^`EiH!k~wk;A!a`=3KJ zx8o1Ves=^8&i~}Ib%07h|FY);*9ZddGsi+shRh4jeqs>2Z~GG91&zqFGF?XYN*$oaQ@`$HYx8B*;X3#g((BaQ;=DlK=JVS2~C0Q&?h2 zi3RYB>78IFfBG1Hhw@Af{hyztR)@9S_*Pp%%#7c>^(8VyVl^OOu(#fM_M;HZe%(o3 z?MVZ0)-uZTZI$u~+Y2ox2&z9}ir;pA*`#>Fv_B3#|BvH7$QfccjqSO2hI+yyqq;e$ste z=O;QgO-q-&xwpFu^0xp621Xp-RAEwnU7eumK~&paIG3rd0;^6PS54@)Mp{k-sQkd+ zu=hVV$x}+lRcRdYogwXF;BYkfW+Xso(KpAh7t58El%(Qoe0w)a6X`x1V{T>P#OR=< zWvRfbdDNW}%>QUL1z<>(ng&?^eOXCK(*Zd&r-Af&+C-cHc+10OcvE|Zf@4Q#He;_w&(et=$7knQfmw7Nt1RiE~MOfV?<7_rdY(H zN86vp#F{|J3iOP3-`xRh_iFsBqv9lxVcbH{CYG*yIXbmZR|CZ&H>z zo&~j2{2&^FboI(|E9DkNl-p{SF^xHo)x;4P*TdnNUi|0ViBs!#qea7)C{)=mTdj#+ zrRmf(L#gRTdAY4wDp9}R=K`-w{X%AgP9ElnOAmwfR{iw%(x+?UDZ9 z1X&gas+F@-t4|N2;c(LF z4N6@1^TvtFa=QKbRz>t?thQAJ)MI~rwEXA(?t)Z;%VMj?fr|!L=*_j|$S+?g+_&#y z-=84hp@cd^V-asaE^Vcw3=ue-JoMU`qdTa`0X!eav(=UA(!owg;W#2M&-x`2UrvY- z#JS(+MaN11ZscwtlwblJc4lEx5jD#4-%!{(6&#F=jH@XV6I7CMadF{wW^G?4!>a1) zpx^zf^u7lqZ^+1Wq9P(9Qu*u_Z%>9;TUu(>o$i|ma5=1QUYsuN+0;VMs!Zyc)JwL( zvP;BlxlNDyQwrupj;AYRfymWMJ*Nv4>=u`&-usYq_U72AdDhdNkUaq0r`vcQM>EHI z_h!2QsN^@tF=-s2o(;P*n{Jl$vm~6(FQrVif?y2B!?^IfmB%UnXFOnrrmQ_rawPY9 zM2+kA;y9B9U02eK!(9h5*;jJXWha?ykI@^0OAvAKaX1j)KDd5!@D}uRE<{K{u~={n zPbRv^+&1H^Urwm^?AKcchf%`>at>;1&^*Aw$=%lJ!)axLU6;B9Ji`a{#(})Pss*b2 z3{Wx8l(W`^JF@rI>M9F814Ho5pT8*1JPskcr$-+dm6-z1zj_odqBYuS`iv43nzLop zG2pkN69^XrZ_S2S5bRictQf@zB)>6=Ldl&Ub6?M!tWrA6(I^`&OZ!o%<(i7P$e&Gzrqhc<2`pcIu zVzr7oIv2lu4r$TM+ugY_?i4}}I7RZt3q{3#$l(MLZj`VP3iRn~1)ous6si2XdN{w)ciqhC+Pg3wr>3I$_Cr-w|9ZlMcgdENfky>6kk zvn`?B>gifwqG)gvIO!DX(kz-UwYu3I=hh5pF@CDQ=M5!p4Ry$)k&16DV@yDD6x2~h zpBl-X>?50P_Bw@RR?#~V9^W@7-L|y$_pQ5Hzct4{+?Q8VJ4Po1Q(#aUT)H>UmMLw1 z*hmUCC7hS&Hh8!n@E#2P|gHY92(*OIX!*7))bDoQkMaYk?^TdPg?AHmm~T4gJ_n0JPFk zg^GRav|n|*V#lp3W(4#E(Wj$Ua~P^^p^9Y-r`;gipX?P+h#F{*Wc5I;AjGfh_k=*f zoC)6|KlnK{gx(05bKRZKvUX|Lp0ud27+o9I+$&AxGi=LGKn*OV)L|Da=N5NK#dJU4 zI|M*s#Dk!09OE^jiS^A z0E?M)o^!A{n+@!SZn^0Q98O@rmTI4kN1;$arlSQ84|vsQC+xbXO*6D8Tuq=g2bD|l z>Ln&KEY;G1H~XU4tz{Pjh}uE#Sl1rbZY2O51y(v%N<=`57lzt;oP%5 z^CaBf$7OGG1PD^fKkUomLLCZ4-$Bryd$-s@P&JxbS$VwM&WhE|yuvr*dnj~qswmI; z>ESa+AZRO)nIkk<5^FotT6IO+jiVo1_fbxh%VoF3+uM8oE_!crt7@$rteip7jK9!n z0veNktJweCqF+9B+(iPGJ+Q!ifs=?RC%mhwY789J@&d)rkOb!@qT!NiV}WlM=l$LM zYc)D&t8_NS;J{F82y!SE7MA0f>1$EZGcYYPGkrWH?C%DK5$8TNH8m#V=vS-3MpbKF z4JT@r;;T1n4>!T`_$`spGC#i<8X9sQoO0VbtUHXWeb-cEFkZMi8z=;Ap%O1E;i7aL z=|yiAab1}L*>`DvzNDn&N9Sm1aAcqkOZo+qQ?S$`gQQ{5}nLQ{!*%Ft1+c*vJs7 z-Dt#SozxGhJt@&MH63+X@>oQzc?tmbw(|4X_5oPee8I?bI9>NHyRPmW_&K_S9A~f< zGd2&tQ=XfF2>7v#1oTM4*}94!F5_!gg{%RE_X#9Q?V9859cTnfvaA&02#@hcCvuuHO1y2HCur5AQx|V%@~SmseLGTJdUZO!6mp zL=vfJ?)gwopfTEnw0IhN>-==diOh9bJ}w`9zJL03F@&XRxoDo{j1{^=s`s$J8MIV- zNlCdp27HDf;b;PY^`WHsuvdvT-Yt3V^#{~8B&I)Q*g6F@$xEAFH2EnhOg+#iN2c4_wQc7?`iVlnLwQx z=G-6lf49g-ATGVk$K<6d*0f5*7=b>EHCa{K)I>u=W4N&Jq^;fG-%wuOrle9iPyL%g ztGSZW*TF$08k)4ZW;yf;@hJAWs;VqEc#+MVABazWe7D01;@wS6j|Z}#G5XIIo6`jEUI?z~3?3g#DcWyW0%F@2U*{D;0Hhb#w+J)^VprseBPV_;5Fc zRyvByYT}1{%Fop1s|LX!s|*gVbv@sU0;Ow;O5Uyf({`T0#P z(f;7WZso8bwTy_k&3w1sF|({}F<1afFpPnL0rEcK)!#k**RIwBRR;$L$=4!e!9DE~ zutL2O2O?r(VnV|Cg$1!I<4NPz7Y-h0=@o*rALjh<$nXFEf3Q4?+FuJ-^~ELS{=tql z$vTIg_}(FpoTLT;VUbfloxASk&! zdG+b{HPOr1f33`T6_`-L1zPG(Ht2g!!lL5ha2!}_OM5$MA8l@DYpbcHrA(TF9vX)S z2EI_!gR!p-7w8ljNS2iP(y6_D`}WP7J6A2nwOv;#L45{4U^m+s3s_3S^CgBa1+^C#x#vpjqb8bWkDSF4&EB1%PXJN}<(+_8xgv9q&_ zO%46=^oEj>l2jxMu9%dR6xVj6BFN}i-G!MxvI2AGM@s)`Iq@swh3FHwo)?F17m zJFlc&golU!zO1H4{I3;t%{e5&BHtqfrJ2&eX3!GK%R+TG1_pyk`iUsefha(ha!1=5 ze0xp8@!k@hB$oM5uH>qTIXxreT2%ZSP0d)Y@iYcs;=UDV<63rBR#tw#HUjFQ%A!?O zQYAC-X@hfC|GU5J$17z#z$)ui>UM=d-~ZlQ{QIh}7N(7NcU?PVB)Zik(iD1i!Q`*W zSc$lDW_@qZS`z^k6hOo{=HN$6id%SkdYX(kmPS{yh66`dj02PARn=Q)`wB`#vQVUN zeTVm4+|=$yp(UxH`^zJ8^xl%AZu~#JgBpT4qRMe^aLUUL70uW5g}1CH`jdisxLFQlZ}QQYW; zAh>U4W|j;kiuY7gQ!_O+RfAVZ#552%Ehw{?|L3xd7V1B%?bZ3^bs8!Le#gmgK{@c= za%N&;;vss#JjF#t{FBCD5TI9Gl^a(FbJnU#9gH45pOO7eSVe644P<#o60A5{rh%cM zS7!{*kEunIw6eka@Ra)_;@lXV)Cm9G=xAa3^No*EO3TU)=y|BJe1tpRNQ8(jv-2cr zb&05uV10Dd!y+Oga)6BTD}IiPn;d3?u?eoK0Hug~#ZY4I$M+GXBq=G`ECF-e!4j60 zmHm$Z!o~hA}nm|lP~bl0X^vu@HODbd8L!UpYxr{ zx?+JiA)iT8)f|}U=E@N?KlPOi3?~%1yU6xQt<+4(#Ltd)RmBGUw=u0j6Yz=CpeJ@hm7|;jdW%cJdU0#+VpeLJieXVQ>`qqB_{At35zIosq zX6^5VmY;^HjAc;6bl0T8U}WVfEvImhlAyE5((kbL&k^;(LFE9olt;96b;;r@OUNln z;H!ZJU-9^I^GXlt3}U^T$s@gAX-24eVPPTe73Yu6y!RfLb1}~Gr@nfufyu3|uDT|` zL(x}S2HX?{)!*YetZyYUK@tJXq4&OtiAg4?D^4kp)WkeWV2ZseGrlWP89m=HGn5CW z8|SGTuvXd~`LLUsn(kgH43bP!P_oo^S@KbfSlsHR5q{pI_21pc}Je%o{Q zWH8*o7x}>#On?E}Zo=|H7P&GR{OD#?HIlk}?*RyA^G+m4#hKsgBw|#VP`pq2uoj zt4m}u%jfY6>(Vw)0L`zQfv3n(RpokPno345&JKsB?Pcc|TK>5xxSl&hi?=ad z2JRZ2{YFQJ5;q(CW8gZe!`BZT8uYHMp)%9bXdXJx&>YfBCZ(oQcf2p@1czQ)TDo!- zON)kyi;L^!8AB}F#x=q)BUd@z(#PEGiMNWb)W5)tRL~!{fA&bT+&-rL&M?GCtVtyd zMAgmJ-s%9O50T>oUoRhg7Tqc&|F7h-Jp$TN-S*lfGUHCh^;Dh|VTHGEzfjZKcf6M1 zXJlj)=zQ~(kumV5c2rtb9j0QHLnGnt-rmW>^iW_Vmfma-6$0OMe0?fbr}MOH`I)}Eokn@EP-+!v+_*wQTQ?QOVfZ@3oRpMQpwsX} zBrvp@$Jy{W|I!`L_th@Q{A&-r-(Mv`A7=fPJ)xO@r*Bz7Uthoahi|YR)=DR`%5zI< zD-C_mODm?Ny@;NkUUL`H2xxZ6Agpp#Dxwk5NLbeO<31rFy4?i?1jZI&x25sln5fV} zW^M$dlz6NAt`m+8O3K;T*zo#4K`ALJ_Gfp2lwVa>CwT3OD>EyrwI*D4I9(y@J^3Je zBo%$*pvB=yNWl+nkNrW}VL$9_& zKq!`da*v;u)_%RCtu3GocW`h}@8Mjo?>w{+5P;Le^gEVB9=M9=+9=bQS=TDJ(yGRR z1!rM_ItAL**=b3f*kdZMpfGD5QC@^Xp}sPz&s>)!YYUa&cnD<6&hBgjg0A)8Zp77pdlM<_;o)&F zu7~AClD?b(utWevU0oC?Kjak{1zcELTf1ZfG#zk@4O-x*jUqKT8e-R(q_yNJH*}|q zNM(1C&tduZ&~$)0eD51xlbV{UA1_k<7FMriH~wY&r{*9?-T^?fGD8{*a;a7II-=ND zO6Tyd2!Mpz7&m5L#jW`~SEHN-@>$Oko;s>urv88+qCJ9n&Fn=*)H*{P71Q?xlN*=J z)P14!uOV|tF??O6eVmko1FH}s)Y~%&rM`O`z@$fj{L`mTKa^R5xyS*Kn3spkNftoO zPlYVOR{jtODishV_yI5*uBNF;M$3sO6UFafrs>;7ZAUfG8_d|@4h|k^)JG7kJ5T^B zy04!AEYJ_Js8e#L)_3B46B9K?oiUELv2#=k@Y>&Ni+OyBi-Wi#mxHOW8-mX$Zd|E~ z3=iilLRS$?+?7kT=o1WkER$}>VXF~_EubX;(D&{I3sg{&Q%Fb%Jsw^7A3Pm79~c~L zGR6FcMYT zxzq~8NUPeBGt38#6B;*xMscPT&Ur~Rn@KnUu7bOsE-LTrYgnu$&}c4W{C1m-;8{CFl3A*LVJfWU3C z=FQ1TOGPlPfQporl`}RW9=bDRH0J;Ca-1_4@BS@HctKSaf2;UNiK$}s1DNb}LJ@gj z>$ut8-rm78nB;C_w{yUtQ#O=A&xM8E!5ab@w^~jC^A^vTdRtptSgx;g{5Xsr{o)YO zJHudF6_A{Unug++|3CGw2D->GN#xOdC~is z#`k7o9z3@5Exa0fjlQ>&WRvfUkc08jHQxI9(UM<_lm+oU%^A%NMa}q)J7VYN1+_yf zV*n4f|?i^%=J%K%CGqlyG810!Qf9X6fhyTZ6`J<=kf11l{ zLkUcL?57^nPa@6Bz6PqQWhEsqeVBtqB!*8Oz|beK1wui_8{>AEd`;QY({l&628?qv zg@FG6ThSz=sE9*W0W3w|8ntCo^H$>|&P-tj*-5 z`3MU)MDe7GGvCltx^d+NabxqyQFd0&)frJ?S29tB=5}BsZy5$V&%Y~87jbLhViI4F zr;vm_&Yip(hJ`-pve^Hw!UJhZFA>$U_BVjmG24OJRaI3XEnp_wpjv)>y#4j-S5Y1* zJ-wM=S95V7ja=+Wa3kJ|-g>D!E&!)FY)l_f;(H@XmYN6&80%-g`+tb=obO)C@X% z^^9ALI6bwawVxv+dF(GwXwv+HnZ&}xB)ui6^L0Q>Obp<&Jne1qY%MDhffaMnT8Cuz zM)_shS4orE75CG7q}KXDhHZAi8ng_H2PTt=fE}u|B7jz`Jt%#ntxfT{p^;>SMVpER z)RTsWMv5R7-QWn<3Lkde*#n@u_XMv8Tl5clZL{Lokco!1hibo7QYtMeu`j+@TwHvH zcGmNz#2gbp-J|W9%F0a{^avbpoCp2;tnp+}EYvhf1$tQM&8f?H&A^}3&jw571ST5H zp}<=~E=s^}^px6xcOvU8!$aMf_r5-T?CeSUahT#l$*cfv`>zxB{U?&aZ3x_WW^rJJ zpAa3OGPyt}6!_y)QZ$f0BqdeJRlVEHnCj2uYY5WkfcWw8@yaNcB*bch_Zt()MxVA_ zJl_F|^usTk*^_l;5e@6QbLflTIJqU{9-}>!4ysO34mAF^LT>R4Em z#^jYp{S&ThdBv0(f)1+#^or@eh7}YaTAXKWztwb>nD$paEC!84{W%E;f}|OyScUY) z%H8Bu?t(g$nacH7K@Y$Ba+EMOW`k6PKINuM`rkXiy(}ew6rq85!q@RLR-7L_$aZ2r zRE&%{{a<{M4`9Kd;*EchHd0v;C*Hxc(kcgwkn#^Po?`W~uhlN$ySo~>0K0&?z@NiX zN4GMBdDGL<&=1W_GYvD+M3bcV)NNziYG+tQW@hHdrMpJVbXHJvT=d*d5o1nOc{Sqz>(O z+>2vF9x>w+h4UIcs!GPa)5(Pd}}ifnx+1g!s;> zY0e9jqscFzrVd|Id)O6{DuUdeqf|haiA@TvlkQgh;AUoSo&x;}hmW(!CFS_S&?ys@ znUzHk2=lHhx8)d+EM6_~kn@Z6GbeYlVUMi~N+iaIvgKNz8-dgTW+j7}BH6qQWrX9O z&yZbYG*cRf4FxoWnspFg|WR`(XVlZdKfFu4*?$0ltfiNZs~n*9iHSvbe~a_il2Xsm0b^|hXv3bOYxgAO_b-t zQoI|BNtw6$Q-F&9NMb3pBP?`{)zxDfYd(9T>LoA~;f-@UnT27jMLJ&I9{u)h;v!e= z>^3JVH#e;i&KO$AgM;ko@NQ#Sww09?YOso4YUqbdI5|iQgVL0d2`c%=_?PVtMO4e1 z11m7NR{(bGc^eG`T9yini~FfLj))#3rzt5Z@oV878zcQBz8zOa^dJ6y{$)M#?}sg1 zVT|Z{gNgGxO17{u+4!litlW0{n;tkjJ3ChY;*RsF2*J&pH&3zLm=kalx-%9PEi5dO zgYe#9PJZ8GCaym^s(?s0#OLX5t!!;YLX?hPzIp|!_+)|p1}zgN2@l~NWm{DXD=Y3D zELwx4lob8@&Eh0kMa9K3W!_l;Ci!fyUhz79qp9h>bI@5O=(MRRB^B89F0)iRqUHU- zJJZiBL_U;Me1qQ;r$G`wmq-W%z@*?j#9({*v}O+J)a z2%(0xEW)|ku4vN!vFL_xOiT>0=K7a@FKlI0)YY?#AEYufGKOh?17=SSZqW08OzTN%xJY){2QXQaP45wNYjiLx|d84eHZbu?vQ2+d6P*7*FbeWIl{OY5d1Z_Qr zy`|E{zUL>d3i%+nEa!aw{Mpphls345HB0z?+~w|F{p)*Fdxltl2Fhl6{rYv<$9e_^ zKafHfr+dOrh|*7Chc&NdW$_-ygns!#NKCvGnWSqLKR~W+RW86LNyVnnfNWV3?-V+g zxZy`Ht-R(7`|tr1)-<_*UAwo;agW3s@Oxg9PZ zo?CuQKnd8NiT3vP@+&p`U^H=YahXspb$xy|nO=svsN1q{hG485pH^SL67kOy);BC4z$aqT`_lW>H9|hyj($jx*OIq@Ach+Q4`9KY;hoT!f`umK8dpW%#(b399-^{+NjGs5; zRYQTIp!|$Sho8HJf`tO}KagEh`TDS45FC7n`1$$OH8dQ$yrZ;igZfuWni(H}+5-!r zOB9a%^IE%-idLH2`sH#v+;?M0qm8T=XG#~R<5*_88T9fdQ%zLV1CMN>Q9Rp8a;_NR zaD2yQM1e6ODJiK>9RqFGEvj=MhLl!GZJh^!^&^I3FJ$ z{#OkPwplPSzeWY4qI)=QuHMr|*472;clc?jTHlEfq<+Qs(+Me&U5br24>*4EBn0ox zcDr)nEyfR{lROmO?hMji-a2L8E1yGfd7O1yS2s6@sIZ}yDk_mNe0M@L7_8HPpV2Cj53`9*DQi+&FX`vcL-KlK|ZI&J$L{P6Oc;J@yr3__l5X^7`T6tb z0FIcrxUrGZO+O|H#<^^8m@g`#U;5<~)Ttjvz4RNq9ZthRR(9FDAdIQ2zkYl@B4%V{ zL{q9qWg(oE^U6P!IO%a54)SseKpHSSp3&0&WQ}Qv?+T5Gc$NSA+Ju>=uiSsub5y`- zb7FgYyQg|Z0z*rJ(czciOf8+ueNed9^$AaR38lS6-n~m^v9IxNytcZvHJm_lmeiMb zZr>{PPZpNqc`}4aK~eEcgy1EZR(Fw8epvs?TUA;lGr@rbEHMk~F*2Ol`1LDlH!p99 zQp41fgl}LDFqjzU=H|%B$!RqjLMcc}20L04A95K`J$d4DVwxxO?_K~aV8Z%YENO%7 zWB1O^PX0jQC60mN;gH~9R4qHuvDSAzl{mI_8D2D!g2yO^y5!`?%XkzabS5l5R&K7Y zBE~+!K|w3+nXQhYIn)TRnkCBi?mpwvCLGeSVHu6BDjtn$`W$oPhG zATz9MvCdm6!?72)n_v2E3IaZ$~ z6Ld%|raMucWMX7k8_G#YNXW_#>0uqke#-0o*ihu5zI8g03`xrfHbN%@t8)sMNd3&Z4FC=zuQh}I#p8JyhQ%2yd% zKu-c>)@|`FDXw_(l!1YPle3>yTbP*R4I}!1UILGSp567P=y_uThOJwAlH_$Ng-86}E;8)VQtxTG7a&pGT#^p^fIVG5jA17VZb>Q=; z(~b+*@v3Orz-}A%SZZs>Uv|81X#nPy9qFHG@D+Il2K__Z%L(XY~?$4?wF|wpxlo!VX{g+miAn7HT3}wfG)ebWD&j?GIjQ5 zi}M-;QH75Z8y)zv`(3AXXHVZ^n*d-VBg&JUnP|1ISz5s?ZVm$L9qyNkY`+u zSvBeCuP3YDfr2llB@u2}1kME!6~6WKhK%Zi2M^u^Qa^h(I5BH=kKptME&Wp_$z9>T z&tyK_{7K&zY@_S(!t)-L#u!UVN}@Okxa1msI4-}$-{X6$s@4@JK$pPdRtRXVfufWx zPQyH%m4Ts+^+f}#f-v#!?Rl&BxfB#389>pQUl#f!?h)SUJTDPrajRLJ`uuU<(@F*X$g?FpUhlS@PUV zq|GmWH8nRg=9+L=jD-_QfAZEb_Vh$_FDcFtkdm7B5lEMb=nh=dV^=MmuO0QWWF`)wjTFu&5xp1%Fm%5i%!F97q(MtZ$CpkVQvdHszn4DyF<709 zKf3qT+}T-mI(^frxC)7ngA)~LKju9&Jza2LLqS17L`1~h-Q8P^xN5Mx=)`hN^gdw( zTSzk}FA<{K>{sXYJ*vl#MFgJ%rJ#n_%TgHCy>7|qz40_kIXp?hxU;0ZyghwAtFdk7 z{m}wFZ=CG$owjuPR7F2wjCxl#)1FXRS67#sZ+r`hm~NxDRZ5D>1h#Tu24Z|bdF%7L zOKzK>xOqkOW^m1f9deL@zHBNMy5pFk?y<@YybaKeLM)%15&u>gNl058`i;XyMMVJt z0byZbpFZJW)uc?og#vwFgR9H3ni2mu7r zFp;%6921!es-KTfO`Q6uiROkQEiElS8D4R8OiXs+^Np!m0XAu2I@e|VjP?ZuY%zZu zi5#H-SH(l>I=H0L8&#S4>sk7Q(uE>mR0Df=FQ_QFP=}*Xu5r{Rbi^&U0K&0IwS$o| z^MCoLy5SoZjmA9V9pvEW&v)G(`{+oE0vTL>`hxs}`@#AsDErhmenC1fMAg+F7GGY) z?BzmavpK={=dwhmFMzB)#H+ZuxaJ+J)5y!dIgPD>a8vpQgji{15s@p1D;SFAMfBDx zs__Q5l?0Rd8^2H8bc{K#r`+^ck(QS3neYV}+AXP&q4k!kVD!OT47Vt6h#A#-f(FT9 zSa`UDt9R`_&_ST=ST7`YX>cDF^?;QNOhC0b_1|DLFgAwsb8?1nJ-O4^KW%B2b13oc zGMV{byQ14Fuxs1htKybA;%bL#8jr)e`X8iqZ~(1vjW13%uIY{7KaZpy-2iq0oClyR zG1{5%<{3@#4Y%jszdyLVBRh)VuZx%1u7i-tPtZ`3Ug-Y>xOjArFF3e={<*5vK0fGe z$4iDvw|84}Ds}}hvu=d1_#rS*QT6U~itb-G5X(0R5_Pv?oA$mNzZ6vesQAtEwW5N; zhdr+%Zz2QCXOdV478q_V-s=RY6>mma9bbmmEUm4}n;A>W z%2q}2w9Wk9y?ZBJ<_$5R;^B!Dknia6}!z581` z@wb=ujzw-UMse44tAvIa_B_XM>+*Jgmy&XI@xkQeWbu)9J25AlfiO@q z@s}?z4~6rsS>)a?$yq$10P^R!ukQ_v zM-L!s>Iw??kb@x3xv}_wx|Nd)ahDT4wNYy~DZGK^SlXBTKAQH$iI>Cs<#g{)>-GVb zyLs!D%xmx4uR&~%`gNE+N>}5w-SyVq-u{x=X6NS8_H%qT?*MBlELs-mrjwGx9Lri% zGcZV%-IM^OTom;H10g#}OGmdCu6cvTClAEzTDDSmj79;bb~;XwRSRiUuVS(m43Bf) z4rxv?YMFUIGDjpG2mFeFAmtJ&;hCA4_u3tXwKCl1EiTqai}?c^s5x3vBc@3Om`@Hi zI3c!p1;r2S$$UZ;Juq|`Y!`A0yg}yTH04NJByQ6sMsc`XSmX}gLn=kD$Vf?H-|eaY za`|$A+?#g;PuBSVJ7hF}`rPyOqrI`o#=((%Ulb7fM=>_bUq&D_)lSE!zVK^oTikJ` z4U{dkj$wnTO@#3);`u+Z_wugQ@oXfzqp+-tq38=y1#xCHm2LzZ5sPt6*vn-Qtmn|s zqGNSVPL4y3h?|?6xp_|PX=ZeLOG`_8J6e5Qc#ioQuLN%Vhf!NsFB!E`>E4w>95R>6 zrR5xmf<-Og*#O)?Bfsp1EX)N>emXh@a}Vqviz+Ji+tXg1KSj8U{J!)I4E5R_VybGLt}|T&KDXKNlPuT&#R*ZT(Vui6Tt5I=cS5tfxXOk?k9f_!<-UwU)VG#y2Ma zcuGx68}sD`!IwwC*U0e1brCG{T39(>yO+X4av)rK^|bF5GhObJljqIdlQt3gz=k1n zl@lbo%JXxmTei1Oi}w`a-rd|gQF*^qTH>+l-z{%!lr}R)Rb^xt`*}(NRWUR)9GxS= z!9(xV)dvuhl2&)UbA3)Br==Cw^{yug$2M=~kR>|Tys+kIHn2*3u?_85ZEb+xQ<+&= zS(%uqL+@ffIWAjN_paj?6lAf(&_^)?W zGB)@0gi6Y7J3ps=)lhN(rC&c`t@l_A2QpQ(L>u)My-4JVy4)Zy5-Hb$ygj-{m`;$D zxTvP78LJcTt>YyU7G%+8tbNt)Ny0{=3zj2Lc)L(x>umPW-7LM+91m?K)x`$2tk zjNjo(6xI$1UOb?@9QGqkuYal2i)Lw}($2@nM^sd_YVevHGJS=FfVPP= z??0dmvLK>_qEbo-Ea9TWQi4iIDV?&wA|fd%At0rQ($Xp2NHkRw@+5B-PbT&?hs-Y|9`rrw%?&tGK#W zi%K!sWl27G@IX~HjIiO}7l*n_K6r1$94!NbhQWnPITV@{IS@(<%{Yto;lDDpxV)^+ zM@2~)8W$JG2lz(gqLY);ddSH$M}<0-DuDD3bpf)9H9%r>dwahI= z{d(Dm=&f7KO9h|l6B%Q?C=ahuONui-ear%2T@!%wK#taLYr&N6nDr3zdAdVo>PQMN3APv5KGq9mq%#F3pq76yH<2VO>UUaj-cjfKhUT0AnNgvT>Kiy6X zG?e_M{TjJxHAPMN!1hPLSwwvJpr)!id(XGH_!a_NKldT|*RNlR`2hg|L>{;o|(JrrAoxdxvQKj#+hj<4g-&6Ty>IKQbzOMv$LcJplE*S|c>|Nn+2wO@$D*JFKOza}OkYR~=MfV**8 zOv|hu09f9qZ!v!1favwu*w~tzn@4sY;pG8`wZ5*dtJ4=-0;tC$%ET)xQG4&%vCvg= zx@g9P)x?`fc6Rptszfsc>I|S=0TP$e1{A#*gD2T8(>3aM85uVa*rEC5i$1B&3yqtr*?l1w}kMbtSlVv9L`(Q1@08%6EQ#9`5Tq$wj3)jTkxu#{lGX zL{f3F>NFFz2g`L3yf&ah0L--RRGuv044U2K=coA`@qirGjzMe-k&x?daL`H#!642w0&?Wp*1Rivehyk8?&^sl;jG~nuyKaai&UL~(1 z^TC@V(tBG62sCd3A2D(|v>;IcxCxWZbl@BL`1qDcNVO#-2zJQf`_nwTdB1xqLO)NS zD^7S|bW~SQPmk{>P$o9i(>r>q3U0dJSXtMxd68V-O9JSYp;W8V@J6q}1 zJ_YBsWV&2iwn8|t6qlvD?T8duZB8;ONANuQ=f{5^9&ZRYq3P-AFJHb~I%|lDu`F|` zf3gc$nvyk%l2ZQ4rW*b2cNGiE%l*$u8hGv|O-S)ik$#-k`gmV#L{?UIU8rovk9jz< z6RtHB{ob=p1!Eee$a72pA#Quq} z76NbmE6h#G5bvLVS9(&yG=eEEcD0-WHqv=SdLMHv{KI^qWA37rBS((<cD?2E7RymPf1CcoWzagecFA=vnkLJpPuNEDnZVoLd4lJ zU;*@ukF1?tvHm+rY=NhYjLbtw{nhfaC1pM~P&@K7dtUEcd&%y7u9h>&5cbi@`Mu$E z>lc5RfPYh3T3T7DtsU3Kc=5SPtz179AaG!(hK7ca__x>FqUq@9wx1HY+-cOMxt09! zBY=D~m)ke86uuMQ`uab*{_!W+bR&rb!y<7Jkk@tx{^h7;nYJbg35mohDpom78AZiu z3AIQzV8k#tCA2f`XO_pRPN`5Yeq-KfqR&k94-2C@qULQELuxt$e+#TlTDyACm}+Fp zH;LNwnJU36!Gr~0-vtJim6gT3K!lbuex9A3eRm8id3AMlY>VXM$B*UZ-w}GS_<<+H zuirl=Ok>Wz0+!ib<_)%k|97%_SupfPs(~?og;#3gC4IH%;XE zjTY$^17wCl^*NCn>Ajgo_ZEkctOl=S5UA^gf+GV11HHYyBO@b5H+?dvUZgZg*9vB4 zX0Ed!&*v~s&;_vLIRr46;n7j^U(|LDp2dKZZ61pzi?gI>Vl?aN3mGlc)oJdY^)OEV z`Mto!T9+$qdwV-sI*?w-CM7$&Z6!4Gtrb3^Pkt8Ps7j-#iPGnQ;`t`T9C>^?QYr!43{21YqCUm z5QvYobo$@;sCTMGn!zc}>;AuYkJ4kMk&tGSFP$5h7#K*W@oJUsK2PH3=T`|5_udXO z3k!hm(4?S{kdGdSn@1u(K!UPQ^C&T)(aK_f*7bOukZC1FD->7Scs_rM1rmDXI<#yvD zyvrNVcR$)*8WFG@&494uyRNnRhrce0@7AAdf8URO?X*&}<26+YG3xIDIg)5x4M&J>n+#2#13-i*txh~{&+>qUH*d*0nz;1V83T%^cz_8Sx4~d zBf`Q4DQPD^Die6z-dVobfwh{sRL;|;?B++do#G2p4qmr`pFQ+{Uuodw0xaq9Uu6(4^JnjtF=(yS%&{*WKHDT~su@;?JF4ZZWaP zwNJn9_ob0*1xY%m$S5gAG|bsO2qg5NU3aeG;^Nx&MhuyonJvuD2H76a9%TZ~03@KK z)7^Lx!XD2K`iQ!0t7>Q*)PzMvIsMIuIJWjvn%5=|HzxiZO)$7D-VAI`cESCc4NW+l zd@Z)ggn(3@SB+r;>Wk5&0#j8uLIs!>iAUyDZt-GD@XF&Us>y@fTBU?_YM;MepC|{mu4mpY zvj)if*O8Ht-yLl+ac(h^wUI~&+zmr?OpMMcAXBqxA1Enxy)283jrH^-R3w40uS$xG z7e^~LDrVw^ZKvN&$N`bU>Hznx3Gf$s`}?=ukGuX1m6%1$WoBf&00qKtF`NQnS;3o$ zC5;mF9Uj(>8X`TS5fc8|)s-I!FS@F#Qo)S@>@Y6l6B{~GmniN#Z?oMKt&m;`vRAZc zJwKm}f+PM{Bs4=HfgbX1&wAsvGkmDepEvk*!7ko&eA6g|sy%yj$|tpT$zjBnG9{=# zzu$*kAZmc+19)I2{yl92!>3W?g#jB4B8Oc#IIOy|g(NN|QUiciF4J4ZBFA}=o8HA4PKP5uTC zPkv4g^F8W2ms$-!f&kQ9x^hLO=vtAJjnh*lTmkW|mam8z4Y)=w{7)@b`?p6|j#rn7I?=l>E;hP8HrvWTgtZ4`9Zit{H%yAcZU}ELcqp(z>cbRs0i$NYUNw zKvRAjA3u(r8vJAgC^ab0=puLJ?6oIWP!98Ja=QKffx5?lIh-x)j<&mAF59B*(;%!E zNdKYVmvD?BQ@-6+!F^@Fei_m=C$`=$C-m53ljA@K4~~s-<>ti8n1x)PWVua@_KE!P zVJf1Nv9PEJ?rg#GV)cK4Q8qE8TC5W)3PofQqyA58F7~fG zw}AcR(WxJQyScd;8F>i-`8UmMl$4b%m?OsKB{3$>FPW~#w`%d;2NqJ?m&n67x2VW= zAWzR_dr`=FGh;%|hQG>Uq;zSdOy70w^SxaH&CJQ1-OTiO=gn`@#_A7uTAWs9#Q*H+ zSXSI8z)J@E?|k_p<#N*e4YQ3beEiU$$YDtv{g?p7EA*j9i>$Jb;A~oWiRx_~bRvLT zpl{%;v}1xb861ym<(*wg`NmWFG`h1mKmlkKa|%rJKlCL&%=Al$2Fb zM8Q4SbCi_q`JmnawHOsYo|2k6rO5k;6oEjXc{w2bgKtAa6#zd0w_X*pXX zHZ~mK;^ef~(ba9AyXtYD`EHcFA`y_@4&0=eLMfwp~+R&s}n3Jyl7-RRHN zp@woE5R+fst*SeyijKbAyJ6zKZ2}Yr8#RO?5ET^#nyU;{4ls*J6W8P}7#kaZpowb< zijU8Ou%V`u?Ch@~OY0^$Tlf^7O!H9l``5i;)iz#;c!j@u zMNl@vl`E^vOMraROJANy^AOlZNlDLEY2Gbd9B?WmG_MF`~ncCY`mf9o8RV=~pQ6%bd{glo7z`$(lAg>%?xx2j)A$}0*C7QPsIMX1+ z*xP^ra$0SZ&Geq$-VIbmMTHY(N`Rjq2ufd4db-KZ@))QYl6QJRW+R|r^xTiOBJ><+ zlU_lLGd}~xk9Xk@uVA9j1I4uCYMqY&q zZnge;G{ZcJbnF)h_}tvQz(^F@f_)2AHuqal9R;5MootwMRV+bCylK3<>@hLT6Whlt zU&+IO9rL;XAk{e2?fv`ZfjJW8mTZia#C&gm8t`L?J8Sye`xJb(Utd-k+TfhYH(De36Dv+V%`3row( z{Wp;yZ{0{pdy)eOIOI1U-F{l?$qiD#2=23@OaPyBbaVhN?#ZHk02r}di^Ap+P{|Lo z>gxXN%_L0Jxa=Gs9lR7vIASpbYJDI0*^MPD_p0n{IjgS}`$NFUAFa5%-@E5c=rMIi zs({a=Ggj=ScJs~e0|QF5ueq{0K2UO?+W8^P$5PVL_7q;0OFlsweK{=`)TX@we2zt* z%#eX+m;3KXMtn6;*9^!fFJ5R4*Vjwv%?2TkdcwLiNG@t^D;5Laj_6S6jw!qgl-NrZ zg6xpy-?W!51@V*wD6VqubFJU+|9p7=NQ$}8M}G)sX@!F?ku zyv4t8@C|oufG4<~`F6{NlR2Pp=wD^(G1tRRg1K2AACGOII^4Iv2`{P!xxJ~W-5RFC z=+x&+55s-Q9Ore>Eji^g@@l*>;DtY83Oz|+r{sC;dnbD_9t=L+!ued2G{c>N@)8& zgxfin{(bs_%N4qLNhA`DRKU9RPE1%isE~5Au&^*ONl3HFm?={)$|AQtN8UpUwFLk< zkbAWwD%A4Xq)uub>EFMr?)j>#smW&lezfV>PyZn#I5-JvKPTjQz``Cmd`3fA+0L#Q z*cUc-z^FrJd&``VCIVLg3dO?Gl0UaoE7COfeJuOXU7D1RuC566eZc#Cw=kG}5COQe z(X+3IX!`tF&uQudQ0EchEN5zJ7%>h7B z0FG@ub&ET@9l#Us)b7;4_NCO~N+6EdW3L;C*ww~!D`Qmyn=Kg!8tz*fqjbdB)R51p zC}yFT`w>LI6_Ns!ca;wTF zL9F6S85?@{^R1R_I7X2q|HX*;g$O-mT;g5I!*wb`N}B!s{qGGnf>+Hvzd34w9Jn;< zarShH-8JgTHnVdIt8EWgM<#DZ;u|gjOpZ=Zw56H6dgraRF=ta#lOWsav+6^&mW4y+)pkQNs=_hVs$M&GkdDukM9;HRF`=rdYZW4Ek`aD6;{e0;*fBa`S$ zr*lpLJA32bAW%F3ba?92sqOO9F7XYxqsRFgTwxg*H{w17MMh>^zkuuguKh!*Ph9 z!m2|6kyS(kw`LWU2&!diem?r!#HSflWHG{q27*X`ul{VTa#(U+u9%tBZXD;~bI~a^ z9|ExesZ#O!EJPD2Pki))Sp3C$D_ckGDnQ=DA71C4n3#aHQ^46TPPT>u3`t9SVs4Jw z)B*An=+l8*ophZjtlztLs!+jx%ci}fqa&8vi+j>rrQ>bmPu_22ZUkrN=H|#MKoqk7 zI~eKA{fX;zx9-$8-H25D2KS29A3S(VE=?g}MAa^r7V6^WK^weMPV%sz`Nrwo8LLjA zrzxKApjUDCI3WLwl9H12bm>10nW?Ft=`*o}7aKn0!anKL233nXfND^*rEI8K$@ba6 zmXZ&hS~s}4J5S~jzP7hBn-D++H|FQ(-FB)b;8DF*>r&I+v@0l^)I}Fv_F6etW98O9~N}ab*iuP|Otia}9A$GDBiidpgSj1iDCv@k;Nx@6p zZaQ5@hNv6fY^kF1hzcdBXJ#$e<&I0j<}U>!LH;~*YjGU%X5BTuaoTbnM}mD095nc8 z0~Mh^Z@dt|K%w-Ipdj!VD#7(bO`Lyzh^@Og0fq{z{9SKD?)yS4TkE{D}itx_8VhJ;PVs1T-|Gp_m z4)INGIgbnvYoma0P76Bkw(ovVu?r-OeW@pj7DZH4lt>T_RFKm0t{KF_VR_VPch#US z0!d10RsPc#1SYe*T$2C_PXX0_uu}J@$&b>RkCk=$H^ZOZF~^C&V?g|cA2n1|Y=@tG zt#H=z(6ItZ5u*O&1r>y~LHp$WzJwuccXm>xxqEbhwve?2eIs-U7NUgz7KFbN&4#?X zC%Jk-FVER?=XQ2>7U(nkBxQ@W_#_6>_<);YVyfS4!+a#9AQwyE;T5f?FT`4zY@Ys2 z>lYZPBrAKff+UT9aR>=2L@p@Sbg+>MR|FKr`1Qs&$k4?_^K=$2E(QKLN}P%b=NTc3 zhmeO*P;m87T4tu~@b@_wvHVj4^l!|J_*mA^UXVaO^IKU_y zF67oyQeOh-ge^g2-d_;_zBdFOCIbF`-euw-K58g0Bjd$tJu!?65EN==VNue2vnA!> z?2++WURKsK0Gya$i6^f>T%0H6Z$IVs3Nr2=8Vg|KTSa>%QPRo->_|xvK?BK^`tSGq zJXS9io}Ol%l|gKTR4_=1OKZ1JaP_(w8W|ngP}&8Dh2fN`fp)w~{#w*Rg5Zn*T{@c1 zz;(EqVJ}UIO-W*4)QcEp3^GwqPY)woUtHPEMEdgOOE*WBjsP-5W@aY5aZQP-fDydo z1~YT>9N^UevcwlLKA~#8$iQG_L$l6>v3~VK1j3_#Z8`5Ojg;BWbb_d~TJfu;-OR6A zuDoJZz4psB}Cm_;9&u<#@MQoLf#Cu+3S^vIAI)1;99p z!!b7<+Z^kvsg<~Swx3_SJqxp@sF;GIX%hE#Z$9+0*-k$`sAvrJ9O`o&Ts zBQF7|0t~&19H%fRBo`m6x2X+yM8Cna80e%9c--+FSyB--ZWAPkQ!glHk@`uLor8m- zyM#DEP&PJc;NsL-QT#HDxd-UX0Sp&kwuatYDsnc#3i(j*YX%kb|)B&RMm(vzQ; zmsiVObJ-|XOp7Q6CCkJsRsRs0j_R5Ty_w|hd`Mq&iTnKd^KMQ^rq$C%*df}>mkZh8 zt+3^~c?CJYTPV)oQf9h+`*uf2NJs-^9)vY`7Z9-TgL=w`NeCkl5x?W$-~dlnLD>6G z&CL&iLxa0IrNzaA2gV#*A#&Umb7?VoHQU4R^eUvuj^kL2nK+!@=n}VbhQCMtXD{K8 z)5*GF`>S?|xZ>G|L|PtaYU<=~f``v7l3|KLLKI?_WmUPkxivL4jfNj-Q^HdXZrc`e z2Sr6?0p?`{2UG^{#eX_K9#i+y&;X;-qEZs|kw+r0dEW*GCb;=}ns0Ay%|$aH zPm!9Mo6FPW+CTN=PWkYu!7e%iM;4Vnr$Wmu*>nT=ywsGGS#{qt%WsIn*%P`L}KKbtV2hh6JQ^;MCRY6iDs1<8yXTis-vK!42_5|xj+Nh0H>mz zcZ~qz{2(6%pkV`UUj#6SFYokxc@O8tmn)X#65O@`0ept599O)~i9KCD8{U@in!ybg znc%ru(E`SSMo)n}uW^6&EQ{Q*+m8&0x*R=1yhw1#ZwG(BC$o`^+3nA!0R}8RCrj(6 zJ%U9i)4%je(+qD|J6-2&ZO!|1rr>@@9Z>n+-rjS}?2#CDcE1T)$X~|yOx>n;VoBsT zFQ0TC3btHDnIwz>vAw%ne#9b#9=GdNa9<^M zXOxx#$$%gtBC6f%umZtRvHE&A2sq^BO3e;BpB&ndpi#EJ>VC)xPJ>N(i{4XVABg?&0QkY$wB_BF7Ah4eRx*s3A(dy`OM-*?9Ar7WJKCh(j z8Gy=QGLi(6jEq!;h_k7=nG@plLB+MS^zxC=W^e zaxJ3x{rmTBk4Tr6mc$aQqTQLexw!=d2IvbD`7Q!<2F0=kueiD$j7%&K6*XIZ(PYKJ z{n3pMfdu#CJtR<&)raeC=frjsD~QW;auyf#|LhN!m{CL6c=*UVMxrqXJ3H?|Ay!uS ztGs|t#wzW5)Ya9|%?OCp9OO3f&Ek>Sj#sY;Zrk32XH))NdGv5x+jHGlH?inOV}B3u zCC@l@>fO876h?sbW{2doG&BanoRB@+o0}Oi{6p2nlA>NLs)R(L}~GA zaZbn2U!bL(D^3|2yi0>ay*=sYvB-vh8yOjiF}M5C@Xjsw#;IDMISXbbzql9LgIln$ zIO?!++o+m2$^*1A&T!?5OP`v?7)Xf-eK(;lAz}|T#p&7OZL2@qA2c3+i?Pw&9c&ic zW^-R>yUGY*nYOmJ;$p4mzh?r=Lm}LjqXDes2je)OEpX&a2q^*`qbL9^I^dZd-<59mio67l_nv0H2_#F zP$ai07fYB9z)O#z!>JHxqN^Y0w@twtJ9F6y1&lKuZOHn*!EeH?uS};|WWldi(?C(B zBsTma{pL?;BFfN|AJVT;Egp?aB~SsXMXjJyy+E1^K9Irm*k^Wjc63y?F2kpxL9$bX z09yUM_QGLh{HUF;>#CqNekHXdMxbux<;ut>BjV?k5L6W>?C7=;GjWU3892{#;)m9< zvVMdR%J=8bpDHwQEe|y`E@HYcJUmu4sejc)(@h9}fr*n56AYr#n8GJB*5A)x_0+e# zynIm>KpZ=~Mfu;cp78e|RVb5rag-mMmmIS9B5N#d90?n@?^h&e5 zh$5kUuXl|9+g6dmRCMFI$CaU+QW1Ll{r^L20mBxU3)qO*N|9FLtE;lc)|2bJtypS#H z=H>UX+xca|C6@ro7!oGa%7eVjegY2+gg>&eu~|$a6QVK9A%O78|4t|P8(CXhW3h>K zb?*3&{=mPOdik;g!(Q@GSw)4ClF~lDAq)|C{Zu%BJByE$uhg_u(&25#@C-N{> zAioh87w0BK3IJo;FH`01n>Q_;o&3Pb-$0?5X(0pV{Q?hn+tO$JNjrc|vghl}TuUekYVYf}N0XawF{ZS8o|%{TS+^%Ms)las1| zPW9_xRne0M>mvLGR?aPSUoZW;wkc)4h}c;3UzZMhXmJYqz?z^q{;?)!V&dcD0W#7> zF#036U%=aTEc*y;Fme0g)A!^;6tL&&d+_Uq%G89RRCWgZ&0oH#mbW^mD=NtVC7#P| z7wp0(=;X~=C1g& zE&!O^JUsbWPg$KGWiKJ9{c~rWaDvlxl)(6l#{569t~lC;Kb1iQ;y?y4@#R*w{#c!R z-T1q}z&~wuhixYdYfv~xRHpFFpTMyvxpRcZ#nreSIfu6Vu)_c-jk-ifclL4zV_Z_v z3)bsx`we0WY4%FYks;OQQb#5KxuA$> z5d>D~GClpaoYI-m?^~`Z9Ke6>`LN5EM!^;o+W?p^;L+^-JQ}>yzR!#C&OfC)t$TWV z?L$1-<>NqcoLFMc;Mo2BDU=LwXB@9ZvM`Rq=u1QKIZEo77_s(4` z!~y{#1mzF`&6kt}MEC5+=9a8TEvRFrsj?GTA*>-PerNz0q#5>h)Dr9rTF5V z=B6g|kx-Q5>;x0QH3TIJn4u|%$>-FS8MR-nTo<{<9vBQQa%5%tBA`zFt?fEiFAW zHAStBG*1Db<>Ax!?c3TFIXOB18vW^3xMiVZRb&7A%X=iSaN7Va#8>gBfcJH_?M+iS zC%PG=D+FM0ePDdt?N^guD4Ps zuPLcwIuH^`IQG1*o{5S4Q&cJ8>Q=*MLn=NWazmFFGSV+-XQtrZ91%B>&}7YQ*E77y!yU zK!>07eIZUckmhT@n*-^D9ey>DuuG2OI2W|0rlzj2s;a66O(3D{SIxgoEi7&)kx2no zhY#mTnw*@B#lqY4uU!Lqp^5m%j>;==(*xX;OyQVy4shI2kbdys0RS1xt)q4~dr3)8 za+M%$0?j#G3fc*oR54~rtzMXy_BxK;iyC)N8RFFec2`tX6yzWVKHA9WnLH2;y>n!j za}r5uf9i;YxVQ*h%U|_g>d7bnjFFYOX26wu$5ucuPT#k#!dQubKrMb0iK%{;S z-po-?pPVS5kp523AYtx-jEu~uZ)?a`C1ejrgUGPUxblV4Z}rG+g^h)uTA{BvkH+i@ zB&DQ$sT9*gzmY){(O2KecS<&TgB&ug)ytbAJ=Jnk29!$b1J=>)rI8(&FY;^mvvN?8 zZWV5$;JFSa{v2oLRlYT8C4|B~fl@eFu37=~>C7h}umki3W~F)qn6FfjiT3vPY>KhK zlBO#q&;yJ&pV{5rJ$r@Ue7M*YR9(*#V`Fv*|7>c@8CX+b-_znhckzK7U#cKujh29y zuQYxCCWps|JFK3sU%w_MJpF`IW@KW5VcVpR7=BuK!|7~;`TTG#`yaX1*4C2(Qh-+* zSlJ^L$0)a%I58M)X||S@>lSaKCjw5LxgPaC;wBfbTK)I+tmrF3xrM}>I2p-`jSUr?N~q{RKZwP5%iIqHj(TS^GBT9h_j>`$lmUcdwGqt7%M-H{a#+-~ zu*ema>kQ0EvxqKu{`(6c5(MONn{PUzB@sj}lh#J?Dm)C~)%$<@`hQb9^eD*FDw=nf$iS+cga*5BV>WYWbi zA5>XW^D1mjme$hVKG|FbemmlyP!K+^8Uum@gaST5 zNtEdx{I$OP0W-9?S>c7n3X)fwa)AltX z?bokgNF>s(!P8G0+?FaR+`TKbv_loPGw?tLAdKMyo|?@b;pK9pky49MXMm;LxNq|( zs>F3ep(ZLKVyESLAb`pn5Ize~q3hz{r)25CdH#EDm8f<#HMJ-~qL6L^D9PT@F$P8C za>q+IK7+RBIT=Wdw7xkq_$@I0gBjscuyL@kw&tx4blRaje;&X^G=9{(^%^zKWLcRA zyNlo)q@-E&Sxj!=U}7>TWcE?@&odT4KpRR=+KhAfGLd=&BJ_dLS7?VMnNjfSq(=b| zu6fzny+Wjt7kfoM-j|k+$v{w+2gSv8xB}SZR5CMLP*D=yikUe4B1UjSBeQJOrVZqN zJ@BqTciUXws0kF^9!w4t%W`L>yK?0q!hJ6S-c~^f;nQkr#&9=d1)n!8IVhE;=S;;p zjyuKhTVVbiZU~qU-Z95O*l6%fK=A8mYiqN?{*>n0sT()6D%wDy7qxbEMfeE|Nq%}k z4B=h>nQlA&Gr9lN+Pa%Qx_e^6Dt}7NrK_doO|%lcttOc=ML|(EmIyUI=@bD)}YApq` z*FZK33+oU-yjGLE@bteVO)1f*5Zk zbZO}5xO}$(xe*nrNua)jd-R1mWyU9JaJ+uiS_WTp;@1=etb>nYCvlbrKc~dMLUkrL$>7w z^)1=@d=;Wf-T-p|DrnEW&o?5?fe|MxGbPYO0c8#(67ZxLwWMAt{*HWe6KTa6G%Enm zUQC=~=LE1uX;oDt-Y8Jraw9!G=nh6EA@ispgsJ^B;m@ZKl*3_Jb}&$Pyah6+Z*cG_ z#>mhRCeQ&r$6TE5iCl!gH-pMUz7Ykrg^#j|cq64vr z(5xRC3zFM@@E~MChO3yql2V|40jU2V2^;RlWHLuuevD52$(Aw*RSqA)(CNu9C@2`W z^QF0Y!Q02spDHyqwI>tc*0a9;{_Q48C0KZsCMd#_7fv&ACyJv|69nN`OV0>AiqOp9 zu50yGer4i#X#)QI0TMpXXQ~C>#Z(Ha#}J2Op0xyu6iw_h?p;`jb~7e`&O`uWriq!J zeqvfxRn^x{O+__1Jv}`$BbPMN&>(ru8-fb{ey1M)>&oTJNV;U~%8ql*v+=>-7j9)P zIU%<-e*gMK1+~}nb%_|QQ>A=(q!@lTs8Ma_a{&Oso6P-oG`T*-!I zsp;wIE}ofFY6)HGPgpoOIJmgDcs1)8c}byySquhq*h2#xe0os|KuCalCN?xc7^QT4 z{i+PNmq6*yn1~+?apqSW*5%Z0_Q=88j~?6iso8J?MVoisHtRPZEnhp_=z>>dK}e;i=^(6FOV&q4+*32N zP@m7++uQv9unxu1H8c9ZD_qpXwsv-^gUo#Jw@4x{N?fPjw^$S+Jy}d{`tpTnnpHkL zi;?s3VJ!vzYO6=u1{E1)K6c{jl`AT?0Be&rr~sJA=aQQ4ja~9c{qlRQg~MvVo8F%r zutRjr=H}+fKrXn@=#&qiv6SVB;Hl8nkF5ZU*QDm z^JxeoY*n4i)2oVq@ykyoT`{V&yu3Wds&?->!`_=%nHxYdz6bA>=jEJSUtgc|#(Epi zpJ{=*Icq`K@dFNXnQS>9_n8rQ)2>j|_}Y#qDfeKtQ&F)pCj?EaxVX4TOTX?kAkn z05HLDe-Ow`>1nlRW@h%Co>V;mT@^QKFa}A*#l-~$58s08q_821kajh(qs?9=ku`78 zg@@c9;S>RR6Ib}|BM9b8AYE$r`|_8EilnW=BO=^)swO>OUD?cO%eN3JUK#4TDOP zk_-w(Ra8`XPR`*!8QjK81{;6f-gbanOEIkNv+04rhF4IoZ){9uJs8l^(gHU~{p!TS zVby@F-DXBav>EfXr%i7;_Z@;-FKE6o*hqD_kLa>F&C4L~AqhaCRfSiy#{tN=RlmT% zh}2Ckozl}C>OT}Yptk!aCh25>z^DMpOGjzfDfwomQeM`#9wbS7yF4vDNRghN9vq*r zurLeD{bz9VMlN1HWwsbGh7`J|IP>1-J7;{N(M52B*G~urU)lpu^gP)8* z9!fX@r#)2uJh{`*ZC6tK-(CR77(OQ_$m2fKLW}|dDCH-c(vykdAXowtG#LAzaIXw% zL!LCw@n64#=Q>5TNQ->6hBR=v`*k>9B1SUgv+oe zGGTMmE-pQ2-x5COVPCdBt`Q0kE-fw1bL@>G#W+ZGgriEPCnr<1de~&*f`jXAzkpx% zeXcisVSfJdl`F80VxN>W!mRW#kpklh)VeaD$Ch_*0mMh}I>`y@*o* z)x?=AMRD?L!K-T^9qzNpC4fIHBpZHaYGq{waAyF~KrX-9Fyp7S;JP_@DYmw@Q@jx; z^Cg-gfBj4NSuL+m(rl6DKDD)CF5f+iL+=}R1^cPWl>R*|XMK|yBE2gm67_X}gtT&X zB<#_nFG|$p=<*>iYC_WB$jA%`t2I|Ji$!#JquN>GS-H8n;m-sK>kP-n#?gG*gq9q1^u1b}_-)>o&9kGJ&y*sqM&q)F#> zSXE4giy!|M@9gMMgCNE`_V!ydVmlR}Dr)wm-8ZH6cN;GLRWln(>PF`j1#PF>K~Z&& z#VXE(bLntbuS%N2!^0<*UJgGv7?~4PT2fL{Ts*5wq}M`VDJ75%C~10xii%1m2FS-$ zS_u2??Z{o#AAiWlcklTjV)(<;QQ6@9yc0TO(nP4qzCD43fSyt6` z%_y^WWwE!I5NA!r*YxoFc{Mw;Vy-NJG@JPUuQm**{Kp_prS4GGpu8I*>WgM zz2g;Gd=yP+Zct1N=czO*^b7Ek)lWwSWrC|{w%7+G9Qy=|bgQyIxh{o}kPv(ZEdAl} zPM!PWr)F|G49FCscGF~@`zE5<=G)^&{Tniw%Qb|xQgf-5{&mYiQUs_ti7}X{x z-{tSSIxC?(8;hV7vS$(%5ut<%t^uR5kbw{?m>={p{X(s#su~8ahzR``KYf&~KY-Ms z!OH|9w@<$~JwMkx5IP_q_#=Uk_@Yk<2UWL}m1aZyoGNJyQc zhMwIlsPF=Ovf$w0;IrU*^^Uh>F&HJLwh)6xqe=pZbNt5-Y)R@DWgQ*iIO%-Bs{zV# zfFxvP{fgloE>`gT8jUwfQWW?YV16QFzeIL6G&G3sg^D`?Biu|0fG5(2Ex~m?SepJ@ z-DXQ?=kd>T?l+p%0TmenRC7L9Dm!;ou)zJ#F@UecgBIf-U*2Egsa|aWBw{{ZEyTnG zYPdkY<(D}~hobiZrjf_`L8tVeKmUXpm{;eX0*nb18X<)J=L>n?S62(*v#yov%{%wQ zOX1{GHU~CfNfrsxUshH&O_~6Ifzft!`vrm>=l$L1($%Y~KjG!w>q)(aK-LU#cP9??v%8-q>1k&puP>6wo|Jah%mko9xz#WVA)?Ch$_$~0FE z;BU0FqDXXu_yq(s;H4v9coGH7PZTDTI&XsZb7$8=4Mc8|2QXitvBjO0Ht%>^M_+uL8W?!pHa%1SssNIFR05I)ed z7QC8CLz$CkHkMgL?cKg|1JZop`}%bi+w2PjEt?Cg%*||tGPc1AyFllt?0;QA3A}%g|(z4(IkHN|5|C0(Tz`TF|zHeY)Ar?Vb4qgI!s%mn$ ziN``BARUGqk{5HS5pJMfzE-@S%goB!?*)`?mS3X|c*@ z*LCePESyZ9KArth@3o?-7%TX5%h_vL{n4Z6L&gz$&U2|3_3VPL4#VbBOG85g(9%ic zLM8eB+vDS7(^^qJz9Jwe6BF;eMxPOS2&#|u?|#Z~hQMZ{K-E<_P2QNI7wFY6+cj&miIK)12O+^&Y zI5jo3v9a+&f38lILvH)h4fvd=CxENO4}YGUVs74ybwA#7-%odU{!Fa_en_FdwY9Y~ z?vn2o@>;${e6#!RJvss?yc{4w*j&5u(72B-FdPhc^QP`?`U#?T}!5^ySw|W41#MGS+5H`0W0{6 zX=%Ql>J;#j6-!Q6Pj7FpS@1B9)6U*rRv2E`KmkG`=9J+qk=5yb!H@Fjll?LXyAL@N z6B9W(IiS9a_XVPh7_UE5R}V+6%f?u=MgiI2u_YG`)czdahtH%Fpkevga<`S=yLTuK zj;w;#uC74XegdBDgLik#CI`}sI)C4UO%J>Y{baWo6v=?@a$l+0;lF)*t^=OMJX&$D z1CSuJ>Ri(tKqqYd0}o2ccD6eST=1$gX_}82PD3%x$(b#ahW_nm? zsEV#`PSK^58{j(GtfuyNEvH>rXyz6z5+hZg&pU)P5Ell#^Z>w#f`Y;)l2JQ&(l@;N z@fBL3)IK57ZEc^s4i2S$8t_4?&y|tsy_v$sld4dG_WO75;A2%3x?hnlg%25fw{}1K zMJ=CX7V;e=$cA$bd{o>siL$u3IF(vX_|%P3_)9i_2Zh7EK%8DK=uBYjW`pK3b8>*# z6L;!U(_n`n-Yy(s+cx1~^#9m<3#TlneeY}SwLY<9U7xjUR>x}u z*FW1YlmY_f^j#FNTb(N$bONylX>py8@50wRFJ4SviBL1!8jCRQFAh7J1^S?%r>Cd7 zT1?r(=*5e+qT}t#rraR!d~i+Mh=_>1eSDI}>G-gmFE}0J(j5{~hkC`ii?&>vtt7f} z<3{_#Cl92h{c%UWC66CJZqZ%)Gb`^uyA(PiZV&bJ^or4O(-%}3w1%Gy$S7`;Vi`t) zaoNDm`poYF3Dj%fXGZc;sLxdrt-A(7&>83>9@GTT2!Z}el}~x`;)Qgapum{w#giUQ z%2%10RrMcAN}{)bH~2}OJQx8_BCSXPwltczMD3vxgHg+5YNd>*UyyTOw zJ)oqa$;PxO&<*1yA{33Mm4p{Kh2%LbXDs-1^DI=LmXf670>i@@K;meb7OA0Y$X{qj zRyH@kM$+-#Z+ssJ388(b7AjOem?;@VKs&ct*tu<1sCf|Sq}*FuTYW)OF{@VqiaTZO@>^W zp53xt))`{G2NO!JVe=R2Yj7oYa}EaNaWcxD5X;noc?5BXAkIB$CUhW zF;KFsuBn-$APT8semlmkMStUlYzpIfr>J5^1b`K09qsK2@}!c?AWiuB_>$wi_$eqP zVz~JvMaVhcisNqUVTW`~kUKIoH2ggIF+cy$oK-qSa8*u51`8N&)Ci0jy)uGh?XkML zW4+n(=)+V2YMIGG9UYynb~4D-f1S%JylH2w%VExuCab>`Gq0Sh*Vu18xEB=Q@Ycg0 z56kgvis9d=IDBfhCtt#Nze;nr>R&^P3h^7aZf$m`8qW=uALMsx7`}XYypN8HYptF+ z8?`cIFW)tz-p0d}@^x5uGLj(NWn~&39JNm^_!j*9{n=Ppek&j6ixg2PK6~cOIZVp{ zxAdfSZ)#!TR7@IevTdr6l-Ux^O_@sLko)_1N;h<9xhjdA?%CUyL>>l#@iYXqS!^s@ zrnG7xBrgNwN;JoX!h(YBd#n#|%e!bxvEnU3P*~VKYF-S>rI(jWc{x2j4WYj?OG8Tf zL{9FD)%WeSnTPyn)%p*x>UzwA!+q(%)nt}*-1}`IJ(^-z(Y6A|o24XnM*|=myOsSN zv>rEz3d0m6H42{KvaBb9UL4q1j0yoLz>tk@P%Sqe}?l66;&o~btij02Ta1X6B2N!NI|j-$a2le#J$K_TaXT-g*DhFDNW5 zRFVAc`diM|&#!S(rt0UZ!lB{QiB;?%?OoyHxp)l$DE& z`is52iN<44jvx{?b{L^t__pFdRkXi7Beb)hDKYflwSeyC@v$+$)*PK$yr1M{i*AlP z>r;(KX&e?E7wqGJU)+|r9DrZ!_trYcx~x|xWxH2LNyV8n>n(ft04dY#{N=kQA+EWs-KuJJE7? z@7^^tGi!N3P=Z?=VwN>DOm9+{{0!9lUX;(n!{g7z%U7=G_COI#UJ?+98En9-kUVkn zB=8|uZ>=7#frBsA$@@kaMYwLL0(f2ro&9ORJVp>wPP0#~kFIdyxnV!Sa5E%4ikiHQkr)yYr`Iw%>VLz@Eyuc9CrNt72Z z*sV13Y|Qm;Y|msD=H=nfqh%*%)+bM%fab#op`DSHRltbapvp|dqtkMLrAbLi3_&8} zfw(1DEfL(AlIsf~*w-3M8DuI4rfu9zbeV5mJZT>*+QJ7zK}SI<>aT=^QE`L016*tq zpEE1^-FKORVY>>^$Y~r~a$cT!h)%--t*mZrG*2$nlEj3BB;=CL$`ao;IgGj3UOGB6 zauxzW7oi@%!G7%;hXFB+^kTvxQ1xr;y~fUC%$h+=hNbTV0~fty9EN|;?3>^YcY_uI zSBp3n6wB3_4c-8ueH+{fM6EyIItLATZ5FkLWHdNAIkUeGd#7g=PX|k|1szU8$NB<) zJO^32R|3-`y;be$>AAbRi)%5$(O<8NYi^7EI*e0c<2nuweLt`M>tz~HlklBRP;g)i zfg_)i2$2DlQ_%u>#WdZIjAIJdmx%aYRRUJ>g2M_w{lvZFxQ}mMn|MGTxHX*`yo%Z5 zr%v(k@RX=!aT#`W-66}P*h>u!Jr|N07!eTxaXCy5RR%=xPKKk=a`>m0cKAq5fQO(b z7$Eq8s0z1y!%l|FmytI8BQ-9zzrS$cG|?23JONXEupCj&veJz9=WHDv9XI;SWwf;u zegh{7?M=y?J$n|?CjHmY&`=o^(0u<+k74#2Y8HBdoO~m8ZB=qBtG2e*)z$T1i*^nP2y(`6W~?F_CqhW-CnukSxNI(|OUjU>kYHYu zq^aYl@c0qWdCoOBqE-RR>8Tw{J6@o!uFi4Nx-@FFmi9I`ce0+e9;s!4=r+FmOa*}x z&0);^@(7ftIaF01E1CLNH8!q0rlzL0wzgYj^0nTwxD!7Z@%NcE1w};~kW*ii3JN+V zR-_7Y)l9;|!d`XdJl)$~Lr0F6f1u{!CF&(sj!+rgg~>X)x{i=X-Nlya@EHyF9Ub=$ zHV*cjw}Y?<4ZA6{=TTex02xV(`Mx6U8vnWel8rx#ngW*7p@ZpABH(LUfrd(6^>RNu z3T8UBva&KVGP3yC7p1|D4sNhjo2p7mN*Wq$h8xAK*RDPLOO5H_7I1UY);2bdN{AX%~1>J@Z;qihu;CZynjCxQGl*vV%T5w-mI3E4+&%zdHx|~0o%r*xA2*nzJlW{1AVWObmTO2p~8RduVa&vMP z4K;UqY$sw;5Ld3z`(&ZjHFf*Bd?+a;fWkqW5kI8HfKxymI%O+7e*ChxK+U1qJJ#V~c-(fS;kW3fJCtKS7Cl zWc7}Y>JXrd^At2R2dx24t0OcAT@x!)v8O<&fqR+ww?VAbq+>NkthxDppwvDrOkfYJ zUgF1(sCO!5(N#gPbHwc57D0nfS}-zkiCy&=yV;rF@$c^zI^$cmzcr)sn}tA3yVCKiqVOQnP`HL zq9NR#loAI}CHM=oTC>f?za-{{9NGm=d)t1LJku2fS*U-vUP^xcTK4{Qwm*$f7LV@I z66N4#by9>z8d4|MZ{K#<=(q0d?37?#VMI_WFDC~dOE?b9&0e-S3_)n=>YCh;yLZp+ z$1cgiD#`(U=?kbLtb+HNaiG$ zj^QI6{;DY_XNGpOocFid!o$K$O^yQfBoq$V%`|B4FSoP=4t!g#XD;9VlU@I^2+3H_ zj9dqBZhvk>bgEnT^OSE%K^lpsrKZ}pUTPq7Vt>_>Hw9_XRpw|fCgu*mv65U=q+D}j z@~%6WJSOK$8cIsfhtDUDX`RsG!kwS^#UIg-be2rg5RY6%RrL>QW62*Q9h0bahHTf2 zY%}Q=CRsga)v&7Ula!E$(Np)DPXhsp-C+;{ac-tgrsC2+JRCd z`GVd7NWvflx~lA8Z()W;m-nJSyTe~%>poKt^!%;pj?|Qlvr6Z|j`P6+co8{pwg%6Q zjGWfH^{wZ6#x}IwK~4Cu6+Z__3PDmA7f0JdD=#54i;K5c@l!3EvN8YO%UHIuC-3OjW+F5o5_eMwas6 zPeH+So|}TtZ?*`D#z5aXAbX0l7T;aja56$GsJ7b%sIL1MpOpw-$^rTC$cSaFXi(CJ z55g+E#}pwHyn$6^?I|*7xoT%)LC9oC*t0?4{i~88S7L6}`i6#oyDQlD7Zw()$eAov zk*_67<~mI958|2#VOnF`9?qK{jIlPN${TUJ(~9NdxRVH4Jx$TPxedb`cMB&cCm~SF zVCF!u4^rZ8Ub+LUKe-nY5@Jd6Mp`G(%hbv5zdiUQGqba^8HJ(9 zt*r}m@P zD=Q6+*xwxF$)Fg8k?6yZDWGK>ZFja;Q&Wq-CtYCK0*H&z|aDU&)am2{u9yz)vt0B_przSY1<;LRk>uuyG0)v05 z-Ok9O*FI&0-tzqTZbf6z|7nn zWYh0Kn+QEKfdo_~5EvvNRe@sBSvpnY(tPKGeNYJ>c79e@8$q2kgtH4v@_|`AU01n1+ntLXkpZve^zW9IN1l7&nVvieyI8}c0uuck z#&Q(xRpof2BmEv9ttDGziQ`u$lFyNoM;NpQ5m^Bu?AB6ZdLr&K$rwj)I)%5te@7*e z?E(Wmcli#!%N1P{lNxc%N3Y5lslZEbP}${;edbe}(eZZnfv zI8gAecWd`&O^v2WB>{Tya8_0Hj^6(?4RAS0eS5RJ*~!YrMoGE+isR;A4@h-!NG64l zorQAe&MftMJCg6s&im%$`UqSQH~C2boY4GS1G< zQc_aj(jd1olhV@-BNzOA-dG* z^A|+&9@^{w{P~9Np4n>aeHvgnge+lGGc)Lj>Y8@(!KlpsC}-T3FQm&~TH-6sw^x1{ zJFP@@bST(6YiJCh(|f%}C4Pev5Yfb&TwGLz(K(Z&!*xL9an>1^68-+W7Jxgg7i%>{frZZ;wNdBXCI$@QXunKf;M>gctigo!O@Rfvg!JzfDuyp!STLg=*INT%);904 zo+Bgs@(Z0e;N<4ES{$n68L-hFEOShejv*?3%gA^HWd{gphq@~f8R{kBHGF92sTf_d zMwcc9Z9{B#ocAZ3!)@(RNR#wqZN;RICwlt&It+U;dg|a|w7#QlJOBU76Om3HKTJnJ zY+H7!>*}KJwJbNx@P+KxXP1tp$i%JN+zy$$NJ**sB-DY9i1!5v(c ziL4;}9|-K-AL+Sr`SQE_2{WGvifHRTe%6A-!M;#iZbh6)51$jOCah0y@|Uxu-y_p2pjJcn;*+f{0sPd zF(PVeeFWrcA2`XmUv`oFdj(6*&0W-2511j%@cl1aNRb${Q;4N^F$yku?d@zxm`)`{ z?6(W;g`oW4zI6-TTi4v1R>WPQG4B2{c86xWrQlVs(!)cTR^0^}nrz^2r`=7jvyA>! z{8ry(7R8^zu)B<&5rw-h}_=0|=NMB(Et;)sq zRoP2szkq7I{;$`UmREPF{l?zLV79ZZC8#k(lB&6Sekeq$=H@Fg)&soU+ze|Y0YVzM zP05PgTY!u*&fD@uw+jzM=@}U(5@_}&A#vva3ErO3W#yBT_d)YIZ06+AQJaSa2GXu9 zMzPA7d^nne;X?BIt6En0v2BsbVk!y>+1%jR*x0Bj=Cf|_01!vsaNv*FR6J}&|M~Mz z`~4RvDN}4cG9_1Qg<}j`4T#&sV}gQCpFSNAW?J0Rat$F>Z)Yb@jCI{-;rpzQA3qKS z2_F#=QUJqEYwPG(Uv6Mu=r6H8*hj}6U-Q?p4C;oXHU9rJ7L^E#{_VKrqq(}}AZH9B z5^%)N$44IiMcfgzhVAZBP14t4Z{|b=7`q@CV1ZXt)6*O=0Aw_~Lr2jb-OBOHK;fr( zBcoW{&oW9&TID{`(HZT@H{_8)Eqt--r_h7b?!GWIR8>(~rEiI1g{(&%3&zi!Jquzo zmzD382=mpesJnuKrY8FvTfpG%Tz$(PSH~cRn-rgXe0;#%B%#-lU%OV1^R#1iBTLb| z=HtNPkgcHw$;k|pCqkS+XpIR!QczIP(8y{h8x7R}iSTFQr`K6@HoJknTuoh_YBMdG zQ_Z6Fo@${{>Fk$=(P(r^Myn3>@|Nld|m;3tcANvGzT}zJK)p0gWl}G+?=AmZ8O z|3!e9h={EKeKGFz!FSw|2EA+mynp>hpiU_EPJ8?a;`PeN$mr@)BEa4`^YPt3%I4|r zexy5k++O!58w(4|m(Z{CoX#>gtcGaHV-ow^`J~hl)Ux(3({^UoW|1=E^_k!m^yF->G{c;Uv6-YY# zJBz2a(sJk2-h}gh%DGN8^G4JQ8`<1PXzQp;J75m=%DO8ireWQ0>AbG*tRO23*;%pt zyQ}N@m-EvzGmO3HILFZ&p6CUGm^tnyzWjMAs#pK^IY44YwHTpxwflo!K0XbNjg7eT z-m$-bKZb|AYDRE5!S2qTACM4~EONCKf-%hW6m=_%=OhF9aD^Ps8&G53X4ZGd>`joX`k?6@w=Dqkq@?_gFVo?%@6~=)$E7)2 z2)kVEgV^`)Q_3%sBa}|6gb~svN7Ke zh&;WK#xh#IQM%9%C?BS%@lfk5nmR5)!F@1W+kkB0d`wJJUW~D|xYLzbdi4+x-<-0d;ce+AUXhmK9Gll!)&xRsF3x30QH(( z>Fb@l_wJ!90B8+RH$uI@pq-)nF?Rg~(w7RU5SfmS4)Ab2M+?f*VEFj8FXfdRZ2 z|A@_BXf@MmxsEXja(K5jz$p)R=Nh|?YG%N+hN`}}c?BJ*^Y->eJaD|Uv=l8^#5rwG zRaT1hpQWN=^_U89oYlr{h`5A(A6dF6=%A#3vWWX5TQcArTH|jCXnfzU;(sbWMt&$=bz}8L#rWLOJDovBO@bwdU`-uzmU+^p9ozD zwhj6C@gq1eTs_ja;6&L+X3gsNUnc&crfSbn>;gL zbkd*_?U;jZ=!Yy(XN$l!e@AtXUJ{_&K=xh*Z8yx zoOb4TSn~7pMK4_;b#n4K5_TU!6QI|0fQYeKY2+y>F2=L=^zkVf4VK9I zwp^c{T^31s0y~e2CHyl~3d99<;{!kH;o*_8HPF@7bsHU16A=-4`t+%(sj0NIKNJjw zU|e=q*8JvM&`$w=er`?@IyySCvaKqV3?i5oS0M50!{ML`<8GOLpIMVGNcr(MFyV*$ z2})qYL{?VTu|gx@0&z1d)W-8c) z+*j28m(Y28bqbh~>feGqYM8vyTvx}$%*@Qr&d$mj_6+yNj~u?*zQSKF<*#^6hwpj{ zjEx@rJ37CzH4#^CIwFP&{S_z{8KJ#Z&gR?gXhFgH))@c!7$rFNhYug7CS_zuPJjRY{ohsYV9*KgIrXKLrQ-xy*C5F}_W(yA3c7D2Ow0Pt zpz|46y1S$;4X@cKIB&F#89*&?Eh=P=sm7C-1(>p_xfylg=cG%aK!+2d$|ZQ07VQlh z!dXEz?^w-tRT40vi!QW2zYF`!e4MUV{GUTOn4~HY1kG+G&4Zxm=-oc^<|R&Un8;Az zYUhIu=YypH=aa&kr-$G1IJxB@SgyFTyo@?W8Dni z6{TDiw3B`P4371d@@J&pK`+Tf z-=fR(-F+Q$PRzl<0d%)6TFP}pon)nOcI3}}HWKt+gTaIS4dc?aaDawlnU^nTtNkb~ zhg^pO522N7U>DS~-Fdghd3AlgXD3E_0)-AlZK33y$tU2T`d3n*AZgPO;?25P?=K;3(i|(5n~xz z;Cf-wowD_Gbksm@A&?kvj5_uVQ^4(+5;x9S#oe}D2E7YP-7>tatc+|^yA&~(C#ZLX^IU$X z&L#V1!<+wI3sB9Xa-Aokq%1*f&``EH?30Ar>6n`U!=t0FP&ONOrR)3X?C@a#MUWO> zJ5Qq5$Q!(T`EA6X-y(1oJQdpvIVufzYWvyG$V$ld+0A64(>bU#f`ML0dF4)>JUQLC zySwW_ZTB2^cOT0TG%DNy`0Yi^TWT*r9Wa;<(29z2eXf_ic=8f~));!@(DelsRaJO4 z^b)7`aF`RO!84@jkaHgBgZ;)%Vm~4SRI`(8_WLcW!PBBTK z7I4N>p%ATdwuSS~@C-U|n)Ik-DCg>}j5m^N*u?)*Gw#X}$)bW`SM=5XnE~olFY?W| z=8I`kh3tWP|ApI{z?8zuR+HFEcb6OF)SUO$oHwkU(L2TUvf|_aLY!RAfeL6AI&eTQ z>Vk}rQ&j9c*w#ESgh@|E?;qJ(O%cjOHO9rqS8Tm75W{aR&YVA(UR70P-Dg_ETG$ti zHgPg;A(Z?sL+0mCBjmI^`mq1xsZ%mr;Q$95KGBZiB~O1G0Z>o?P9B7aLw%v6KH#J1 z)-yhR`U;Mq;AOYjUpMmPq$DWmP;}uPoYO9F@?%BCqh*or-hDbuKDtaOLlzIia+m*}a#mu0EwEfm zuc&Srh90&HoYYpp!Dhhtkp}c-e?4fV|1D>eQc_bpEme_Q&-bAfT>pT8UQM9--ZIA> zP>@BS90{}t&|)pg5zvc_Ea8Slw?)Rt)l6RJ;SM}69%wJHeMsOd#{5rF_X&J0F*NlcV?Gx#Y{dGgFWx5JP1J{s z=~17zAzf8}ys)YDv3+$8hk(xfS%xT*t%D}&rrF*?i7zF#oaXxDCx=ErS)2(T_-Z-= z`ZAM-RVha+=+eE!`M~)%@VqAJkiOE-(&7KTTzUjFSiU`-PDFa`uKz{lLxlUapr;mn$k{bOf9}>E2-qxERM!3d;UN>k z;Fm|wsZ&dPp!e%t(B%&pi9@Nw)-pUyi9=W4M>QW%-2Mj*p-g90-SMzrC#m>QIh~;7 zesH;GIR4!Y?Qj<5FAst)5fGEDE-s?kp0`>Wu8MQsw}o=44!ZvIdnl`Ffm9TCUGNpO z%HSf0-bAKWvYUY$)d(Hy7wMW-(9Njl5=b$>Ee6#*K#N0=+;GL%9zYHk5(UiZ8O!Cma_ zsm)OsrOvN+H_XR>QE=!4y5eE@=BSzH&O$j9R;ghpoBhPk02(39G6%?|Iv`K)bLei? zf#u)tZd`^PyMS>p?i`z|Prtv_1rmIc_IQ1^8+^2Ih0WIT7?kmC>v^@6$#;3eDuqTc zcQ4Q(+TB4wX8m99=-h&@NcdmiLVfo)-xL;Fd!4zWQSL;=Ao;F*f7|EWD2Cya=jt_X zPo>1IewEu?{0ml6^MmjqWJjIb#vobthO2yFfJTDUTrYm}Sx(=4-a>1)I!PqFcz2%w zbD=LZ9vp!G?eFc34Kgccb@8*l?8-@%Pifk9o@!6gk2A*z4-I^?HD4U6drB6#GV3#KoCpbR; zs`cZ&-h9Id?pG@4A>Vy-+ACHoGJ`A)UQT=%vOLy+U~V@>HbKlT(YFJBrm_Kw)NXxt zYj?|>>AvrI)9-JO6`4<<_pl#WLb6u*kY_9Bit$k9)dtabrah5(hId1|`Z4B8iRP0< z02r>J0TI2wIon-G64ip2yfBrq0ww1jG@QWb>VOmr;jt`dI#OifRD>=t$z7%py{h)r zBwo}_E?E++a?TyR`jrXP*#_cYxMj0C+1e1stXO0=2G9-(=z=jw1<^R~E&*|0_qVaL zLx+cfBhZ>z&KJmeLC5W@aaJQ=bQ@58miti)sE9QtwiH{=z?U;awmP70z%LdVWnv$6 z|M;QZmiVyyi!Mreg~ZCml2iR=Es1-NV3Gkf0R>bK5elNJ+#G@w(GUbOdbSX)Qx`n8 zNcWU}-R-bTpgtrha%$gfb9v`J(n&?$gd$^k{3&oZ9RTGySQZEYP*`Bq(wQsbk26*B zpSONQGxZ22BMD^i!TwHm86}p>lFoEi_Vx zI!Jm{Y%z73UJRYO&v++)9b)|olE&*SBbus$+m727`!IzQO^&ORL8jNi;)B#i)cEfD z({nCEF1y4SNe>mTna-cICm0qvKP$666)n4G^LrD@5Y>=oKN}nNN zq?G{eK?63vCx7%ld&jR2&ap5Lzs_uB4qA}{o zcz;eVMS8D>#u+_{HG06;cm#OCHTF*D;`+;^kwPhgiGwmq>h;k;obM=J| zc5{#Od~@7Upjld6d=B=fzt|EyUOI;VG*R`i%Om}{o_v^wu3Y_qwL1pw$*jZl5DA#0 zk8}Mc)*Ttj9dEWNIQ3Wn7^}QVN2+|Fv`v~mYu6k(e%@qh_}<8ak9WNyZyLxYh@C*! zcqcW=9J&G8p+qN3K0m9vz^Nw*xs7;kh*JBqfb%|X9YzY~m+^-_K&s8!bl5JlF8r=* z6ihTs&-g@~vw~n$=x9?+iCmI6`th=>vL7vAq!2Th>)V#op%<6d*Y`m*SS<_)y!ibI z7>EfIA>AU!X!CA?asaUG%urq#tvl=Ead}%F<_k(B=QkN9`UbcQfMW-$Zu|}SZc>Lt z$@gI9hVnYIHIaM-I1+m?fPd^v-plSUW@Gh00H}yx&qF*oEat|>k{0ypf^~sR?h3-> z4JE?g&xn>eY#~_K0pI`)aEB;@P5sgV%tGa3h+(z zMnED!%dyv=x@vSxjE(&Pgf60lm=VxEAX=I4=O@4jTdn5%c!B;PG2WkYKX#S@o(~iR zlWGBrDGf$=C6Vns*f^jpU-~xn?8m8cz()WxX)sZ(P~rekR@{BDj07|TcFQa?2khkuqWcbWrT({D-DqXWR%fr8e+aQHvhPfGHfNxhXwn#k( zoFkj7hfbrora*=MNmpE`4`Y_g`ajaee15Q82&fupbFu^?e3n5n(3#ZbgU2y_j3gKx z9_-0OowPY=Btx&thFyCCBpyyHf(MUEWz=8H1>evZ#Y1_2_@`Gph=U7UFKldVAobM> z0p39c3Oetr4YDeK8MPjCtZ8b4!Lj&=0xPpk-6^N8iyRE&(GjlLlq(c1Q_f$=H~`VcSdRg*7_$~6AB?^ zrDOQuv&*;lHUXM92O(|W0m3~X~o6S-rk8zn^VJQ!k2<`xZ00-406YEu4fJMhe-I*84dXQKnV5mi?`rO z-)tNG{v=ysF(sF&!Ubs&=Cl^y0ErLcPY3iSL~TFE`M^n=OB-S+7C?>q{kpoqfU?2Q zM!-{2v#Ow8AlTR1+Va3l_lQu06rk+d5Qt+Wc%$`U64y443W6#L=Q314|LlF!piMIN zcG1%x?gIk@fPu@9v6Gyyn&`c*w4V z+Jrcn?X1624_u7E85PLpsqf%ckmJ|~2a!lz9vXJ`ziR=b==7A60x&gLkZW-keiGp< zvY6{}R276bfZAYe59t7EIQ4#ARm%AQF?vRS-``;gOqC< zgR%wQlSY|y0s`l}x1E0u37UeJ%4iNZy#^MAfBKNizz=+V0(oI6A~S)Ot<|AOf4DoA zGt2;wqvFlJz+;p_oUV{5_n!ehFaekuYlxUx4y3z-5CFsCyZk88tF;*2fB*onz_kvY z1gX;DhBg;#gYKYVP@v9cZqKT`r@U}4m7@XS^LXFy924q_X;KI}Vdi^71Uou>xqs=t zKWfy%gv16AE*ggn0AfmEFM9VSbqYpu?mEE{v9I7d)f zCLxdxGom2ykdJu;Tt})-i%1LGorMoBCi#c`B-o|9o*x_vYSBfCyPg!B$!vY)&ZtrB z<`ZCki@!j&M8Yj3<3NNU97c-_U$?`6&tbHi=4$K@=!GCf>vR z!EYaW?SCD8R{-I82;_6gmBSeATT_mA9~|zCodl_MKLL->>N_(geEn~;FK^S$?=a_{ zBX*Tb3FxzqUVMCMo9-y%qbisnmytOCoR9G^be9A3n$jCVVB@)_rYP=>Rhw&U*IT&1OLW7WuTHIBxge}zK)N|I|`vp*zL*FnkFXM z{C*7+HX-2#ZV?O>0;wnp(I?t&#;}bS1K*0a58hrMV_fe0B%6RUA0G}U*2_$a9EOiI z?8!@ArZG?z^C6RhFm?Tn`x7R1Ze}LC98JLU7TchKtw&BzvebCdkVt)w`A zjYo`T+~%rkLB_KDZ1n?^Fz``88BCb4XCS||k^17D(htNae#Ah$;-OcAmSi89RQRXBz{m>Hofq;jMx+3Nce5xD z)70MHR({o!2dw?>?Fq_`E{U2y$DS6ap8<7yc_js#_T910>(yvy${Lg0+lif3It?U@vOrit>46;5r9-n@UWrs zG=nm@iQT^ijs!-5924PMnqqd=9VNC* z@0%CG0eSq-GWz48{!Ad?0GK*;BR(n>2Lkf6C849_B%za1BEEP|M>)gPjTO;^M{;tkOL%B-H0K<;W;t2uyEnTamf`Sf{{Q!pXzfOK%c7 z*Bg4Xa??D#gFk*GfZ{;Luws+3w)?a8eFUplNx>s)%NQtHXZpfdyg70LX}3Et6-z%} z5IG9A^TP05K~*Ggl$bg3`I+{RYdQqowl#xa{t%jyG7+Kal-ke~@MzLg#QiwMYFQJ8 zcLF6}*8_;K8xd)!fwgjtZ#($qaArj|2(>bYev?|_gVX9(2Cg4&GebJSm{cKsFQ3*J zv+$le?OriNCv_nDG#}1$dtYt_x9w zNn4(Q{8+uh#P%`MFu zGj{o8$$zU$6$e)y1bzVAEuNK35JeI}9a52i)&%J&*RuxKp+@W9bNX>B%=Z-$le1+& z(a3^t249olz_#OGGFY8}auZZN9+;$Np#wEzY|`OnA#joD@K2bSAhv|{Fe6FP5?P7O zLCzp`&zQOi}e6M@q!NQ7{DJ*P-#i1u>17eHMKA`HQd z0c2yVJXf^A%d5#-hk#m8&ffRGSUmf|iO0-SF;(sgco_J}q4L`T0*1do#XCs!Ja6h! z`etKFK-+?g;(H)P#C^Pde;aSbf&-ZC&IL}X4P%mLC_Uu*=7xPjeIRFh;==@(O{paD zFu7#Osm+V2YO61E?AE65{R3fqZ}3&9lS%Qcq03D$vG@y4KEayjN*$T1 zJb7Tq0DGV--E{5}|9o{yEMF2pqBN~wQrMT~XE)`}ORW-?0 z&!Zbh;-?6KJSt+rx=_$BtTWu2cGn%P4MJ~uL~`5CA8XS%v$XrA)xHTT>EH?g0 z!il;Nk5`A0g{}Z-ISmss(UP47P7cmZM=NO4H+=!C^=7m{Jv`aMsQc(8f(PCw-Q zYrIL*O-HJ60uRFSk(fKzlcVtz=AxDIAm|bd^z&ArY(HQ>@4uX^C`)`80?;QN!RmTM z>?f^i!Aq!BMNIHC!kwH@AZCz&Dl|MjN`RL2xEg+Yatqu;G;c0jRLP*2GT#J53m*FG zNAa+0Xw_hy@k3{-JR`_!H1RDk8xOa?7r$&h-60i$R?O;x@1b#@{PRhc9&B`d$E=w8 zC&g?HNCZGDmpB+vGU)r_m*#wE`|FLTNTjE7qOt6qifLGO;*=o1*>m7aXVlzo~?o|6}JxfzdQo3A}QJZ@ZmS(+hBohhG! zIBxUqORKjh?55ERn}*)~{CY7X(i3uHt|uQ2Md*C{E{p#ReMU1rPzDo(ttZdGvYU|M zyc=*1gLo*auT2I3FVbs|TXfA6MDHKx(5Zd&=@A{lP&-b=DMA9WJxL4Y@M}E(Dg!)E zFexRNSUdtEU~k2($4AL->_JdcWa7YG4i#VEdNC>c)V%x-dD-rA!}%M}khYMy4F2Vc zc<6PS8yBvDd~Xh-M@Q|k=tp29Y?g-K2b@14VSDw(?@wq(X^>d>{OsP!XJLZ%9ns;%uOaK}z$ zbfWn5?uNhkBew71m4V?#%R+IXr)mG32)izL?oA8)r^!8l%P7bi$%TI;!K(BfwA_Kp2GI()PHP=OqN;^PYN zzZXK1dovxGf1DGPsQ4_dlPO}TY5~!w+LAbFm^8~A;8~FTVFtOV0TVoSmaXNrE80<` z#{@GMiG&}mO;?rhcWPX%h<_I(r@*3YJXq$qo%PdH?(#3&J=a3Ki{2sEpCw*Rd`hIJ zVOL&izn6q}QJhT3ehKf7bo8zGh4EkSIm7Q?nBwDpS0?2%nBPxHD6i!!{tFF%X&GWrRyj=41{i~#0Vw>kp--zSy@0Ga`2?tuNwE4IRsVTr` zU*nR9<}-ZkrZv_!rO(WuDGz^F_A>6~!^m2q%KGj%G98V@@fht-;)I?6sdSRQm+Ce< z?>g@wJ@GNAjynHY$WNlm#=J7}SRp!Pa0rVD-*mOfGtMc}DcLT~&V>$4kYW|$e*Upu z@6jNE^W4H=&@Ds@&{2}{$xU0^ro5U5j12XTOr4lO^v`PcaePp+Vh?i zLUQk`V~Mccx$JwL+0k}sB)_Vpre!}Gogu*X3k=r(s2&I^5{{oq_TE)qyGw+LM%&(L zV#0T(Ag-2<;zzd&2}QD^owhr_&k$8=F7Z9QbPpF;lX|b1jZ?-&=_J4I`JM|mu)%1# zn~KeL&b)7VQ+hWw;aplIYQ%WZdwr!ohWVzMYw1segmW2^^hYt#2=k-V^Lr}=M9;oo z`yZm}(&D#E{6G8~Z65sr-v97#gmbm!|HD6FqWsJ3|Kr#B|L@oR@7MkB*ZuF;{lENm zY~S!)Nai{+DeX7xk{*T#YFB4mBkV1A?wsk&&edzA;CgYB6jR972eipMKeB8p-)!b%1^DYDvgOhq-y{9%dx}}Lps&bmOc5J8b&9$#fRwqwtRGyBW~m(o zy_n>fplU$|>!T0PL$At`W?U5fcCh%jv{)@k{FT07{tu6hI;n{A&EfQ0ro*@eA1T+z ziR!0c9)*C|_+}guexCcP*WLMG?>^D7Gnca-#itSBv8mnKm~1`F1n!tkwLq;t`_pf* zx6zMno%ix(BN`&IBdaoW$UeF0;ap(qp~IIo!3ZW1RWhV=F2UL zls)~p@i6Q(Ev&*GiN4Ll?Uqma@8Or8qAM|_jXf_s{2Paq_ zf7*08r0pPZFj_~yUAVp~`S%6Q8W>VyvR{ESbMbfVJG0aU%|>-dl{CtoUO6aPPT!0V zAgVAPD03{aU5T_^NiMhFuXhMn?-Z1fK1S(B(Mon2l;yw&2dzM-vZ8! z5?pz3?T|vv1dpM@NPU=dQXr>(*=c$PCTpABP1(lCB#R=&>;)fk_Hp{3I<)tfHn|wr2gt<>D_vpVY??5oQyu6*P+NP5{{ENxfT{bkH(u&I{8$Rng+vkhn6MY=eTMPj@YGB$AkA*GP)eAPja{-u^zBQFjZr*O11HqOH$)Bz zo8;=$EyySPw(C+D(r`_aE5>HV3fLDwvKbG2NmKw3gpUr=Ob(Vel-gVCZaV#N51Z?8Bu})8Uo7V`438Dqae6a(k$2fW zXO}pKTf6$_){6dvc=HK{E8?NXy#=bj-hEcHb1O6+JU`}nnm$d~daj35pP|p`+D$X; zt!SHA@OoR7&w*O0-9sbzp}bpvhbjdG?DE#`5V=c4G%?4mnF9Xb^C43wc%qoCQD#1o zyj*DV_d9=4$;5c0p#`18<{|;nxhE!Pr%mzkfKCYOssm_VgbM9s=rl!dJ^o;`Jh~J_ zzY{>ke|4@2;9KSP_K#CAQTPxp`Y|Qdz-1Rae68^M0+nt-G zuG&{(eZN%m7%zuH#;q#vFj=Ryk$@l60(PGUn(vjALf$b*_3*A_5R*4qE)1w_-HBjx z^m7pS;lB2p!c9Cpqa~q+WQ|F!%)zwvV|TTB;ZG`zHti4++cMZx#KA^rM3 z1rc{nLq$$r5Yed(tokFF-a&o)t8t=%M9?KmM0F%q`@0lEimy&zx~r5wZA`i=V83oL zQvIZug(faV9~~obc|?C#tcSGH3Q{BqW_Ew^ht?S1F;A(e0;S4hz)+az@oQXIrNr+~ zt?enzAKRzI7tH}|_^n<}cYRh|oxH))bTfH$OFl)q6af#OPf!cv%dVXIY=0{L%Qv2q z2C78{9*%-xl{+8Q1Q^V8SbChC+ZvDBXKQ4)TN&5hcU$~R|Ea=q`uAt)m@1<(lDZLcl?k3eNG9B7nSZT)(Gw(0gBj?{C445|CT7EL7Jbr&+ zpp=To$bq0!Hh|tFkXg`M{J(1ffES)?y~ZJl?>{zBQwR0t??@9IH#S~KS7h%mGN0LA zV^+-CwO^fl?L&U>+1d=o>`l(jD1yIINq>Kxa_qJ((Y3;2hb>Kmt24{`abbBjsI-9M z<>s}iKCD6(a_cw8);!moHuzBEPZerC``yiaJ@(4eNVBoDoVg<;k@vjL=>GnsSz`6d z>0n==i2uc7p{WSHy5We%6Wqoc%$=7;j1~rdB#8MXizY$#Mrtn!?cG!pOLJ8bzKC5U zrV(_=))*`_QlEf2Gy`RjT4YXc!Eq?__zO0bn+;!k^JiSp!G#0mGKYPjCW|7wHM?u8 zK_mx42hmn0-~A{R{k|NpA1HTL+!`NmoEcBKZMRxcSx3RC=W~uJ*sP~Mj5z7=rv^}8 zi~r6^6H>Wa{zuwW{&YDsxWBi-O}dEp)bSj>A?8BzM*M{EV(?9aFRu^R003$Ke>|Oa zSX9yawlNTuQc)UFx{>ab?(XhJx6Gs76c~_}AqNKLTb%Pd-`{d^ zjeEcAdG34dwTI3xqJn?+&i2VvVWP_gBVSIoxr)Vo&h`qyb*Z~7VNm~`r+C`yI3c_H`$1sA)Gsyp8Q&zDJ0fR@XT0Te<>EJZxU71a*wc9& z%K+OooSY0Kv$q6a8zkSW8k@>jHr_Rc?pMs=JhUs;VI2<#Nd@R~mY;1M3=Z1~Vt&3Q z2)`Ax7>>Kr64Zf!V=E+=Y2_)fzUWuGokTEwy`G@7S3+Pmi-~caiOfXs%?tf!&<3~l zw2HYpC{5h!{g+tuoiP*zzDMr*l^cUethEWHs&Bl96taX97sxyeYs+~0!NT~OjvV{< zr$h0h;{3ZCQ{j9+Un!jfF30JO5VQ!4&o#RhCnDN1# zkHlG7eOKp{6ZIYhjIDu4_tiF6dX)?^v0%w$6Df-)1avrj2Q|(MtZzTDFliZ7+r>u&*)d$f#SB)-EzxVa)EC~2_gXp>N&x`ka30x_E*G(##g()!xbUqb0f1A zf&B?bwJu9`3pMFnsv*alzb-vJZ!qCpkgvSXGXG7f!2P+Z4Y`w1Jhn|GHdZaL%*L`JjKZtG0O3?@xRfNUV^RkrBwj^9m#Nz$2hgSY4_nPBxL zj?*lLO}@h*j1xv=tP$#h^+d+K;vzBPZ*MR$UXONs#{YzOJsfDY-aX~+f!H2M8rmJt zD?i3_V$h{>T072^U3ErKC#p`pv5x!G?L_F@Y(>~Kph?L{5RJkCXIi&{ z#$0Bb1#BRE} zf4yiySERg|#{Dl-5cibYgaJCYh8-p7JGUL za+lfHddouZ1(1}tpejFREeiP|P+$QV2s7oVbc>p_%-6a7nta}1RBpm`{B|X9qE)-t zfU}#%>+o*)zf@4hU7Ahm0JhNzszqdIm04hMF$G z%U0oN4gQs06~2l(S{EyW>?{YxA^7a`&__M44df#J5GHLSxuY;uNvd3M!?+Hne~gLW z5&sK>Xl1-<#(JCjA}vIs8yn1U$xQAGCapz_rHkE}a%;PP=PLyYrX7Jzjx%?x2ZFPo zm;vP{7pOE%HmuqE{^ZMWhQQHb>y{Vbr;#9$l_Schchhv`Al1yF`xuhAg&xsCbX>N> z*^B$YrLWEp$E{6w?^bcysw~%g9E0`hejS2DgyV42%f&IcEM6R~(S9LhZTMaA?re|I z(o!aZgeg#v!=kgq2+7>D<+M=q2WYZaeem^WKOX?QuN9In+CY9kaS#c-ScQeCi21%l zZ%_2N_nrRx!h)NAaYUf7AVVtfxcxTHpS*J4=xq+bS50)72Og_&c(012%67z3*r3T* zKW|akS?I~%_`6TpjQHVrE=`hWJ5$RKzuwOn&ttakTRVRkJM=Fg@_AwAw(eyQ(6|~G zCakn)zAm!Cd~;uO7*H+!$FXKm8+X8 z6Mt#*c&a=WotXQvO%J-diU63d*Yz^AjOh#Q=6Pu zB;+QrD-sh6Z%@=~=f^Ov1N8p4+dae@CwN;b;iLN!VEP>nas@*U`u8g#bzAuN6Vj!qbRXq9+~NPT&t zP6Rq3j#}2_bQ>hrKTwMeP9BLC0K99Q^m9g11y6hKVn!O+e(^o}4YHiA(FbjPeL~D( zp#c46RL@kXS)iHy;FSL^$?aw$`3Oub*;LNRxcN+eeV&`rXncCun(QOX;0 zix&)55BpO(Jdubl1pIou20B*wQsk2!WvlNIOeDa22SH>y$t~u&KmWoqJy{{qf#EZ- zz%uL#%btq!U{U`QHKN@8vb*AyR*ZA|Pu{O|Mw6+A4o49VmFZRZ@6Rg_;x`9h&o5VT zTJ;*#x=et+k%=Lu>Nnob*ue8Xit@mGOy0XmBV~BY{MpK zv2PM1%_!I_MHMOK8?@9t)cgr&y9|0Y&uu&W9O*nLOOquOaK;1|16r@vKDXR#0`8fY zfJ%n1*ABP#0d;2K>cTh%##Z02NrtTf-C0zerv?jQn^ZKZvV{at!N+90C6e#`P#5ty zf;;ZZP2m}-+2N|a?I80Fw(SB_>?VnW1Pxq)!5bM)89H~ zXE=gUA7i$#*}#HaZnDRx6jf`9|93T6DAupMb1f4+pQ{R!zw_`pq~y-SOd2Jc3Vvhn zVETQa9AX}uBjD2pi5$ZRlELTrnvPT1TL(;?%?a{+G6SsgzoUmB-wn%*UZD4yC?5Wp z#Aqw=+I58q`;lMt5#0^t*p7Fr9xb%!a)=1`SHHOdmph9obGwJ zoC%=DImUuSg6mH=yc`5}+Y>GumR;;6dbhu$CR?gtk*37IWUzw1er?R4QvzvLQq2@R zJs8c7N64q146s`!^}pBr-(JAg8HK&uZy?DfQ1%1{^)jglMEK(uy6w29{Gk-LTTQQD ziUy80`UH^tc@u*}{ARju1ACktc{)Q0Y2=+yz>IsrO!xzXE9kN(+&qyf$UfMv<5OZo z9G~lJ(=9L-ThDGkLP@iS%Sub(?Odv3Jo&ph0s{>r)w9K7$ZP6SCVIKre%;_Tz{aiBHdY(Ci&oCN$dbKLC~u~9=e&TdT~1AHjbQx-+%P%bWdOq_2cvB zo}cCfjb4t7BHHzh9$QH!&GYBGeDg=$5txskyETo}&wauzmWh4&Z2%xW*EFX5wTqJ! z5SZ?G>X3+Mv_*H{o2`M{1)7QTfY)VF=1}fuz}#AhhhWg3GAQq}4OqP)x`&{6~af(OU(g>$rE|h`_guu zy`&iY_CsmbVmJJI`wO*fBDs**HWg3IU4scu*be*YKx|nJJu@0n8D2x|3K94-8}g3HaMLQtKU}WH7aAAz&yF`53^$LDh(Ybi^|? z`^3AXw*xF_j3F7ytjl(~zc41}|NOP&$LzNu?xN~zzr(8_^3iz;+Dd8MsgIxg94=SP zxcqAcLb1Qx{5H82Rhi{ixe3S%v_S4aG+C_|N)SLP-Z>`y%?)$iy2V6269G?+?(s3&d3)FYvhGSGLV$XUyj(u zn2M0q#zO=Am%_`e>As5Rvwy$!hfEgFoa2%O&!($)<0Cd0`F#$w;8pcfBU$?`=$oxo zGFgl#^KvKux}zN%_O?^MgAQc65CWGGIGe(251WN6lpLiprXiQ@P2lmSm$3>E#l|Fg zMZTgCG#g@C-fyil9t42~h9q>NAhvjPW4e?~u(hr?OC+`{M`q|ppv+_WmM3;+`&SDL zjcy|(_wV1Lf|>-)e^BA#`Nnr!*Sm}9e6E3;+AF{KZ%($MU$%ODrwWs1o2jtqiU9qU@eX}s9Pwgrsc~XqVS#^w zo@e79wd|SC_V@^l0RC3MwuKcIV)FJ*@b6yI_iEO^KRyMwu$n)G-)$U+q%v12RcD@e z{I?(QsA^}ckJcku6zH3P<-mNce&_kg{b^^l+wI|Z?~c~Q6q5#lLuUG^e6#s%iJf|0%{({UQ%RY*b`D%UPzktJ^V)B|&mBd=9=aZwO2LF$^#Syw6POma$$?n(D)xcM}@bWZa;ngt!4q(?oWw!%k@9? zAJ!cok4Y7|A~H^@k%Q9hYnkcSIAwK`de&!hmJT%jsYp^bWCs z?>r64XtH!+5H*T`A5)6>{|G#D@@b--xxP9NMh6wKfkntG|4cQ#U^`F8;P*%Q=NKRT z0ZyHt1-pnM{*HYnIRknNOh`-~0YOQCg01oGo#2vQtUJ>F25q}8Z@n>F+#j>F1FY(l z#VEEM_gc*B0QIX(UnNs;I{R&hL|FGWaRbbGuF~b=Uu=Nt>Anz?M5xpzffWNB(3qee zHM$UmaS!Vzj^9lK6XQ&~Sf@Zay$ny~|39t_L^1(GR~4XXuhg%iW7d_kQkEf)Zv2pR zIplPMIwh1HY_03Op9e1w#i_rs9l0^zmduq?>53tsk=xtRB#(=Ax_xf3gh%1eYv1e3Q{V^McJ8ZfE;$*X3!`LRml|9WGz(P9pXi+(qT@m& zF0)PwLizu*!ldT!e6;aHJl~mi{uV}%B^DBVv{s)fR9m87bpinD@*5-=k92ZB*_2T4 zzSq4k6|lhqi(&gjA)h6;uY`Rig@v_OTqSQc7IF zJg4n>id!PVsL{aA#W|Q*i2ububZV7xrB%39p9T;g>5(xa5>Bh@Y9!I^b2pzHS^SIJ zhqZD31=3N&JdV5o`uJA3g@RE(n`QZ&^l168Q~@5fXiYqBp8!Vu^=}+PUOHY3Z3|?! zir9!h;0!PfTVO|?{Q9d$q58uaNRY8sZlijUB=jo6$44OAyQ0a;0oSDSUNib6v!pKM zDVj3w&HpmSqy_NwYSpOeBDSJE5hruOaL5*ihE_Rk@u=9(&pFX7^s%pO4EZ}F0k9Ti z>!}nH7{-tIDy@+pwC;SyKOBi)U#}qt?z1;LW;&rm+w!`#5CK(8X6sc(MhHaZiK)k~ z6Wng>tU9-cram)$Q%P(Wf;vivSXH|$P0cK-j6;Y;n_}H+<)LRExCrEsA73Z2T^lEZ z)oxs<;T1&y$&IB_Ov+%xMGvNObu~Ga8;@*E8yB{ZP|(>8Aj$Ea>}=@Azqt~%fX&X~?v*eGi` z&a1kME!e~ji9L2q%*$(jNHU+Rd6evs;+RuDiL`iK@bwNrGtbmhlmu*DjOso))jq~* zictv-Cwr|-v_UMTnCE);)McIL4|-+NrB<}vi+><^ibM-RKkZ8HOl~{japRMWFD=l+Ud>vkGV-)H4cw?MJFExg=XqitPx+iGs50T0#Sg|-JUS&iXdP&X}S-% z9?)A0c?7vYr0~X{r~08dr@Ok7kFcl9jBSQnS7{2jH(J^BDjgYEfipPKnaahz ziZ}72q9_GL5rV#!+FmSrvb8z1+YsgeHA2b8>@n-wugi5sPLcAt4=izUoOX^TE%)&2d>6)wi$MrDq!1o3>$zRoWPXL=YLZu(eG0Uq(c=%;_{ z0+DOLwI2*;C8;!c??;a1|57V6f|K%)f;#jB3$0(}Cj1)&u$x^RwJhjfbcVq37A~32 zHnn@U-BgkHNLI(-m3WD9BWjw}XZZdbsfcH#HbW1XdcQn*{rzzfm=^s!1=i!I+c1@k z3pbH0En31qC-)y^q`e~Ll!_)TRfRp>8i8FO^_Xi^?1UkfZa_VW_~UprIq|$VYC)MF zI;LMm zPP0rFopKubJ+ZLfys-?8Jf<@JDy3^aSom?S%k_S(e3gx|!|cz~Em%llC`LMxh(#@y z`Y$!;95Z`(e|Rfe^mMtou{(aUaKdX}@Lhj`8y5b-n5-2`u4X}b>y?XK`+eQJegE4F z2$gnj`2v9trXClw-M+JBSS!)5y4)O4U<8zuk=jT1Y_FbnqhN7kXKDcCO$~nvuk(YP zKUAdz&7pF?$z_gpKgA4^)C^|`2>5%3SmsN|Q{@ffCTJHEUY|_7v&U25zx}>7M5A1~ zj93EuiY+1f7dK1E0-;Q&)N>ZSLF4p^yYI_whSHq&f?w(0w1@Sa?@XDjB))e&`O9%y zatWHX+DX6Iapq2p$2z9$?U}58RhTI6ZDjufhRMN><1+c<*RfDVfjl&LZ`OXPv6lC; zO~X`b|i~b@T75frhKQ7^Wz(*+53-Lb{o&munuNi6HbbwUG~3ASK(94 zPc)u?QRVE$z`!dpZPlRq{n%TM^^NnqY6HtPW_==yezyI@+4Pmn&dnFZXHIL;L%?n2 z1z=)aIbBK@Wxv;2cH?lns(lNz!MR|?fAxM%xK4)vjx2&l^=vP|1&L4Dq z#*d*CI~frxI9zTHIzPw+dDb2ILN=7E4_eTl!jVo%+NN7(BMg;psRegtv*dTqJx!I;8CAPp?-X;jx%iOD^FBM5*psV z7TX6`<0jH*Vnf!h7B^;5{6VX0f9uw{s~Ppfcz z&S@geV@|HhYIoY}He}|d(1)Tgptc8#m>EjGG_5)6!)77N! zg&SL(ayDciDoj`)HpZF*7QRHwDT14g|KS9fv%jzJ-%6Cj?at(vkEk?u6JNzDsbFP$ z967jS=3LJmWV!X1KYMdf#OA=8=4yMd<5ylgC;F8eC#UBKTc`=rsuD_=AE=%CIB7*X zO>Z2Mzz!*}b;lB6)NN%&bO?vsC?yX?>jj|Z94e7D3@{&=;MKRE&-!DTq8&)u6wSBA2i+~G_@ zut15ZXS9*kRtCR{X#YqAS%Ln}Q`B{*6DJx4rCRR}r$m%@x!Kce6`ka9YtaN21u~7I z#hwi!*wqT}JfzK)o&L4^zS5dGmO@Ca%(b8X0=-{5v^(W!^U;>i*&t}6_s$E9T*Iwp z6gDDiV=#3juyf%Gxz^?3CE&U&`RrSbZ{&SJ2*)dG{?*wT(~!`%O0Rv_vZ9X=mO3}@ z=HlE4POqKVe${+s!?iLBS&ae}K9@zv_5?kP-WyHI_>o%WbitJ%zT9_zo^i6QIR>#t z^JNMuK=ouJp1~7bY3`c`sqwwA=!RIcuR9B>l?TToj)AAz)Nnx&G1)a%PBZhP zI4R5N(uFOQVh}p0ywq@J7eN`~lrX=7+)C5kmFwEtMNY0iyzFhocy+P8SRWDJuU@Q? zr_<=Yl=mj^VgyPT%}a#|R@weaYt#@XYciWLG5^nE4l0dWm#Vf!lc}bSeDk+HF79Lk z?g_w8NCc>VdGEIjWC%2}DQe1$2>)FU`gz2RzTCwZd`a&*@J(WAa4wrhe4_SH?zs2` zyU9TT?2~Dux3tUV`m-KJ-Lgo;5QtG09r8Qkuj&HM&n}KSJUIn!OPo;Oi;Uau=<>AK z?>L_sR#&A(K&z-@w{*FnS7E_Sq@2b*5~$ly>9rI1&=8-LyG;B8)uwE;S@TJM63blC z-SMOK&x2x983LLcwK|7H@ApXst3M0uu)erG-fg51iR>cc0ku4rBb#2V%f3rpphDre z(sI+}w;LFAaM-GP1=_jW*l*-BKFkVFZ`SY|RZqa_rKm(`CxUl}`dMc@$0tFrG;pc4 z?ud`RyZG0_VHs%p&$WGF;c90}@!5S(1j@X_KVL4M&Uqe;lkGHD8|u~jvmL+Foy2tl z!2bMJy|EMd*LG5h*8JWxW%~ddZ)oa$(U*?Uc>Le!EU^&Lpi5O|T{dp|L#X=wZHM~m zO+xW^d~RzG?Oz*`CnWt`gftfG9#*@?1)ab|CzWil3)~B~^wciy*#QCaVK&D6e zu2C44Pwg_34i!{`NO6NzzcTi!+G+Nu!{y1N&4m3%pTkj1dalfsMxXO7n5+V>_2I`a zPpPNNS0rW3GxeqDwZ9(K%dw1YA|xMWxGdC|G(-cyc0BaTJt)(wXh0S4(i`;oR%!jc zeTI8A|Eo3WcML^3?ejw2Qo}fN--v`@q_s$o-<|5A^ckfr;qLaHG&bXWm!$`S`cn-@ z`-%RhH!Vplsg9Y|x-#1EE6s8f4-w=z(mQ!bjA|c*ri_hzGXHG)Z`PTNiGtYk-5LF4 z+TV-7AmLnGt{4B7H^mIAB*P;IOl!R^Ssf3qPxc>O{`a`dD3nh5!Lf0`)dS`bzVREB zN5s=7ymF`&;rq9QvKxImd4NLFPYb#wIsSp1#i{>; z6z(lT_AKhK&1rV#DVM7=5taumPG8%G!TesY$FA%t(`g=VVd{K6dXD9{h+51|rVPHm zOf1%6bywS!7cbE)Fd4_I4ep(Cje^jUxO#oY6R}$DSPt1q(wUh5H2|S3*DiL=5Nb8>}o^hW15e-$eBZrQWi#hQ;wcDV0lW#BBkq6D}=_SP=-uONj~DRMRUmNw|{q$>Z%(q@H^DZIAD(f0t5+JxnBhuSP2yBiwpj zWAXdr(`O;0vKtQ6%@;sKeu&dp%77%(38u}CaBbPPbyM^2k+}({l2*_y(HmO3U(ZB} zB%+dmKPFU^lcSD{|2`;C@50-S@)O#E(H!{GK2aJ@H}17KJmPuJp6t; z#SeF-wZ*^3-@|}S11*JAhJDD6A`&b6K9V8ux$+Psc!^1~Uh-$$UB;O|YMecshBZK@ zOFbFqKBVG(Vt|cN!o|8Dy#Dh$+~ahMW2R{sZu;$|teWf%CPusJOxe9wWPV{*4Dk3+ zaG6ui6QJ3d&l$%dlwyQBh%rH6_MX zn;q{Xxx+|#ovejvrv7EW4e+YhtKb9+U*~{;US-j|gAV+68?x_T8xtIeVhbUuRAUW z+ZABmy&2c)p=}q_kR@J&YU0~B41C}gEg|R?<+SQ@t-=Nb*72-(gJ zsbqMOMrsThU+1DkqKWCznsr`mkr9o^8D($^hgGjn_gdV})UH5q|LLx-Eab1{a0!j^ z1n>`#?`i_2e#bGXT(*=vMXg!VOqMve-=whxQ%vKw*DcbL#>5c40g21~l_CRBHCaxR z&*8AkQlP!eyb+(BazQZH0iALhi~mW=^sejBtr@*rt@ZD2f^t=q8P#t<-<$>wYpISr zpU7v`QQ>l)Bv3;Vk?%pAARK>0#0qX`a_j zO*Ni>M>V(nf7+Pjmo=&Yk=mIm&K$y2@3$Q=^79-_DfCyHaNE3+jKA1% zFTE8Z_T{QG1Y8jr>wT~|4r<&KOEVAK=HyP5b=A|11lc^+4SxC02>mP8*7=s8kXT}l zK0(YdKN@YcPYgY&g09NtIvVA1*?9PX`6_pXKIHkP^*(Q=NI<1>dV_Mh_dl-!M)vdO zW(0F@TWMHQRueu#=%qlV>uMWihO19KJhoT`rL71CB${1c0}>} z`{5cUe#?HLmat(9~Ai6O*rfE0}lLe;5Sw3|GU3pJ&+!`M$~6|{0#PRpA*#%*}L z87k@8BZIF6eGV3T{0l$L!3WTIB;!jnHRt)tAqqLt4~X`hmA7l@u75e|Hh4Rmb18qC ztM@1n^t7Wnln1%0_3fQ*F{ArNY+}pH)t@Qjwi0W;QA8t&o1?d1$c}!F14NO#Upc*o z&)eCZMT3SfH~66pvHm@bu=_Ye$t?!INYm3P*^qlxU+u?p`6N|A>e!Ec_rSna7oclZ z&lH63busTb4-oxtF92|?tqA?79R@!Xb83GB%X_hqU2_vVfQ(54Ky~D$zn`z1 zk7Fq&Fu1b6u4}wKjhrSQ{Yuy11;d{42%pmhKi2IxQoHBz)NsGyVw-VW>r_m6Q&Cy2 zlsZB!_2t_!mPp7=39vf?y1|NiM!8-~m!)ugwE6JAqgX!2=!=%tUNgJorL zSfZG!)sc;R4fi6HD0; zd>z>xy`Xn!0?%!|ng4;^2Q2{pTXrc$jo1%CpcGEyjL;hic!X zQ&;(#h5n)5s+4)Te)}9VvqZbNqL~XO7SdwY4go-&j!(#HaGCCUi8TK%^XE4$NV)R~ z)fKWwO?k&+7E&wl0iwS+qmRXZ&=2XFZaI)0EHxHSbYESGHBaQo8b*B3Cn zy>=!!EH^cQ`djwISY}vq^!Y9|ytqC2K^edMRan{~vNt}*sKHa>F5M;$yZ=2wEJk9P zn7vxRW76ZNB(`6P5*DI}mJtr_Ts5x%2c3>)i(HGrXGrI(NV`~yJXeDtOOt8Ka=b8Fqv^sR-c0uWhWW2Y`u^Cp&n z?8H-tRQ&Bv^=J+V5L>CVE_K0_4|sc{xt*mrd9v0OLZjz!Lpq?VMFsuk7*gsK&(#RR zOeKuAoDODCq_w@VKy~1P}Yw>Jer4yNc zWtLn!f90)5P0y5@PJu=+w#^J_&$vO%RTU7>K}P$CHcD^bHLPx-l8*E|ShTlqN-Zeq zd-!GY^z6I5C`m#CsQ}MMoFPSRwxR5YPpSG9jqBbG+YR0x4sJZ0_dFEs-JIkQK|)xjCb+^AkoaBH#mC3yxeuBN^!La`EHi-r5)Jw;L^ctL;lN`bABVFRp(@ zNT2SU{^zLFc&1pOujzl@EsT?ix=$0`xVeE{s969dTrD$R0H!z}&=4Q;2TB7`Yr*xk z?)y5iIZJX&)QW6Rb7WQH)giZT`$OH7GJ(If`Iyi7Qd4HaQ(w@!_2%;PV~dxfO|A(! zvbFIh68_2k(o;oKZZCDOYlr*Di!J)25k#Nu zj+Bh9HHP(KUG``ELkb>;Na%zb?Mn-{jf zJCLTv68~#;q9h`s$?Gs_5G3e0!BWDxo zvRL7vhJVy@23nrL=lVK8HG$yf!ZP1&25p#0vi`KYgmsIAT5Y_k`aGWGN6%B1{~XJp z!L1a#nYH8cD4^3G10LajV&|yTJ6q@G)%hhJF!fY(05f$3v?+A5^Y%QIix<3~HlQ)% z_8q$UYFdvi75&PMbN|ycuxzA|kX_A`&qiuc=@nJ_ayfY_L|MYT1tRT8_$hd^U_x!-JSjdP!L^^U$ znJ3_MC(%9ag!2LJrTIj@7`-y-^~Djj09Dxi={}+a)tm6Un34R*%JDaE$_anUH@J%g z)Nrv&{sr=poIFrGZ}rh~sz`dGK=n;)!lZ<0&{Unx&?hY!@gLSDcU;DE(>RWP1Yd8u z^Hlk@be7X85xXqnQi=v{4F{E+-y|+8pl^&JiN@~r1Igt-hc?_Cr&+k@P2(hPUm-NW zS1UDXmbx*efW~9b&sKzS+6-=PNx9RjzT|NDAnYd^gQ>7LOe_yN#F6@|&M${dhp8RC z))+tSaR43QXxTLlwpF_|$&CAUTWcJwJ`|~Z<1M`fU z-OR8EN9TD@p4QdjOvBslgrm(~jI1FPHWuC*06XnljT&UR2JD5^i4o|1tFVJ-8;^o#uXM`QKdK=%(a0?)Jg~}A3afJ zt6FN>I=)uLH6kq(as#=U>`yKquX7`d`t}{?_K(Ofe7QfIdR&Y$?iF%63hR6H_EVs( zNidAdw&k#e%;M-eAy&JkquU-ae7ljli4%O@(u|->vBl~SU^do@LdA|NA1u^PbVZ?i z(YvqeoNW$c|Dt6dml@WM%n-#Nru+3c`MoVU&wqEw(}SWv-kDNFu76ERG4iGvHsgq7 zIZT%_gM4Ym5vCOJAN7Cq1Bk>H=Fop1qso1?Nvz*>7GWMRj^-wznOe^s*E6nl2^ZD- zCO$Tt8Nj?EC(ZKWBVtax(75rC=AotV2?}|PJTBPX(4U8p5PZT-H#^M3qrB0>-Wqb8 zOXBLrNkHY9k5O9wD2rNp|9eZpn-Ib442YH+-nxzWtoLzSz| z<%b})?9N`y+bUtz@eROZNRxftwM~|E955lA>Snlpa_oWF%sk1}$LVFbP^{#5x#3HShgO-E1T@s!0<@Q9fV5-0C zNLH*!RDWWt#tn6l$?nJDj?d>~+f8}Y(}mES;ld$IS3$8l8;@@i7Knz`KY#WXFTh%& zQ_0Y(4>Jn5P6{z!@7CsxRn6e%G;UDpwi_Taoecc9n$=7cf2mRwV0^}7AKIL;H@!3E z=;GSr+5rn;!~KiGPP@;Y%jx9~ktdEa#s!N4p?MRIkJJbQ`t<T9rwYn|>nL znBNT?mfZFOk~C#OrWAo4OFD&~F%9`)RG;M8X64kKnw%!=2T?Cm%T7Z;O`2Ph(-D*+ zm_twKRTj4nMXun<9OGQ5onjf&z@tPmk7w4y8B2m6;LFV>8bkv_-vxi@SDANwDkb-M zwL9Zlh8;8WBAG>BG~{OF_EGb&9%BUtY;ohdKLOcfSo;AOi&gW%*zfh8Schp;97DnX zjtg@89B9?g^NZ5U#sqe+x)f@>$SjYjwCc;&{r*xccsBJ|6((wPsk%=mQ)=+*%R2e} z>&v;>FRE0r8p`~>)4Ma2)Awb*m<7DGIeq|9VKQ#e0CWXzHNzd{fNRWiL66OkCzLQ@ zKPU3-SvM9?k+6p*- zIaa;hvlD#rPqbe}`Et&dwpgn$PuG+g_QDhK$?zn?q&1i|Q*FJ>Q%g1m)#ZOT14Yca zn#{gpdwu0ICOe!Z!e}nC%VU-nnBSc>K3BCBK|EG@ndCFV;Il8-wt3d|EZuqXhu0?@ z{pjwFBJC&^1bfN~cQe)Pi@MGW-c`ZB*185{BA?&J&S^?R;4u+P3S(ETv%3rA8EOxJyXD)(AS~uIYoX@Tro5gg!K)1E1>w z?hez6xkt+U9W?r>{6HrvolbrYxnFy)MAhTAFt&GdY3wI#P&Zc*)AcwT?le8=eC6ic znm&88R=^dSVZq-X)%{;vGYw|T?KaKks@iU^6qEA`4yasv&1a(T%t(& zQG7T)Wqa@DyFb6{ofmi$7}ST?l(r>^Sqc57fgZv8G)LDmz&~o2o9L3(vKmf*{qx|o zW%tPG@&s0L&k;00-jqX@Fa3**(*)(y;0mco(IA=NYcK8fkYoqlw8uo zBTpgV2BjY~<8S>fK;Fq=b1;IC%-3#w@P`qSd5eI$CFsh$>x;nU(-ZYV^};*Z8PGnW z6Yo<_$y3qyMs4^D%V}IMx?`NFLoRQ>|KT+; zE4(uGmqd4grwy__tWhJOJV7Yq7L;AiXn>e4{tjto(|UO; zuh+q%Y`x_7C;qvrEm|!qY0bgc>#~g6O^?mE-R(9ovZ3(VY>#S=Kzk-$J>h&G7pTWI7w!E&R2>qx>#p0Qo#is_8v$wM#bgUt7OtiMe9Xb$W z)cBZ?C5u}2WkC5G`*FK?J@U`)^KEVE9NGrTKvfD);0H^MjlM_Z+jkl& z!W^KUUkX$xTnD!%Ds6`5T7vL*wN|D{c^pbJ2zVT-d7T^jiBl%u)2onk#K=O3D>P_{ z&Uo%(prMX4`O3wV!gVkqpAP{3_D}>|Ru`k%w>#ir5jURzO72MBek*}f`G@W=!ZI=B z()F>PZ$IH(%R4N$>Hp=i?&tSFgp=}+$~`nhrU#yk@HLsWz|dxcsPd<}@q&@S&A~@Oy4_Em+4igSnv7e6 zvC}+LnM$&DOI!X(*ush9FJ6yfev_rHJI3hiEKMS z%TJepK3TA%L+`&ZZN7{X>f3zsjiX+zXjL*?f#K@$a|WuFB=FJbRrVMumStoAA5U)` z*W~-Y|6?F3D2hs`fRfVP0xAu{=+PnF(ltO4M5P%6>F(|ZX&Bwz-7y#p#`e4SdVfE^ zf93Jm=60RO@jR~kI?szrnEV3_8G?QYKO8drYyj8FuJyV8i9Bej@R*Bbzgc+42ug;3 zWK{9;15n>)srh>|i{EpAWvaEKthz^nCL8E^}6J8#3wcPijVX#?Fy8_!*=6^03R%BN(q4CBD2>(VI(&)M z%?yIROj|>2=U~Eeb=mlvukWg54RdprXOnB+F>*qk`f=NNdex_SuISHcB6|!O75<$vp&dtg0Q#SQY_ne z(Ojj=j{I2m&2uq`$6iR*p%ksmNYAZLEG7+wUsuF7>WvVGW`Knza2f{;7QcHD)cNa& zV;%DNSE85?!^Ue0seJ87w2boBaIGb0#yTMY`|z z&zbrY>*iZsqH%peiL<0MQh#{8&c>yJ&3k*=aHDD*OtlpAUl>~0U&7IT6y8cApe=9J zBb(ywu%S#UFu<^P{~N$p_N9}G$J~0Z`rLk@-uQJ03H|PJ>)L{#Vz({o6n|4nB);+u z5Njv%)Ho7ALT>x1?4|?p3PRD0pjOL~^u4L2QezktMHb?cY~IZ9SimjEm$hgF?*d z=|=E>b1!g1;5*$~{V85BtGk*j5afXXm$w<;;6m)h9pWeI=tf#_Se!0jv99 z%AryL#2fxGS=g1=Vi59JDQ3mOM6O5@s*&n_4v$3>cF}+m9#b#IavDcT{*Ic4jHCK* zFymz=C6h&a+i^D=a1HyBbm%E{p0kL{_Dawr7Q7FIhAnN78mA4NuptiB%(HOu$2|Ez z9=+1k3CXpat(<+wC>zn!sw$xP6B2?ZTwENgvD4+4lHN$i^(m_5A~xC9Q#yG_hhWXg zYnA!>4UcW7OJOc|?H3yl1?TckXZ9wvX1DskuzB7A?AzvOq(2S|^-Gfuy@wq99LF6h z$rKs~nM9FI7T?rfYWprl(f6?g=~QkvI;6xF_nFoz2^YyldFZ6Loo(OBNaQdy4wfk~ zY_Tr%#a-%0bj}o%m~v?DoS&}!n`9#tO*m@z-f8_C%7*nQ-_xvt$W0g{Ef=eNmCzN1 zaovm2EhKk2nrm?0B1K&N11M6+gUO0cmhfZz2e<$ROMA5uTh_($3vecF2dU!Q%kd^@ zAHJuDU9XW?aEcYq)i~(9-$mkdPWJ!l91st-ms>@<^sUUbKz|+%OUEO0s;(wmGjJ`x zS^;IZl|QZWJKz0V;FOnL1mev3gFKIQmG1vrHsB8U+tDTDH%i1q{iS&zVJs*2m;ITF zcA8t;K<@OsI80(!_}4w<`Wui{%)U^~t)olX)62I-LSJ0D1WbZb~N3;WM@|y z%*xIk#}l;Jn{<`duFoP3m*20~Z@3cva(r{qbdQ)SN6-Cu**;^x=3mv*PoTfU$mfI< zQ)BoShbd3LW?FN0aVfy^O%IFR_NOc4pbI1x5rX|d{NZqap=Uf;q+Rcl1q9aZr;jLT zotbcFDI8WietRD+>Kg|A<)ctIm~qa1=)vpsJoNROO71U%DW&yGwT|b3gj+6k%4w@R zV-_)GB>E%hn+r{63_gV*Cj;B`yzIa4q-?^J!j)i)yST}Exhgk5iLo=QuPOY?$OC^r zS!tJy^*A9BOm6aA@A-bZL76mM?@D>TBYQJfZbtT^HY7;~Hl&>76d5Tx--={=d0v}N zMa+OZF&6-h*%;4T8|Wp=Bn3!GHJ*1z;~yt-^7#0e^N8hgD@7sG6?hGcV1$`vchB*< z4F)${3pWgC10D#sFo`JEC&LpH;p@ofyZ0|4WPuN3EJ8Gc2|hb;0sTU z4X{?DN0`_4oM*Ehb4}0xPX}cx|WQ zQwH^A%5?VgSlbuAXWKZfe8q#ztU)Ze|In?vGGD0QAo1a6xRLoy;yRq_$PeWJ3UN`k zHg~b)>-H{|@^O}MgYSY9wbUAXe`V!e`%(;>jVrDaq^bGjqu&`qRMhJ8oP3gbtz1&X zXhRSs22Hl2YJLEqUb%LK#98x%;<_AXEAyW5+Y0VHgwL6Yvhk^;(}{W!!4559%vJKS znE9!L`I{2etX-$Ms=X4x;i8!}RBnApg&HM>e5sEQ(zr+Ks-}$^mk&d5`~|BB54I>b zxILpqm3`dh%ZSf4XevIZJNg_4=`}U2oTCIisgc860B)o(wNo)9KUp|4EUpbj%eB>- z!6D6V2Ts4|huy0iK7<2sNW zjx_5|!Ek}mOo4ER-mlrzryTopTV~Nk?&8RBZnNgE5dX%vqZ-i(PM_KWeutJ1bWV^y zBx7GOdK=NXk3gd+2MnT06NIq-sI;jPLu$ceN0MZoqm~dd^ZvgRmxX|Gcu z^{$5yL_*%}zHrywm|Opc1Z{7RG3p14G{r?23_}yUAfb} zCF^RkZdh9Ump4N(Yq2Eum>%mdwR^XvtVbEO9ho7T-X8EkEmzrbBSM`<8iSvw3B)6t zK>}<0py%(DJElCHR@#F&3>xPfJ;%=V^ZeLOIkb+eKCXo1!U2CqNVwQB)y#Ok^ z*>S!cI(}$m5}yrH(4&~>we3=~N-Qo&CD-F-lch`b73x&UqC%ebC*Rn#|73#&hrA!R z8qEx+68(ApK)_zFqQ*VY+~wXu67qC|Q2)3c9SZt#zS}80&z43M+zI7g9<6npV^Ztd z8FSiVU$*HM>WG+~nZD|a@36l2=v4I1FCxT_f5_L~3&pPAXXRQPB}Joj5oJaIh{-_b zFgFc}e)7wykrK27_mlcX&p;Xr-rnAz1SHh4=Hrix&~!8^xIalm165ccaB^i;&r>Z$uTt>I>{CQww0ZBpwofLUSnj_chW><}#p?>(Cbm|hC+ z=VC$<#dNAC4B=?V8QMJuba<|5o!&H8x9uOesm2!6z9ANwO_{ z=EU&X?U6e!VN`W(L&-PB2F)(l1VkP!SdC^#U;((qA~Qbh1&iCktYM$xy-%i3%$Ay4 zY$mL27b2e}i3o5pVr?c1f2<{CC!TGONO(^fY*etsHU(ueM<3Um&L}Q?f#zCI?8;JW zJaqDJ^bH~Bk_p{yaX%UiBBn;4bV~<6NWz`;^%;N0_;?NyL@x=TqQZ?eH^vwd6nTM& zH6(p^Z9SfQBp4eYs_GfH&+W2J%uCyQO)!0qlYx6PU5FY&1k+B7rZO=Mmhg*fOp zdCAocHZlx2N_&EZ1_joc5l*!hL&=w3zUa#^ngG&_aDd2!1%)&V1*Nw~dv2BJ>J zK`FvsAk|FSgS|?H;HGc(^R?#oU4O~8L}s+){Q37~#OlMA z;XD2MD5oGY4l!1`U*ud-4o>;Amh5dxv3XmF1>mL zs(o9H$h?)xLc3AX@H_H-n{tKukI+}(oeMU-+OJ)X6jD(t)v}R^MPY`G9&gKD2Iq5{ z&Xt)|l!;~<%!0G~$<(q#resV_)10@&;4j#H=3q$!T|}|$KCiDL9jXRg=yZM(Y1N2$(xOlQEruK$|BEAz*bA6=_=?R zED}%UC8Muw7M%p=lJA_~@$%u-;d-x$DWsJx1N$*?JX|KMaj0c^@89=V6y6HI8a)YF z$l|)kzjS=%b&U5)^m>oGaP->~o5jW*9t(`E4>~91CyTh%OnLBlJRo6}+Y;otP8%h@ zS344a@-pS1u^fgPvz}KuQQLn}u5L#d1+q-a2zGtxjRe~nC%HSHx+MXfApO91cy-PK z)0H#XSnc$S9#V4OBn{_PPM?<3v&w@n>97D`&;DqSS-n5qW-9Il!nuXdIlxfoXMk6y_> zS0Tf%w0cESYmiYM-CHSsR$?<+kGxkqo+e;NkO!|^KK_(Izi%j$4*l7DNMQyI`98Ck zar?tpIONjdi}okHdcc za+9|H6ej3BmQ88PAoNiA^xl;?>Neix(pqy0A`dPSS_@7baPOw#~oB+kCFwM$J6K zr9-ww%;2@R@&9c0$BBcB(Y}3b^b_?wuQ>iP5@;2=^0vI4e6V8|1!Ddba9>(vy)DpL zTA}yAp@ggEgHX-w)-ME%321~2-4gQSkNTH=VzkmB(=AwXZ_ld*-+{8ty(QbrW9l(i z?IC~Hqa5m3Z2h z_8)5TG)ENQ)|X>qT9kizelVLL^a(tDLKn zDu{ecmm59vI$a0g8nh7#hEAho0OQF(L~LOqAVPe~z#y~ML@cB=*Ah8h`-OqgnO<3du* z+2ek%hZp~AWM4;14K>oK{?zX$?hH@a1_WhM% z6sz++)9{(dmlDSM6OocnaqY2GLvg!W>c&o@hBfw5H&+8N@k-m7&Q|Uxc~9$Itn&K? z65OMuf1ReRw0nz8543#&C4u&iT54XJ1tar$Lgqp68m{NNj(2HsE%3KJJ?)bC4;W1t zYd#==1b8lO0XXI65H@8zbJXp<+kUFj{P|vq`1X^Zr*gS<4k@u>-6+0x6oPD~_Qc0` zOuwO8L~vj_dT^>XEpV>J;bkb1dmPUeSpOY((8=>_SBN%l_j<9^27{&m{(U%2!bF#I zBV6&vtpF-OMuB zIo@5azL5Jj3p`FX(d}_TC#g9zyY~pG7!xkFKWPHNp3$$|m9H)`uP=1C1<5 zcAFrAHTZi0BZvxhjW0gv;d^yf<}_00oD+I(j+{hYD<%p$CV|LZwg!uuyqm(P#a(vC zxe%GW*so$r8!6grpk(xxXo=>)hNGgh?LetR3J~88^v+49qi>y3@G!iT!9CkBAKa#|mN6?{X#5-P7iErcr7n5bm<+A3&$ZWU;Gi#zO};1r2^;J+ ziZPX}`=z0j1$Qm}6Wn>ic&VvHwt-j93%e^TCl5-{>|DMVMrFA$T)+NUoinw=(bgvI z-c-r>SP|t`Db(?a$xx;|EPqbHq7X8A*JWoEd=Y)L(7@w)`q!c5pd`_x&;lB!vDrT} zK-`PfD%8?W8UnK~AWu2|I!iEu>_v1>g2||F-yZ~P01L(${IC&tZ9%_sNhQqXnt*<> z9*V^~$7~>e>g?V~=13~32_DhwuYY}LB(k?=>*+ui$gJ;s)Xu@lxXA=aanxb53NwJX#INR>G z<(un^Odr}b`h*;c3Q+&Gk)X-WsHekXql#F9EgCuZ5Ro}*=yzj$vRVhX=&Q0CBNajU zglri9`PhzD{gPs zXL$cSf$YQu-x^FRkM(Q)<-y!iY!4%BV3*CwHf$Lbzv1o6igeAu(o+)rP7ZqTtQyzH z^kQe!>@~k_+eik1#X!8vde5!3%SO*Jldh1WXKx!+$W3lu+gA))%JeSJe^-Azei+J&74bSVxdi;Xk$;G*M5WPj zE&sHpJDfWHNH|$)%ZQP_!g3^C1nSr7P?(T$k1^qF6aq8f>W_QI<^+N;e{7jpZ}h_m zAyzwsh=EKyJDPiZ&a~F`XvAAZ5EXnqlOaRwvQpB*593Ig>b2;N?La|&aNEaP6}A5Q zExz;``IT_L{*QegCnWjbTsGiYFcz%kY$a~DEgDN+RVNggOMOZAUSFs7>jP{H^f9iL z+m73`=ZoX|@rqCVvPXmsp#1eu7(V~qo!DavTHn=g^w4g~^t-u&nZY6U9D+uzS~q4q zo@RAU8ZH=oj*=p7VH4+LsUef`{fReS_kSUti6<`gbu?uwQ949Zmi*#jG<@QX+~c_L2{N?Kge*y#CZ@T7ytTqZPWn&9dO@>XC2uD(y6THWMOZeGueEpG0gWJU{Sa$ zpM2>RGrr&PlT8xV|Ju7qE~r_g!|R73N_y1juoPy}_1W3?)eD==Bu)T%DBk+pRM3uJ zzX)>=Ethh#<^dpr0|ybGdN_L%g<4)#WduqE^NR=_OyHJugPYw-e_RVzOoQ2WgC{N< z_?addWt$euOok2@bQNaqFQLz;81!+|tPyXC5c&B{-tMzD1lw^*ZCPmk?q;a*D?@ zD0=z$i1}RAN@03j_hR<^2i{8#>Na{*2L%}lW4%zf@B+vk*SerKmzabnZYUZ z&ty-43$g+P4WTA9S(qZsea|d`p2;876XpEP_Vn+-!L;?6rH^?ul;`Zsr+l$1oAqj+q30d{1e4JMhX z5M+-m)+$?-y;PE3GganyT7P${px@vo#VAj#y4ZMf)ZEb<)Zvj~t@H2Z# zBY56-75@zG;3rAKNX@sqW}w>(&DkAJ%UR2*y@_9QJG?o&d9y9~Uo*sag)Vl=%sY?C z*c*8ZR=Yvl=(~kahGo^nG;$&tm`u6~kzJ_+C^8IcD@5I5rTyB*H>?x+Gfa(KFplS) zYG$~duk&6XHk5v&6ysX%DCoR71SE@6G4>xExM5HfJk=1;`W($t93a!cDw4%7O`nDS;uuQG^PA^DM2BqCx#82E-6P>%DO=*!tZk;rMTy; zlz3Sx`ZIuXUy3dyVB{mjb@gyTwMkZ2u@eYm;@37Ie+0+zyoIzMy34Q|Gz#CDzS@beAtACpqujFV9SIC_9Jp^oz*J=ZrM^POt*2 zj#3191z-Yh=*Zb;dqQ#^^uI+Aig_c?0M;8UjI8iz?TO5ImlHRYX$FrTaPU;QG1=@-8Q8m0%~6^vH7*#> z8^b+7_j+)KJ5TJda7`nFxy%bBBs;u5Vq}ihW+w-uhA$TAFx;?=BE2Hp8May)ax4Oqnsmx|2Gl# zz6((5t`0OsINdmM)}iFus4Q>r<&gNvDlLsi(JAJB7~RRQTrBLizottj2Dz-X;t>?o z{`o%o*?v`Xe<=M(wVgn4+|{6LJa61-kf^s?Jd~s3&kNmVw$s39>xFs|XMhVn^t3!V z(^VXVx|d4?QIWi8bUSd0=cP#W{4)Z1G)y^>2m#;0-NIy~wmZe{B(e!KcG3LfRArIS@SK#6;kcDt8M1_rvJ zTbpn*Z=2B7&c2Chr~m;qC-+gPmON`}^jLLs9fWXD6T};p|2C zes_v){USeOXvj}AYAZ@HK~tBGJM0;w!9e_@8w5j%)=5yLrml1?nlzV7=JMbXy>dA1 zG;S-@Xn(m?bkv2joHKsspW2(x6~oeDXihi@k2!0%Vhj*N$wQ+6qkc6f8O>p+QAeX& zO^hM~LNcr4y98*0VdLc!Nt@A*uJu9l0o(pT2M#yiY#?i@th`NSOiT8zQ6VwL}5ZP;GYEX`3jBefWa;aNU_jBmeLX)?a-d zvlRIN?{@r>=DAiPDLuSfo0~N6nf+3;RSAJH68KgT;p?L>FzdavB?dmzV&HTw=C5)W z!#&Z=rnSZ17at#QN;UahOXG`fQsD+Jt7gisy%A`HhDa836QwXg3FGe4Z)z86QPfr0 zOzBJW*4XRUnDq&pNY$Up&4?Md9T)2pOnc)arh0GDCg&A4*PPPxHm|R=%N%d%DA%+! zosPZac}Z!S!~Gu6q;ngYIr-~@aLdt5l~FhDL$|~EsWG0qk|C#SzV3th>z(V5%D?^_ zobTTfF(RvmeY7Bw3;Xk&iO(0UoY957KC;8;X;@Mv_oTG^T2o{_T52gsG%7haJ6SFJ z()nQh>SD6!ReR6{|6%s$IP=S6Io$08?!L=-=AW@{pI;9* zs9SNDZtOiyoU69uj41`cM-L_K8~K6-^A&=-7sv=Sl5R%Ik(|*-@+Rtp30pWeS7p=C zVH(oV862y2=mwZTFzr(sN%dkD_1u8-RuX!6oqC-0SPrOEaJAO`2&8U}XM_Y|n>R7V z6jxpKDfejM)T)POH=Nl;J*S6fOl!Ec7^8b&y}sUyZJn}Zu-&* z-(BvFq$L0>(X1@vd}pjXH1fXp9fH#z6lPmC*4^IR4VmB)8}r%EYHegY;w-{|RsLGN@e z;Cf_yzfe6Xi+#QBx4-Z}OMT+{-${G=o8Z*+^zsLXtIbE(n$|Hob+EX2vpkqi%qFe9 zu;Bmg1w@$z!(yr}<66p9E1X!SoO*r0ddiLx>gpdPpWp4k?#9A1^X)yRypr$yqtSfBPtXvv z(UB;`b0*!d271(2{$*0&_1KuiU3?Ar;o?r0iN)Ku*WB}^gC4I3J_izth$8xrlSQvf zbZgSh`jE_1nRc05Vna?{67g;pTGQgjr2xCV!|SOrAB2EgQqB6N%i8npkN=n6J-#U}oREm;aH`&YbbvcX;#XK(N8*{WAPcGIOJBr{3kSZANNll87F09`<$zuxCBBecJX6Bw@X)*UOv zvS)AX%#eRtQKCI=QAY_m`w>UJ=jFN(goFuX_Pp|q<9 zqa_Jx_Tc*DH(hQqk-+7F#*VaN$DIr%&yLvA2Od z!uhej#tReJ(IH6@xIIzO0?*SZ@Ez-OY9)S{pXp>bR~_n<1X>D-{uvhnm1PvQ=zR=G zV!Fcu)9pJf@|15K{%#Pqw-5FB@%S)1n^}TgjxZkGVGE+~-)k(Us@}nKmXwi^k~WyG zv?@X>7yC;5JewS4G2OB|)F&ciPZWS$PWLNK*Et6-4%v-mJDcZdOz@` zfL+yMFSI+8gXu**^Vi7|tk2b%+*NzFqOMJXwz*|n0I`9W)wgQb>a#*aNEz0qq{$95 z_>TBV=xe-TlI>h?sKO0QBVQ#$DMNZ7)O|9Vy{`Nv7njOr$;jnexZ#HRY5==F6(!%U zA}ls@)qC|f(u;~+KbZ8O-qpKNv&f5i3Me(1B?}#CtIw5S#Riuhf6X4&YzfgY^e;3a z-YLcJT4Ks8kDnmdL$vHvank_x=d$}&jk{&^dDV(U8kuEwbJ9(AZ^f(O3~Mv*DK-s< zx30}&E2T{FimfMJQe^Lp=1k2uCt1>j$5!LZYfYbY24iz5trqIlsz<#jMM%>HmYFs3 zv+?j|rfMAt>yYvms_cC;p%m%`nraE;UO>iN6U(o;5Ldf%eipYnB#s^aBw3{6+QX{* z7VixKJm!3&Z?rx}%RBzr8Jf@uHK6UGWjG72*lco~1{-)P_z&phH(V@HV>e<674@cL z+4XZlPq)YOuKn?yVN$)yJ2oYvCFdU(y^jWn#S={|EGz~IW7!u9PhU{HW^8B2GeIJe zw{CrO+L)q>uX8Or$)~FGQka(W)2chg&RI_N+v$WZadL8cKTAD-2`^2S*8HWu`qE+N$jua`ht8{sP5%4XDPbg+WAo4JhTKegksQ>^V-HXM}DRcV$qK zqYme*q)B^anBN;2)oq5Htc8o~mz(YorQBQ} zo$Gw`T2jr*7XN6?Me$Y8ZD0Az7k@WX#AYRm?2O(tIk}U&q574~yHoZ)(4px0c&Y22 zCLHT^d0aNT`Py9A8#xY;LzUCkpmvVLD4)&bjPD=(To5GZ+<-4EflmdcMnNHIkkrnTiuD){pT|t{_Aw z^Ufukf^nBH7A##KyEgY)KGf?q>M4p0Z=DB&`F?Zt2(uDYa!xxs6#LlkXc3gKcuo`k zTCh}?gP4LFzCV>$=WJn#4+ht~4v5Tr^zyZyZtxg+O`7Y~>t9YAkgb91fwP8zI39^U z8ecQBrojs9vs>)p?p;1wlr?lbkPud7Ki$OhPS7#JwtppB_UY@1Hv*EBGRbtlhI?_u| z)uk8LR*P*;!VUdy7j(3f-G}p1r+iD?5LN_HQ>g!J zZRJIgk&uv_nLCeV7il2%8_Cl^AcyJFI_`ekWX_fLmG&d46EpNlsDJ_bZ0tx+Pj9pZ z*%exQ)O@YV63em$uCX`i+cb=LyLPfBWBE!X*PG|gpSU>4TXA7;{{4!fY~WL>HhG1< zz$3qVPjeJ}PCg{XzjC~C<0UkJ+~f{Z&;BeV`Ydn50js2(sH&x<;hxvv546YqJ zV~kZ!fE^!V@#j74^>#+hKBv5<_A{9(W`keJrmFuuKZD$DaChj_b}b=%Fq0Eo)u>R% z_!0h?vYuW4YRF(Rn@kQ)R^oPWk3lH{58`sBag)Z&8Ir;m)|f2x%xy#7)c#W@Dc0l8 zZGXCs0vISo%yDawa_p5?0;XZ`kb2}`u7(lhs}Ww?mxAv2O>Ji5m1tHXL~1d!OuO^VNYoX^Jzv1vz7Q^;5l_5Hb(6Zy~s9;iCIOgPmjb+zrx z+dljNW8*aLuclsy3xFquP+whRTV4~WVs}Tri+WclKo$D@%g^mpe$t2SHkY1isxAKh zQ=cB|TrhhO^by|Y?dh@vDxyE3O-R%hHO}eb3|5p)Sj^ouTDv*1Oee`z zJ?!-o89=>q*yw_SIiQXgny#Nw+^cf}Nt=v@H_3*g_DaOzLniOLvIrj+FVq|@UsF6t zSH1JCzqWx)F$MBgm+nv#D18!oc{yUAiTteD))e1(fiE4kXN=t)k^o++vb+M35kHvm zLtn0#bbrd6N)bDfu-rC&aL_BBDf-@VHJ2*TYBaM7-f_M+byl9Bt76tE9pYg!k-s!s z<0q(FqEmaUTlD6IW3`)k3_`csw&bQfvwTn!gYT2NC~UV-zY@%m{mMeAP^)Zr&S5Be zGh&DA>YBj!awSn<38FIVIvWXNiQS*8Su5+la^0U^h{yKvI^j)oTM2D%5J82te|RFy zcj5|R#x&ctjvW1ePl{r}Os;-%P>^+R3l^hxl#@`A^t1EP>&stoN*Ng$wu4U<=5}l% z!%rzZPk?p1L;Q;0b`tPR0KH;H#SI*e%HxuxMZ+LLINMIiNq$*vKH&6QOV(TE3keC+ z$X?&|(TL17200hbEj*d}Q4KK%s6;mL;`#Q8>7bJ>0lvoMDMx19>x?=GDqWLvk^4dn z`g0`35A#;S7tor)NngF)#rMg6)hlco@VTie!&~2^551w+uDZ)laxg|cKv-RqFj?Fu}459nszU=sDo@jC`G zWLsbrKHgmAw$j1uBd0pUcX(O>q}u9rv}-O`n1C5Rud_^`YM2!`lMR!7$C4KsYIYl* zZ`yXIHjDaOj&G+Nehz#HGlZN}X;&&mo@{`y(vfKb1g^23?=$XfOwxUfa z&ojV9q~jE+CsfP}<@yN2!mtNf5L^K>mgv>d(bG$5)1!)RkaHj%&x6?wkoXNGCL?wB zW$E&=@Qy(AVueM6=2ur&1?YJ1bRgjty}IY_xZ{H*F+~4Y*o(CR2Sw1jPSvi!7>X?9 z*=~VLK?i-z{_=9_&8H3DozXyvAoEBf0VXB@v|!w}2`f52eZGwo1ycsikTT6?M_Q#> ztI$_9{rf)aEEm^D3hJBX*D|~|lip5g!_;9f`QA1RJP0;)X6;*Txv?$#8R^z(B=YTc zni22l89$7hHV4+=J+ji??R(s+dll)v=y|i?Zedp76@?q47k4FL8d;mA5hsT7uWYS%_iL017n_;=Jg2qP z{G-Y(I#?n5hrX(i@7YM^TM20jfqRFGO$AwIpC#^rH@3LMrOlbtt??o#cJLECCfnO9 zELDcSbpB~*@RqfsF{_iiq3O;7A8u&Wdz_GTZ7B@oZu|rCqu~|OhySLn?F9?zp4o%u z{^Xn1GLyFyN@yjCbXSlVDnxUVNATBVk%&2x#OH0(753?C7P>o^GmmHu0Dl{DiiGR< zGR=6NH#NSP)e3^h;|^3)R>H}MY~;m1^EBjnBC1Wgo9)bzcYl))##b4QW`fVtUU&`x zs~?M;n|a2lBp|wdf;ZB0%c!OSQT2a&0exq5Bcr*cgJ?ov1?yK@`o{kNml*gSRBef0 zF0&}u*_yW%=?Xxh*qOgPKG{b+7E17{g|nBB9tbz0Pu~>1_c;Ew*p#A599^l^1VMF$3Ld0E@{+v|HDGEhD>>&*y-{)Z+H$)ik8rKh&AcXEHTL#WiVic5 ze$ScJEsvKY4Si7~+au5c$nVN6Quf3g*uwlgkX=)qBppQO8!7xS=sI2m11&9fW^}kw zI}K}_n01tD#st&}8esQiFKex810Y0)G#kqTar8N!RiS%5r?ldLPZy>&kD>-noNcZSqPQc3M%~T1t35YoW z#B%$lz0cxUeMD3^ohAWZvm+mC@DVxLpHVaEA}UhLS@AydDK4jJ)&K2gvr%s5!=QMj zr9IBk!a7~!AhR_nx{h@f7XS^0hy}1UN!e^~-L6eJ)8n_|wHk$wRs0o`vF?q+&*nI1 z0b>edvkqmKLj1PVy3Z79##vSI&vwo7Z?$-xt2VJ>U8+f^$xGyHhEwzEk022AxzPO9 zU=qLMW*m<(x04w}vcRn<06lqj_ZAZq6N@G*73Z?hvn>TtZoAo6QzhNPLPGciQxrVr ze9zPm`$-t->FJv;zxc78|4baq8>3Zy$^s2pi_c!m(5*(lp!RF; z_|j6kHKx56IPX_|2Ob1_6m09X{DgUs{F#jX4Ii@l@_iL&Icq5lm?GPor*_k&(uQ|)iFh8*RqkY#_pVO8?km4^ z5Z5g<&D7_be*6a87c3p`SO6e+NWx@HmHUzSgiCK!mg0KlC}1}cA!X>BiGz_`ezjn9vc$&`PP>_0YK^tA%{QCC zDv2<|;G+n0xxXkK0{VSJX2}*5kQNXRMInZEF6E!$kMN_sC>5XqQ#m= zEw}BJw4}m-(r0L&>Kc-l%9GiSPTS=@(Hz}~z5FFfQ`s9jS8X?b%F)rOZ`j~g=N1+e zl=Hje7PtgcQzr8m!*QYQCcvTB=+UehAv>@ZPOLsNo~z>QxdIUBL=&&7&8aIUaDCm> zj2ur68g+`=lDPmFqk2*PB`3fImnYp0mAQYUyW9%-QT{)rALAudIV_3K>8R%_caDtg zlH$uq>3d>tPOc;jm%bH%IT#rjWQAx}=M^{}{pGi-Zt+WnzXCqre5KVvSEvn-$j47S zfe&A3Ug*P^TLTF#u8!oDKc|SrzeU9jd~QCTa}akuoNq^~JVlx92t`gbJ&)tqFyG=t zg>RdUJhc%`p@8*lHibOduWA3B9Esev9Ph+`L>lplaYD0t2W1eUzt^aT_K#e(yweJ^Q! zJ{|HZB??wMEGe0hM@3x8-oj&5Y(tZANcW@~D=W_m-CTvNGbrlh?O*SeOkBObQc9wd zLllO{KBgEIdAkx5kOF9hpA8c&El2b9q2SGm0!OGC5bj1EdRZGk%U1MuzD6qQ%(SEPkNXsKwHt(+V*7BM6aXhi%9Q3Vk7$8tcQm6Z4~rmL%8 z)Kpaq>Ezi`4E81|&!>;u0++nJWA}#BY<@B>)w?19PK$o1M8Qwe=zURqg4Mx(i0&QX z|9$DUbDCSNn9|q|Wb)4m$hzM*1nWHGHg>KY=6VulN@CN$pBW|#o@5YRP@z|Ycf9f? z--=6LIo~7lu-}_}q!V@rg$;Wp02$2;=SdKIXMs6x*DHdow4wg}lebbTUG6S8e1xj6 zw4P9Dc9@lTuq$9aPSZ}AJ6VF&$Bs>AX%{$Ps8u8-FGDCC_K5G?VTrF>e)|YVRD zqKf(-QK30FURot5W1D{Hm1W5funt8_>D9a7?x~OA8qe2Q>i4th_$83(H1(3?leCF+ z7^EIxm(hOyvKMJ+-4w`awIhqt8BkhD!jE8{>vtj_>d)RoB9T_f^0KlKG0FTJDuRN7 znM31mN_Ln0dU8^f#;D+aAK|C=aeS~1?SmZH(kIjPz|>T|i59CjYc7;4 z@GCywG2pYGKmGT8;R-7&W(t%dFQe}I+?Si8?DtNa{c=Tb{Hka4sZ7K~8GoUlZTd|V z5dad$pAJDi91YC|SR*?@z>vJu}!u1OXb#`;r zBQte9f4S7uKT6UPeDJODxn}tP*n7*cD&MYsa2tpq$|H(2sFZ+!v^1h3-Q5a^bSYhm zponyLcXx-Pbfo~>U3RT9Ni zRls+cj8|os+GtYZv9Ik7PSD7usK4#3*&9fU<}OWB5A5<~wOQ!AsM7Cr_T|~u4Y4w< zJwNU>8DU?>))RQHnPxe)I&`tkczB{8Jc1q=$MOCzCio#Kr%#Y=5+z|6;R# zFvW(DRYFMQ9)o)1(7$@Xw5tBtty(y#8yw_UTM%oKXuvEkz?xQm-G~z4qwM}F#TWk2 z$@omTGv;ih4g=U=^2{EYQ2EgpJ9&u}N44mzv8)i|MN zs;8+I3)MQ8+katIuEP9NK*}4_X3B2U?oDJ-ZC~8q63z9&WiGfh2seyb@2v;DA;H7G zMz2UVqr?J{YtswuC*pJ`$JdfJx`Q68sAdQf_>u717i@)m-~I`S)6=&$o_BR1yA(?* zGi&h(PhGu0_}9tQmpgm7ZzLrp&1!jB7*o*H%PmFdbd9(VsuEw3ByG3%x<5o^y-1hU z1DlW*48D%{QJQ6Miiv2@W`#2^J0)fL3(tUIIc(nDMUR`Aw@8Lld4swGl9EQM9rzV; zqGC&2mph`ld%TWje6_r-+C+r6w;E$RHYc3UkGdTWOntp7bE@~N4;or)9|eDnS=ilQ z8`1BGIz3(qKfY(uB2BHBt0@*v&vW{n@2CtwwfyYe#QEzZ<)VVVXL6}NBuvvcdEIKT zc-Mvsogghj=n4I@x5D8+nNw55NJ*);x10%7 zB*er;R!N#6!^nFT7wveH*t_-rWw^`xub|i2ah@(RyesWB zcAhsHOqeUWL+wMj@ifVQi@~5L^2nEOw@YW+K#cx=|3Ta{#^!~rwQP#m*`;1;{uASf ztr{3U>t^%Mvr}IjM8CYuP+FVXsJ*Z}-o-Guj&@bPOKGx|X#G#V-B5wMJ)IyH@l&2q zv71C3rc+Z>>D1YWhch(W8zt|$CHbH6ksV~{%-H7844#N3YS6X1yqNP&OQVClIMDK8nUz*P&9CLl*Q`rUfX<7 zO>%XO!#erdv&9jUo94e|cO)`<`O#P`*yt3y66>{V_D8eLi8(nplP9vtn0U#A$Q*^` zp3m7}U|{s7UIa4NH#eu-Y!F-L@15T0k><3RRzAko8q835h4FUjBEddx*64I8bz}M2 zqxQ-TpGc+|wWE7r&t)UXa6IM8$=xU*2TzomEzGrsic{!!ZoHdCH4UQUkv43X3JwDtb zXLihhq`x-IJ6djqO-9DAcV&8d-CZ8%&K>8&sg(wAweY6e`wuuVDzh{y1^H#;1?NUP zL-`zSYrBaQW$aw-iLsGS%bEPx?4%c^vW;d?Wf=JW1|9=3zOu|59bC4|{DC?hhta_N zM_;u|kMJRyaM`S5%~W~dh!SwU58C3yx$f^*Tk~Pz;{4!uN3=`r=FhN};7mH*Sy-H^ zqwsP>ii8@_t73KvXRFPnx@&qRKSd+jRe!X%YdpMVjeYIkX92%xBb`sTjGQLiG^?-a z+IA%R?ps(h^c3hhoHYRp2U1mo$n)D7o}FF!f<=(r7U#W|(N_5+!j~_i%K2>LxPDN} zh1!We>SXsSPT1g}R0zFMb1?p~VEby%f&l);`t>-JQD2&Sjo)KVPP>7ugSix5Vy<1i z8RKcQnxpeF3&tqEvreHzqk+evk%@_k>L2gixdUExQEY;3ef{O!bodZ6E=IOQ^zl-e zMg3k(H=dSwsG9#nhHVcS8Kv2fc}iS5MW!9uT$Y&UinY#n_U_B)YG!^|k+c_#t^b0J zMRHu$_iTK8E=e?i@Cgl#h(k+%zr@3um*4LC|10`@B2=sK%-;q+=EEbP$|Nvi}OohMpLsqlF@kOt)=)6)z>w&kkbo~L)r)Y7D1A2CS8 z@-1!8i4D(R!&zof={XrKmus*h3x3UG)t9!lWMeR}yTUR1%QF#qZ-+}2*i=Q2T$^xa zzU`A>a)a?a@Id53x~GLIvorl7ZReiU*OoCZ|5DO&ddy*v-E6bbmp;=Va!<%N#<)uK z$05zm#aA30Q}-{iOnl5b4f1+1qebe=2rf?Q50Puo_CRucZAsQ z>_KTdB?kXUMbn<7{v;7H8n2!a`2^E3p|`c`|zodTcGDO>lXZtPr{wSyFNA6nXmAGfaPsV7}N8; ziJ#yw$Y0%(KL}{C3w<;c>V@9e>QHBcgu&K$26#BytZe_*Xml%c6+OicKD@S)P=ee6Bzi< z4+UCpg+!G3AjY|{bG)}jA>*nTcG2@MIri-PSR!jwQy!Lcr?a~0Dm7=;B{6Y%8kJwf z^%(ZwvX?0R}hcPWu|yAhKzl+zis|>R=mWc3X_766P2YXF1|b8ele@%my`CJ zMS7vZpBz28ggHjNyZU4%TlFmPLBfX>pPrlca+Bfr9qpv5 zvXNpe4YuzE1!?J3i_FHWG-ev;gXqhx=~WpcO&?c7uB0cZ5EA?lNad8Jx7ER9kh|3)RvONjVVs4IRweegF zB@>fOLnF%wwISp!Dk;)xlM$h{*Y6gmZj;BDj#sTc$L4)Y&a`bD&a!YP`-%CaIU1_T z9daU!NZWu|iRqab-Ca7x=|-|zcBgG%vJWOI=s zPW<B$rO)!FN7Fu?q-(pK!TIu5n7kh>7_PPK!=S*o69?gs5msx*T;+ta^%g zd2=9tv$;xHj^*6)wg;ILE6wB8GH2-=)t&-}!!8tiXxdlRy` zY*aH+C}wx&$a$ns*$YwV$j(Sb9~%VI{%Am-8_Y(JY!~^q)%D!>9CdsVz zxnl$W)M9ra35mq-NLjg!_lsQ$wS$@--Z2d(UBD;Lzl< zndnP(u{TINGqXK~@50ALpy3D>UHsIz{KD27xv#6K=|)4Otes%KljxzuG<Yx0P3V)^a||=K4S=dX(RI41kl=5~QiuvSg9Gr~SjsE4Vb`vFXP61+%Yw4sq5t zw249E7zR_Ok==wV^YS;~l21vm>)*z@oX?a_bPShSWFO@QJe4_E_vPREC9o%eOMl!+ z<>%>%(L>A@&C650xR}XpZ9LF&-0`QxL-eLAn*;J{#g)CemLnhHqj~O)svK_$M&&05 zo%|QJXL~l{-}lx0`kcT}`cL^lRARkQaJyEWh6{nC+I*_?*n)tTX)D7G{a{f~Yht^_ zxPf3ROKzkjTJP}9e4CA|oSap!pP$y3-L5&g;EyCTPrUnwi;Y%_49xKLUxqRU#A+Q$ z@kgg%ncy6~F&q6eKNm`kFNG;++SPPPyIA+C0vRea-?W$d3uuTbzOL79P~nI3Z@By` zl^ySNU2P6G^BZ0*518!Eg?jOw+amw1{jM8M$>ILUkY(U-`7^h-pwz)(FK^9D4djez zuMFHYHC>m8C^8%^)7zOh36@~Kbw!U|;-JC1j7Cm~jB9ry>8{yE!AAAL%jSS&h4n?E z+vyI0bjum&pY4h5KAzq{84KoWmh^w_8DRicQaWlWF(KL`xPYs?E@p9!^7Ql^ue3Qi z-m4{hn#X-sn6hvo5%tt*eKcGw#4(p_s9=t1IeQ^aOM}qJA6P(yVc$Vcz~^|F4#y zt^9zhK9nEAtY83*g2@*;W81fjNx0tkKF_wW7@Tl%sXFiLif5!NbpGiUNL`!3XiTTt zH*G#Br&(q`waen9p)p1!ekfp1PBAjcSQ zdr9QwXlm#EBc4LX=WCHvu~yag65xr}Hfje`Rr07!JR{gvyh(X!S~Vk2Q#2jc*4D?! zE|ya5(6QG$Hhl%hUpSY9(2qp2I53BjnMGXuCNdKTqx$=&`$UQh-BGii{Ohhbyg4() zF}0F|iHXXXs-=$?w^dFfbX4wLtm)HS_!QAy8@Z&MT=g#LCK3Da@81%J3^Q)BG-{5I zAWr;?H#N9OP2Q*JLfCX$(P%ISxshClcRG^qQ*f-wb#~wnnFgu_g@hobS}U0|s5a+FphG;YBg4 z3ijhell*PPK(w)n53RQ2x@*HX6d-!!jx4q6c5L%m)@?U7i^K$xJzTz(Ex{ht2OO z)?i-rh4T-&YQ`X?SPcuG!)f84Wspw6W z3ggrI^nQCGtH4v}mg{A5_Wj|OV6ojV(OkT5j!(&4PK8WqeVgkJ@w6Pv?Dv>w+_F_a z0DGq|Nrey^wgeH#nzV=Si0IC~oJj@Zrsp_|-|eD|(&e(1$x`;@7!OMcCUeM&9sT5H zL>EX=_xi0N#thl~^zZ9d_ud0|UM5^?NgyVw;_i;xIanKs$Gv=o?yc?591S)8 zqgj&~SFgV8jVczpN);Lw-KyObk-&i#oV3Q*luflLl;Sc(3j1>5+g5mYX`bgW)5lTL zcZAS$hwb3-vZd5$tz7XB2uLt{lZeHleHRtBw%Gl=hw0YMoBl@H5vJuiAa7T$VYM>r zLMfYIe#CZv+Gakq>r58IGi;8@RLqu16dIeH;Y^2k8 zOOCTAcVaR%re(@#1Nl5smy8KLxalTp4OT=bqdQ8b- z*3cQr(Q13BDO5V)WTO}{d%2_ILctx_akVQx^L(=XidXc~kI9^hl3QpnI`u;qIrMdTR4;t1_J{NK*D6C8G#cKEzBMp*-0N>V zuIKttz$=C=z(<)MSUM3yQ~h11Q7}inoFa4p;tQQ(R>Y8eU2PAN2V8pH9_kg!+X*!q4(vKG0BSJL(5QMDuX5uV|>9+_h=rTZ^3j6M(UA^ z71nG0+3I2$2tm`%CfcQ z#XH{2(eMg+m+5HL60+wH!iXy>OV<1)~Be!jRLVEV!X9479-0v6Dp1ElvAGi8z zdu}55!3&HP(O1ef)Zomv_Zf`N3m!R%hUeziR%MUQp191niFm4s#j1{Hhz1i59aD)l zI<^E!t&dmJ1*e}{&T&7keYz&qJW?4|qEm8YxwDlrm^1d=(#yw(%WgaD^kb_-3tsLE z&wy=~m6a>~)vU?~d|y~|+Xu+}D;;EZYK?~iPKzpm7fB_-F`rn8M1yH{h~GC|a>9FTaNaCIsFNxc8`Syg{DDD-NHR@q z$&tvVB=qhQ6TEVf9RWfy=00-o~R1+)sEChQhiOrHGc%su^1u!G!pC`3`DuXm_qy0hTIQ2nzfxiw{p{3&;3 z(`}5`_y+`f>Z%@F#a}(+L$|a-tT-7smT)>E_Noi~I{6%=V%;C{w-t8QBn1yg5F+W1*E9}RgA$PTC0tIoGDiz|)&iyG z=gRhw+gTKaSr}hREt;R%XF2wzl&W37!JV_=LUk#KwNn(0SHGjtUQGr}QZ=MYYYPj7 z`EYKV`SwVTr1DJafgu0b?KwKpN~58Im&Z}M1c9BFk_E-_q+bjmh@&#^&zPQ_@CQwG z;3IcKi`9q6Yq^}s(CL=kSv{C=Dc1fmilt>V)c!SOgO$h zj#A9#+FjlYI%>|K96di;;5Qv9vFJ`XTCy>CYW?_y>Gp;pwp!`>Q*aBIDAWqonD^F< z7MK05-~N*)dDCElBb}Q==v~@l&OUBkb;rb|l?rEOIm=)-+qjt5l#1mOF9Sfy~D~qy%Q4?m#R1i1RiD$ zoe_fBQke^Kq?%7PZo0R2GLa-g7kmR}Ah^MEG{}8+a;E+JDQD25Zb7|3g|q+V0aHU= z{wuo1Ky>XXFc~d#AC-?uSIkcN9m){&NJiF_fGQ^Mv4ewyS6}3|SEgol$Y`Gv1%H*V zZ|rE>QkC$HXV>Cp-%b;Ixu|7T_3Qe$-&kmVq8*Y7czvm&sy@0W#dl;z{int$RwDK- zCHfnkT)pz~#5cdI#-{F}jQt7=3t309Tx=zJYcIM8SW+@Z3AlD~(NKAW>+7WU9_rm` zGF}!l<7^#f$`FK=wCDpmK4HZ+G){E+Qd3b8ZdgVU`SJ}bsWf%+yXaR*HTXS993AsA zocsFK>IR;((R8s!1y4qS&iScch-m3S0}W!+pX9He0t6iwyhQRY&~tf zrH)Rmk+zCI6*x?PEn$1%((yT;q8l_Ejg+jZ7aMwWTJa5)m?Um(Ax8@7>MO&=O4fml zDAab7=bcyHN*xEQLt4DjvfWiX9Y$ZU$%L&=lS4H_m+PZ!79lp2XR8!CLS95}x9q{t z^V-_iKJs!j&8>;B2++g8C*Wr#{h?X(u4XjIuBYwxx3AY-cG~fJjZKHkcgPuQd7kOL zI@-ns1NH4r#BtMUk$6K#6b8#U1?@&tnX=ctwY~3h4TKyW4IVjo zj6zwedy$IkgJ!}W3p~5homl$r_ZZjv3-lcJCi`;61U{J$r`&14Xhzi)nU0ZacZgboQgJ?i+JJrbHn`rkTwt9R@`gBO6PRA!LjSga?YB>Zd zDIO+il}}jm&KGA&DN;>NKOa9dLiy#2v}G#iPvi7rU<~CJNG<#4>r6n3j-mZmS|92z zmgVb>{>)nTwT$dN%{v%slCjOEz^}2VIo{5&dzi7^_^jS*@EsZDk+pCPbSN4 z#_co+_II6UybpRd0v@&m(QsHyzdu@VKGOT4<&q8gR5qly$iOK0qPyvm^phY44aL~- zqb72x!xQwkM*)Lcu@N)gTrn;+olCvc5>e7sww_=L2^X{;DRtP4mKnUI8XNeq+^1pM z(zVL@Vfiqe<@N2`3kiw24ZnYD){+`cyR#V$^zO*camyC!52y+kTIPWlyK%40|H1oU zlI@!!f#Rc$jk(Xim>#>92L|@GGD>80l(H>b5ja9{nikR%bVRShQe7Ux=BN5=jfwLD?Sjh z8UImlp>}peTJ^p98`32)urL{Fh{hTz)$8y9Nv~kY&7EzO0W(-aXLwWY;c^t2ru`F%NcF zkNw>UjN?K_G?&ZyYMI3b?G6^2)rZaO88TQK>EzRT$}BQVOst+B z{lSNf+q6Llp_0RMK8o9hi;{Ba6tAKj_aBt38hFnNel~KxyEwweX;bBhkJW74x+^X;XzsrTLg1r9rS%o`FD?btNf@P(QXbmJdqi2mg(FET z-HE>URuA^*%{q>lMH4R6tgWq+MT7nSxZFx$Q#D_lZ@0a(;CMJi988YQKbk3%c#qb` zAXfLi&_(PuGzE5NQK1La;)iwp{Tkufc01Opm>f1Xtx|_5KP{f!u0&5y3`>!8<$O_6 z33Eo7gxPxRgP_QuJ2*HUvHW!1p=D)%9#bc)L}n-$8REV6JbQ$4y}iV?*e-AIEt97g z5>9{SpzOi?$-FKxOX#?*j_UjO@*e41y@8Tlbh%ZOI=Kc7)+{@#g^YS7o}Udmc@MtH z=MLF>VsQ;-4l0|{`u3;yHVu`3Rb;1r`KjpUw#E)X9<`)$@n4Wv{uCG(_`TzIW24@o z@!7FN?`o(XRdujzy6lHLsUqrTEkOkOogN|-l6t*>(9YHL+*-|q$Df-BQFo0^P1jZb zblj6pzw~I6B977N(vCj%Jw{DI)1EoI)%=>4V=SWmj9fDTP{Lk*upA=v9lCmD6R}vem1~RPG43ZLJoP$JoA!Ye`ovCUo5V!QXnjH8j_6?r5OUPnMee z0u(!hX+Pm5?{02_mzP>|K(bgU!^{HSyYmiW9M`VG2VwP%jZ&uGgltL&?w=_z0m-CY zqp7U#W>I-)vi0EZ+g@;|3g5#?|GDU3W7Q=tRRb-nB+defD@DKR^e^sY%^TH8}@?#RHT`_Gd_?OG*NRBy49 zu%_t!l0JfbelcR!DIenZY6?S)fay(C0U`31qp!e>R52ecEb^On2XizW!tJO6X(i09 ztU8VFrg4h%=pz zhxy5i+Ef;7&cEz?-i_z3oWnSydDNAP3beB_Sxsxqv%Eifo7!|$Sb!#|G@_4PB6 zI3CUQhk`RoFDT&GHyH^z(dv(Mwv_4(W>KytA~h!7xjHZ!@&@H<$t0qIcY zi+D{iYlS1FvU4fO`c|xVxX5XdlFhAayi~r4lGc8raTSHSD@-F|GZP4&2Sv(bZS|kF zSJJV*K30k8svufzb?|nS1T8GyW@8)!14CB1K-aUdu<&w$?63A8`F_!YHI~#z>)E!; zXu9-lY{d=->$2wN=E^0;;g{Pcr`IPZg{%EKlPJa{%0#MNPZmbYt?IvEhYAV^)Mcp@ z-ZdvH$Fq`eGQ%-TrkapcK$+L>t`6<&uZ_qa&V_14MMd33jpDguj&N3TJ(}g%%BN`y zK>5Yz<>kpF3W+>;^yuAuTR0|)d0PHgO&&|7<{V4UX`oQt7>mWU;caa zs`8hx3432|C(b5SdWz#+%4&$>v&mhjc;wnBX}>>1{tI{m z4nx65gA z{Fnot_#9{gl&CJXUt&R(M z^91H)q+j200n>E9e*dNcyZWrN)-NEya%Wxwd3p&LnxaoN50L%)X?S{isy;K*glAIr z<13bmT}6lMRjv%?8lfT2<2nip*LFvGiT05+fYWmJ>t)m*9&BvvZ1eR|PBfG&CBE75 zt8rMZw#hD<<#7P#-*uZ#)MVrSMZoqa(l&PynPni880 z&FrqYXIIeC(V?t<kYsW%Zv$j@kQ8%Whz zFhQSHiwzCj_f`hs>L{ax1+A~%-U{%gfDb^$0Ik{%11?F^+}sSH>T6*$8jyz)$BtCm zn7wl#dSoa^;lw+0$b8+=Gwd2~>D7H7wM zy_h%f7`}i14$m_i5tFTD81nqfEx;ryb82ZR9XCh4JmGJNyNLo}wa|mQ1nc!tyOjZY znjl(*4C}RFWTy0C5_?mn23vUTce}123m#(DX~3e_(8+)E8!nd#)kEt2W2=QO7jh_F zyyw%l7tmiP)PZrej=4joDg)XcGTHt1EFY zQQ-La_}`VBpYBLyZ+1P$h6Vd|IvtGJP)o%GeR6ZFXX)fgL@-E0NjbMSsHK&s{c+zM zE;H+KE$b#yipkCG?FeSQZ;E`*r-zxjHKLf;P5z45g__rg-RG?=4xoy_{{z81FEu5wBZF^5kC(q9J(9lo>1U`TM z{0Y^x7txw#dcW8OnnZ(A^nkgLjw>=5u|7TAQniChX}rZzZ*a)b{A^!p$o5RNo*b|$7)ZY-Cz1t9_Zx1a76kd zpQX(7oe^RB$sy|$+%lJFt z5v08K-|?9Q>0-HUa?B=bT+a4j6MvGJbQ*#l$p~Ts?8smF^vO|NM)|P-flBdgeO8R& zw3<&A3%%vDJo@jm0Az`{|K}2oMMOl(EoMCK5)%`PhCEJ(?>(kqW|p0JSSc0Dhrmbe z3pN=kkL_l$(O{B#k}&eg5RKj42#~`Tj`vpNQYA^4-h3X2`WH}!(_X(4E-Lc{GElBD z_RHzme1~<-%_1$OrelQM)~k!%i8^oIfKW8trB~gJG^^=O#qfb?0hYl;xvJwc>wYb% zVPayk`1u(F0TJfn5nhgFwf#RGM(Otc_QER`T>GHVxWvus#N2 z&=k854rkP=^LJyT*id`B$@*yd`T05WWLPvbG&k-&ww?8V6~dsAK?00tx6{s{WjBY5 zR;P;e2{Wa{WW*VeI@c21OKLh=ww2#VdIAu|g%uwj9=1htNU43bgew689;+0*00hWE zt)T|}E$Fw1IT(fza;#2$GG(?~amj2}Hs6P0MRh05ifAUx3 zE*DPOr>8rep)_(ru|(8Uq(730>uWNc3I7DZ15!` zyL~&JWEY0|sYL=Sz3{c0%KU#BUJ>vF0Ct2n@bU2t`$HkUi8(F*68arccKbv6V4s5??2SNg zXce>4V9BI@^lByF3E4z3fBg8dv(Wh$IMzT+Q=q%D%2l@cF`a}UDEbe{$pLHlpuku| z(O}SLW@kZZ1c>zoG#7|fDev;K-q8NKZz3yWq>9Sfu?Z2{`om941eu4 zA{pL9gTTUQ2&{SREJ4MQ;KHC$jvQcxgUh!dNmmK(wl+#kzn~)9AF?1UTXB(hy z6mCB@I?8vtS%2*&A(AlB<6rrb-oAZXRyj}mSum{v{4Pp628@CaDX%Ifc!P`WRz?JM zlF|Gw=k9o#W$%{)f_Qm&oDZka5uXX3&JC!f+-dD#0Lg&4e(!V{ot(FgI3dV`F6{huWrw*>Ux*u-lpc>3##j>YqQ#Gc#)= zr5ioTVwsBBcTsV1BSi+iv(15kvR!hC2v!0<$EQZnfuRB*7(7keXI{ME)P0FL3$$vT zk&D(4@jIU`_h%+QdGqUQYK*-oV*2O9`J5_VbS7`^_Da?6_J|>-{1t)*>(xJz9A={B z=2Jg+=G%2HUqhje1m)%Xr1;NvTN!KdH%$Ljd@v%Q+(hgRq-QN*;ig!Z^K#3%7FMtA z7qCWBht>SQihD$ibSj0Ck`fqeeIeF`&+#yC%K{HCGz8|sXfOvLEh#C9iINuh{rk5_ zmCM%jZ&~t1^yJP9=#NsG^s`IQ0MO5x?H0PhT&+P;>&33u+q2C8c|=kVy0_ocWpPub$q$ zj@Zx9JA{N4@46Fk=@gSV*Jo$@G88hcuOXY#sJ7n&i=$fOSk8_u&|79PLmlf_pi=nO z+S(d4G3$kpkPk8Ec3-;O@N*ZJ3#f)dhP((YYm_lRKc9r#y6?CIXLEmd7nv^s#h*Wa zQrv%trld4jdw$&d;|Ej+rP~Pj9JgP|uDv){bHKlQm(^(CafliKcMiCO|8UX`5)u*F zW38G~FUFcb847gB1m}Vk5y^EKtM~xdF^CCh`dN?7KMJ^ns6mTDyMd(83&;yvV5`32 z(%mBCi<+nTr)|)Ic-VoDj}Po{G79too>v)c+tv?2z~1^;B@EF&i7yc6&K+urh$JOS zAPVqiZ4f4wp247{Ua}kNHskU0vlDP0NANpj{LVaQg$xV~YoH)t zoI&R9x_&~kzN@$hNj^}@hn0adc;deerdP~TKG|P`W~mpxm0)(dEO5yR6ot(B@HIpc zcuFQdO(-CBjBSEKrsDqoKA=+^WUgv&KnlO)@{F{DxGN6gvmoHy7e@$jC z5@0tSZIX0DhE8I7Qndq(&<}pB1~}CO3tOn)X^7ln#BR4e3sH|23Gi>;yg5Id@$Ju4 z`r_e{Vz<22NJjQVTOgcS4+@y~x~Fm?U#Af?6>ONp%0TumHP9)m*?5&+YY6No_}!<= z+C)ekdD05Cynr?UvyWHVv9!x2iv};lAOT>P2Xk|wgH3P|JVs3*68^@GbVm7k$n&PQPXR8C@6^6Vc(clc%tULg@pmg za3GaLl7$L#Du8CM$Mga>WF8*_bFmZ!OT_3A$s7ljJo5(%X0S$uD4 zDGMId4442!rx(i8Lmax|7|Cu@0l7Et^>YUY2Q*aO#R2rTGlrL&k57}I8Qc`ufruDn z{Wrkr!2J7oc?E7~sT2}&m}Vgy^BuGvJJxaA^X@l1#&dATPr0~|hKdt|Fr6Jta7c1% zf_Q+hwsmlzLtJxmQqn4T<@N|RNHXHW!ooYo;F6$*ec(<&QsI}h#cmNl{TB|7B}fIt zBm)+ao*S5$hFx(VL#%%wZpZZ!LOA8{H|ZwVARKgTeugIy7L$*N$FYKaIKXbc=VEemzjpI>aC!boieX(P#*zrK9eXAO~ZQg&Oi8rzOt4`TF&%u*;{wK)Gzy;v#h{aCuhd=F-qu z8aB2MFySzGqj|60)GvB@R_5mVVZT5!eK{H<9UYP|q2^F9@U2SMiucI%T7n3eb(=t? z#5Z7n%F^%OzXxpy3=B+020Zki`9fX9vfiD5C_{sMW*tO?f5sAAm$>-p#Krjm^mt|G z;kUaq%xgvi3EhF%cTODKjq|v`bl@W zfBCX;F$nI1nFn%mzWv@Z(p8PhlF`bF3R=_?PlSJYZW9oc>ood|U0dQ1R`O7m2isXB z|5{et_6BM@9at5qm~#G`i5jP+SbCX+7f9~`c4;!?B^>CecO}L{%pgvI)Kbf@PESug zZjsRXn-%QC_Qb-G&zB3POYVw){skrwIWDRb78MnRQY0oMBq^!t$p8B+V6@udpmf|` z49bEpA}kCUV+%q{T&H8;laL}ZP5Y%}aNr2W?}H051wEc=@CIg*l8}(t$#Qdh4si$h zaL5!1B1QSjDCxYhY6p(Tj{z-CsvYi&i;GxNbg*>TnjxWlrlPm{H&lW9-`(3lMSwmw zM$6?QN}#6VE}s$;b$|i@0>Bd=5S#0IIuFAG22ca`JyrjumtPIiB6!APh-Tn@)fXZ!J<|p(YC5bHLkglnZmdKG9G*Dx2Q<1Tb`soMnoJ@) z41w`b&)-nzdRbKUa-%O9zxAr}yLV}$)KpY&ZB=1ApWNJFHsnC7$;imiP@FH%fs)RU zPt7uzS!aG~yQytyY3Y%QcJ=DJq2GpmX}9t5o9>mN{Aytc?V^7`=Whpa3?O{H^3tJ<%#{tVV4M3B^5R|HBnuF}zlK*>LShZ9 zs;+KQki*{c9;hPXGLmyND)#~Kj4B1QaDn3=lat`T(4iyhu&a|r$P)d~;lR6G9@wiDeE9(OMzDq5i zCXEN&cPG4rO9+dI zbYl->DoG7v+$3a`2A%Mwq^2h0u{DQIfDhpUj2jvn9$OI;6GPLw`{H0Z0I|E*r>3S} zzkUtwn9J0BsfY3owS&FAB8(E4reHdykbQxn0zF*REE6ICSsin&p&$>p2tIpw5TciU z=j7s2%#cs7cxG;%S6f>PcKR|(IUhWbSduQV4iK-8w|DzyR9xJBdRegGBslU{TyGwq zY}78aM^f`%o^gXG+~`g1gr2YdJrF^)QJr;xLsJKH(jtq`?_33=?rP!y5pXa|h1?xb zjMVt$x4SY>f&HemZpdW7LavdYDkIY+@1;FeZzLFl0f9q(;cd z|H%MpLH@03*OMdy`++c2*Psrr5&91*Qwf9ToCi1rQ@9MQ=Z=YsRNzW_dO9HdkA9xZ z#W`q`zHNk;m)IC`>#<=UNFwwFIoikuLk|@Yy)p@@jan+^yQe3Ulk*(tkwON=O_Yg7 zSY~GCWmoiXhzy+0!uKHw@`78CK@LUQIv&d=ePylLdyfTU@pu#swQ`q;s1h6#ayIZM z|9J~|;i7llKrII4__F~yFa-~2X$_kLC?RUKg1`OlJD4Ujlix_X(iQK9ypE29D_9CR z%WSL>a^aOvR96uc1mvg0@H)WA$hF{@9!`5PBIbnvIb?wm0^I=8Gvu)tZfymZt_do+ zzqu)myr{7b0eJNf6aB)^k5|x{Blp%87x9USN4o?txBs5$3ooC|H2TIqwGb4m^a~4n zH$4j!ss!xy=J&T}&z=EBb7hmiT}IJ82PF{T12B~*LIs%o29CfDvvBtUqejfDan3>vC>anz!icy1L$gBc}R}X zZVkk9FFZyRje}-GzQiWw3G?&w8w!UlA+!W~ zSZ%+TlnMP1sIdfXXVLF~)Gvw5fYbCZj62jYAqHXVWSU; zn5byWY8xgl?V}9Ew35>&Q$=`LYFMCWg%@1ZD+o5Y!)>MLv`fD3_3o5&RqY3a|{n`FK&N zSy@BFWoQyGcTp7Zj(XFoI5&4Cl-q#laeuDXM0>jgm`OUS;!}`TJ?S$T7mx)@#<{e# zN4>cPrKPaLOqhU@`(l`XjrTSuA_vBwb}x0r^1Dp`@Us5&<)yd41eI?LDZ-`iGMJ$tXBql4Y6Ou3Y4eko2MK=d`Vy7uDy1Y*6nFCL9- zl0v2;a{3SONlZlUL45-9MgUp|E-mQn>>+1-d zKi7$rlm-o1cKHdR4M07k*~ zG485$uJE|KA3*qlJMthE?AKRU-@`V(;F*33(g2Z74ihUlPQp zEa>gqp-uJ|5D6J6sf0V8KcpnCCvN3*MBiMWpVuCzr>AdhX_3M4Awg$8kX?|BC=t!H zg@d;EaR?Bv*zkE|M2MMLcAw0i&Pq(00C7=COG|^NDg#pnPu3n162z?##jZPT1W(SU zUs;3;>I6NE0QmxpLq^RXGM7VsUEUFD8>-5F<3t0le*ZB2<&sfi*lHPrw9CG>LfdJrrUw@6afL+=i>eN@nh#@v^fga9*V@y&Tg(&Wy#Uo+j~*v zV1Hj;oVFU(6-9Dr1DW2mr>Dn_lfZ6&YcV6^THnncEcVo821Yz&)ce-0Td3!DTnHHr z3*Hqys-UoTQyx$&La)?nqwPjAGkTU3m-kR@Jnoc_OKBun%^8jOjkF}?xr7f7%fAR7qcD@XlF8rav zLkGwSj#UYG=8Fiu!$~>>l9Q8z(sr8riaET4#bP_OU0qxjs;Ej2zyK9(b0VX3px1@| z6mD7D_5A|S-6;goh)#DPVn>dEvt{j#+yw>eL$2GrH{ z>$6Z4qa~JaBQi<2Af+cKjZd=T>a}Y#d-KW4ii#1%(a}R>qJLG=q|Txm@CxSBaJfzV zGZ!$45g{SQe8P7g8QA%|NL?3JJH9tKjsS{2<;1?y`>z= zQup&TG&XY`c(}M=5dR(?dU|@6l@evJpYmBj)iXlLXjc!0*Sd=8-W5=;EFIbc0s?z` zdvd$d`+PXZCbi_qW}H+QU~w>dnoQ5fH~6^?3_mKr?w9381*ZZsg0Mv!h;y(z-WVuD z&Ts0yxKBna?G*6-H7N-NG3{4`U4Cs$w`8s?E$yQn_im{-xLB9zT8z zSQh;&51wl;Q0n*XE04gk9cGP!)m-`~6o%hXAU<1aYHIgD4vkJe6OTH3X>@FC`w zVT4cemhJcp*^c(t%4e`|!25&!DFwL%)Py=ZeW)R2(ZkZM)0ybt2WU|FG@s4 zMh7&iub+S=p7TE39>Vsg19f=Or}L2443|FW10A8RuHGli=HwPgN`oT!>})1_UlZ_1uw zWoKVmXn=aTuKk2!{t~N(Y;(yqYR%ykkiRFxh9PwN@WF)*M?e0#=w4-UX3bm;ZvOz1 zE7d2~S!Ghz)VMW-;XWb3jT_l$SinZ3t(84>*t&rWeqq=L9OBDizs4s7JF?QIV2f&^S-R0hq9$)*~&?OdsI zWf{ct#2F6e_h?p^mg1NgCB?)LqEAR;F#zN>9jBSr^Bgq(`guypPb@8O49&D3hlNB2 z1_pxXt^js}Kt2X;7%8_=yZ1XEat9~^ZG8fNz%~G~tN2LC$dFy;kyU6?`PZ5W^*hOn zmoHz2IVYB{Jez^t(W!#R4eEF_UaPwXx*=&!S6h1sqEY^EKwg6T-}&DarpP%El%GC+ zEOoa7qt9+MJ3XCl! zBU#j?3Bie+oD%;MJ7Egzh=c@>wPPXook#oT#+c2mt*!0t?ccw{-7yjaYTV~upF$L> zoR$Yw8RyK-MW2cK{DD;~pBaavDq5lRU+*C^A|e80mJJrPrlPlBMMXu_i&Sxcf`7BA zGu}YQl7XZH^PFzCKX09Ue>T7lDp@Q6(h~=*t^0|Lt)iI@zF!Y|G<3mjm%GJgG{+}}B!mAw@(K*Brx&#q-XK-5N0-7f)-v=-? zg_VOom;egY(9qbY@bmL4EhPed4w~zG%)){d$AF*o&kF!`y7ld2V+LL2^tiaVvIeIR zpS!JA4p3U?$d@oW*cW9VFv4%1Wjpl|fY7`nDiWnS+0@tKi@lk^i$)A6HSCRmRr`3{ z01&ce{RulWH#cXEN}x=Ob0^I{p9H8WVY{EtP8x8m7M;AhoFAJPsmwluamjCk%y(Y- zo;qvNYWpxHJKOS80Q&ys(b5O%H*elV$t|_Avhu%A0dmRr+`l(?AD?HG{yuVYV5{>1 z4E$RRw{(ZD5tM}ToxPJ95Vp<9$w8g-W80b5&@GBc^VUqQ_xIo5FM9~m>))AXx%k!d z_rsn;*dOcy1C>Sw!O?Aqr?~5Co5u)U#2eN?UO@qdGTUy(i@7&Z)o; zu*bdjoLuhb5JFaMgl_=w(Q6{rEGXZ?|LwcQ;Z3h~@oW2XrSu>O}|%Yt6M ztoGQm2R;YimSi&p5_Q;(0$AEc_l@)V^0FT2FR)sBvj8}0|XsS(sI>y%ol;v-z~`fp}`xNpw1fgVoa3Go$nFkDz&wMhtNpr`jq zxePl8h=*1lDPC1=wy1c)0PM;($;1A4Qz!jJp8>%4L-0>vgWrj4?d~40lyvYierH6UFk3jEq;8Zc1l405`a@>OINi z2=BSg6X`B0D!TIs9KO^^B%*on%v^4NYz4HOxdS@r>r-0?hj31FFv?}LSy~|npgP$Q zAI!C1S+geHYk1ap-^%h^5`NG0fwIYaBD^$axi& zpTECcIv(N^saNl@*Po+~&d;D~sZ(g3=j0dxX%qyFwuoA*UFPtnD4@=W&l|wqx1s1k z8~iZ0-C9t!Idh#P$m;g3kk&ISxi|>EvW7;#u0J<{TBZH$OM#mJvMOR?VxVDC!~v2Z z43?Ib+31|%)AjK;!NI{_U+gU#IT{)oKG14<0jxfJQkBFfW68bfaS^DiH{944;4>|$ zIKPEB%Jj{frw9=ux?!Yo`YxYdKMM?uci3~Xvtu!;uceF%_j|TbTUQtK6{qp=#-&xr z5i4#|)H(jAMPq3>|E~uStxt^J3W6L#hmWu-St2Wa*%m zH6qKS%%=)Uea^#YiHV7^A%2C0H@P3+AY2T5e0*5!W^oh1UMVq=TD{|9So<9)jVJ#9 zsIeK`wBCqBniwJ$brOxQAOWs2wxV<(=2d0=A5o1C{f{A59 zC`!3dj>E&c3ZGNv%|jG8F&JdhD~xGt>Qi7@>{xA!rqpwp*LS;=8M zJUxeNE+T7hKY#v=hkm0Qzw?St0HZzm%2`s<0!x)VEe`uz5Dk(H@?;Rf5YMu}-Vbi8 zWkVnX(VJwp=z!JoYQ=08FqgT(2AAsE&Zt!l9;@MdnyFx(`J|&<= zWG!&%87@Na9oBdVHN7QFbe};`@W{lfB*iCd4-SoaPsl(y!4II5w96) zbt!DG2S4F%DHV)foOtu^?uV3=l+_~Dmb<`J1FPQ?O<%rbqMg#$Rsv@fBA8PVMEWWt zBRYZv;qD_)Xn6s<;SNe4!wIZT&X%AOi=Z_`}}npIzfb`Di8soh$6_?=qTEZ zICWMt0hH5mLxDj})YOBEY+C*Hoc-_hhQ55c3!GSZ?b@{jK_~gH68hb#sj0TMHjDbv zzP>*G0l!hOlq18#EC7Gsp#%ZS3aNV3Inc%f6dLQnORzaV#BzW1O3yI3LbmKupl#X4 z!*HOe|7@GY*z{{%dj2vzQmwT8kK??5QmD9kt_I6V0;@ zWQ2n3mk40r$M>maW||{{LP;#`^mk=G~jv7vH~se^mFjuFf+@ zE%P-u*6QqKAUHh;3qDe=BrS|)2W%@k#D&3NM@p}W0PuL@1u;Fur=z0_YsK~X0ydSF z-&Rba#rDsysjm|1fM!Duw=@d$W2wzh4ghiGa(uXpp3l%Nj#mA)F07k7>AWH#r~l1} zIbj9|Y1^r`-Ph~1Qzh`x$jrbto+hJ>;Cl9%5kvuYBuHaPKS&&sqXHEAb%iJmRF9#P zY_%@8l**q2=*KrGHV+I8bai#PSVUZiaU?{Fc*#kIN?0@GibKZCX#|5ZKwMWx_-b|2 zowVJM{F65h_(aOf%7U1zbX-&eF?t>E{W%(%_r-0HX(KP9m{na|U5C+BE0VLbvjZLZ zOyA<0$9sQ&NwAZz{evYq%R!kl0MnrzQDbA1Ar@edhXc6-;H9MBTrPV!@KcQ#Y4j|5 z(3geY21qthOOpx${ZwY!5{wo|RCq#yFu2_H`h$BNDlF&g(C=-fyHop*NX!DIe917f zl~a&R@Q38QgJHA4MlMtJ7aAoW*5M#p%K%pQ1D^l#HmJ01`fF2>+0Ld{p5GAasT;inc(ZjoWBaprj zsXPYN&DK`gMJj12sf61vxLOB$Rbc(z-rk~&U(Iom3y&avK|w)1>Z}=UCFd?(%C?u% zb5I4+sJf|{8{u4dsWp}eVSabQp@e51475`DMn#A>49(Efq<@Z7xMDSoaoh}%dW}4i zk(YlN#eJ0TtA$Q6#NGt&xVy1|68D)iAqSfT`gd{Yqp$HfPd4J%jGI|mSy>3Q&baAi z%16TTmk2<1qi3>dT7`y(O{eJ=!Zi{S5(vm>g^e4LxyQhuGddm~f6*!7N5j}dSoPW`DZHd)~#DVBr%G#qFx@;&2KIui0lnsUS4+g zmF|YCSFd7)`Z_xD&`|{Ip{N7UjzawW%%~*+i+=`h`VkRSKGu6Y6q`XIAO0}aV{h}M zH{pZJu#RQt7Z8YK*Hse?x^II2Cdtf~*c0RhdSehVt}%1@37-Z^%5-C6gY`gIM1=cm z2fZZusUn;UkH8?`u>{q0k^_YthP5unQ2!=rAgh5yN5h}dBKFdp4WOYw1cx1j-%yU@ zSC7jXIMytCsJRnz3ZcIZFn8N^a|WGok#XBvxMlMBMcUn0=n zA0F;+UlDX;mxJ-O+RLE7{uJ_H0%H zmtGj*At4+m?9u8Ym2=aeIwRAf@{ts6+!x$QTgDqfKDB4 zt#X*Z_B!spf>jXt_0reGUS3{5JWmD;8ik?Mh26HSS{r7H6NY1Zbt0E-%DgoT^oQHp z-Tz_Yz&}{trMJ4EH)s-YdLql`?wocUd$=}@d!(&sqD0AIS*7cpQ zX5}HzL!6lyY#nqZWG&=m&#*9S}$v-mcN zGpYCzF=DNPW=ye|x4WL9k96aYlb7_9k7EnXbjxQxJZeZHqn)>_moc*T&%pMb^M+WI1r z&uITH;`|`kmsXYKjp-IA&QD?E;=ym2f>RllSWgWD%*-?%Z1pKGvj?DeFG6M6OS6eT z+Kg3iCpdHpz-lr^>pk6FU8|rDUBMq8Ze@!eE*l;HC~YO_2o(K0rQNVUfbtZE)@9Q7 zrq{+R>_XP4#qg5Mf(SvXOzoVR0$M!D#>Y z;@8ti0zr6qcrV4{UdoK#fdO7&;o6MbIXO9@oxgW>oN0oc;8(A7 z-^`hg6G>9i*7=perL zxa+*lM7;qHQiM(GvC`I#PRMWrHS6ZK-CUq@CMF(+WNf% zS7|u$@bLT}RHvCke=u#im%#raga1l$R|Od9 z@^U^*2v(x*u`Zef!hn_-tqSJk9ym?%`gxbh4?Ju3^n#Ta&yD~+t-p-vPn z^q#j54-YLIhR1GWeNy`{_x1FamzSM(-)L!SW+KMl+@_vis;;g!OVMs$E4>?S^R!!> z7`rfX>&ZyD4I#qy#LB8wcx!Lep{wo7!{9{oqF-ORyM&>LI`15;MAyz-|BQOU@VnEA+#YvfeA^FuL&8iR^mn=8Xt|<(n}hpk;QRMKO=MoS5Id+N zCmVZvwRw8cXg<*Srk2TFHx5??ZN*E=%0RIa@`;GNpT6kk=BC*1*B>2MlF~~yURqJH z?1FEwzOr(S;S8c87}hq^nnSHh)WLr!prN6`!^5*6vz7U%sMSJUJ^VFl-HVz-QH`Tg zot2g4Na@dK9D4qI89P?v$?oR&9^$mjOemYUFxhKn8kGkcSP5Yvq4?wY)~0T$^($}Q zy!m>S01;@8;}7^0NH$OFvvqKI)3r^ZGp^!69}_894r)=azlBFjgcoC%FmAB7x0g?ONl8fwK4M^SVnS3cYIdaKa`@$k9_X=-WH;<+!=I zv7A^Qo@)lOy{^|XNv%R&>hfB-K79Dl@kXfQl{S|k$BS~qG17u~K4lV*oicCK34IC+ z2=D0Vpa~+ruc;Y{>q8xY}s4eWS2)prF?@2pQ8*YDQ7 zRlR{Ux?N2VsUFb}w`-#o>KL~DJ@*YQ8dCj`U`I?eSR(c>D=UwTjEt0(-^%H9E3OzM z{q<_-)Z%(TRIT=pY)FEnOhAvCnSDOR7Ne#O383-c=;MlD)pPdkebyNHFEi{K+S+K2 zOr7LN(YS0wn4H-;Kp(~jYN1M+REtlrcEsPleM{v@?5DrUf-u`m*?tdgwcVVN6X4@q z9IS-TtgACima1n&c zs|dn(p=#Y_AvN%5gYI|(1Ynk`pyv2?!BYdL0nJg6zCPRYqDRxB^;?-Y<<@;4RQ>t+ z3do5p*{&G_d(ZpW%4(s=+}N0Y_b4$j(K68~$}ucCa&Gqkw4&<^>GZL&F(`aNOL2Jv zIt)g)_n=kBW~6p-P)ps?iv^kFAqxCtPkH6a74F%EoU5TPSQT}3b!}|k2Wf|3FAxrI z5N@(6w8BH&{TG!F0AI_rY!sxqY(LcSif90dF5g9JRoRa+_ zn5h1@>-JS~adA*^cUDd1RzScG9Utd!c;(lLJ5^l_A1g+HC}+!a0S6CGxWwO_ZLeskNdka&V_h|c%VpQViWfQNsZP|f{+FF?VKF1gFHg)K&q zY#s34UxO9&2Vb1JFs=4;yDEJ^WbS%8N?ZGfct^{eO+ zX{KD}FUNr9X6eMv?*9I37iqrHXF5KE{J4cJw<)HouBmal8~mot410Wg!$sJFs|J!} zNif>?`UK9SQ*L`VDO$QGCX(Hc+uPe|gq&me18hdhH8nIq#t){00rx(r@ILr4RBs_F z#3pj%_NeWrE91Wi3Wv~U{9u;R-=CL`x0H{!;wSz#m!fSZbiC<$w0;__TF6Z7*Y^*m z)!usTr~;xUoj(c%76B$&zW%^6+0&W+9ORc76$W!_n6R#{4*M*38Qed_Wl@@MgK%H> zg2B8UDA@L(FD5{?x)hWds-1Qe6co?9)V5rNAwWdtY_gf<D&u40M<1LnPJX9N#?eRlMugZe}ZsBlZB6Kxw}~mMI+jXDnP?niQaH#}Ch$Q_{() z4A;j=o-|VM#gvTbeh+&2(9-hKVJN7FmG2*>0Y^Zp9dsrN&DyI1hXz0UG^O{rYF2Mz zUyJ85FF^Af?_a0Ae>LB(52d~eSz7)VVB~MRcKzmO3gsBe#or$DLK9Wq$6gg9??G4C ze9&0|Npiee%P12ps}OwH(cYeMS}&Vp;X6KXD0r+_Ez^Ly!VB$xF%V z0kapf^H{6uf)3n1j9*iVV?nGGfkB)+)Ecgj=EWc>xB2a@t=8{VoSB|->x_8w!BPZo zPM0J3+&LP#d3g#qFK5wNM27yj>n&ff?|9B1y^>IFGa^j;78fyo6CV>(IUA){e=xTG zBk@M>*v3vp!{HC>!tFf|prDjek&Vw3M*F?dD>KidqN1MGEgNX-+u=W51C_ulAh5Rr z>Q8hXzz5Q_Ey3-e3$jO0eE}jt1q$5C*Gqpcs zA_FyP9mt zR^HSg(~wP&Z?AUrs>jy;rH3hcwX+vc21?Yr58@8$;{C|unr~~@a^AnMTdQ6!XgJzG zQIv>$m$LVMU!nKmvh${dgTwDPpiQ<1w8Lv5D_DA`Jbr!-n&;?cNj#AG>vatIrZo9+ z@V%Zu4NhZogzPoyvqWwVV0Cl4ydokapGza0AZxVB0W{miix=UE${49hC!9g3j=L?-%w#;++VgngF@0rXBlsx~A0IkH zOdcYiN$a+divD)P;p!8mbp5~tSuwV&_7USq2X0~Iy%}?okAk&V`F32Q49dN(bCeQl(H*64a@T7~8lUFTwFXmJ~*&%Ke} zHl<2yXqbpFK^>ba;D)tzUSd%STRy=lq%|`OKiSf7iq$FB7?jT|db@@d<{iRy-)5%?z2%kHO zrgvjV+_)p8xdePJMk+F$K7ATo)WMvb!OfBo*=tc-TK2Ud-g?uIb|evSRQd9!jcr2N z8qph+3q9#>tJoabjx^EhLr!`Xj|X&#)zD$=fN)65>nxYwj5`e(RE*lcGHq`4J}f-m z9$WW9M`i&uk$Wf^39VI1a^52#AW%%-x>XP9(y)}9$I8kIAVTEf-k7 z1DOnO7sx}whvJr;vafKFe3>9A2~qW1TwPKe?50=qhL#~moUgIJ08^8M!9&b0zHQm= z>j*fjOGQI7;8c~P`bEXi(9p8yERplwB0?J2By7mZtC*ZPBjx41GZR}UWgqHn3B10G zkBcLeA|9^Pw}95yh4|4PG7^&ERO0I1iHU~S<`}b-FP-Mbx&(;zJ!R#t^9oO&KD{H7 zY+sgDLgmQ(2?|^{j{;Fq1OMPpcIVH{b+Yt zQMWy)calS+;>S&Nf18p-+^KMIz~y5XCI$w~caaX;?`fg~qocKqHuIf{YL9=Ew$0ju z<#uDR3`|XB5c;p_6zA*U;M~l-_wQ{4BE4+WQd7lo5H98YcIq5L=bXD><%ntD%G^_C zQWjrw1~55|i*sUa|G@@dwGKNUKfhHP2Fu~(x~B*w1ym8LtW=K^_SnZ#PuhXI7-cgA5hFDWUJ=?kV7NMqY!4}IPm`aV7Vf1@lz=9ZQ>xaANe za}q?>A<(JaLN`N=T}KoLIzD=Ic%b`%0-*dE*bKcVb=#*!|M=EXPgH@${X}xRc8<4D z6@D6%lam7uDZcc%X-hE2Gl<0(24_DPFLNLT^0yS_e@nbX>% z$PwBx3nhZJz7wM#P+ngC@+BcYl4X0>SXCG- z$s27C^}O{mBm1SPt!?D+jd#f4Y2wxml;}-dc7`pVRLw>O(z-E6%EvaNMi^CV_?Pt2 zUIy!8t|wS*$FBDUvQO8b02$SLEo&H+SbIYi9Ql!a)!q>SEH*5*h&~`7AnJTEJ)Xxm zN}95i4r8u&2y#VPn0DyxfrXN0_bgB(YZyGUkaSZ9YyZ$tyr8cg#Nm1{+W$aO=yNn4 zIy!2&S*)sQI~r7*6E!Ri%2fykH+7nG#rIy()6xP4(IpR(GK#xr#9cXRZLPcMVE9T>X(pm9_m4fpkhcaiNM9-*^yBjrlber*MaPhWmb&A|w$c!Q^7 zyxiQTm&YFOE*tJvSJbWAfV3<}UmQq@=|o>iRloP`$sN!iS*p^^oON5hP*nc`X9GR? z#n$VFSJCfQy&}!g*3y!F1-{+T>_bjDKESdC9qYs|*)_0GPIgtv@SPsmfaw&64R8&5meAky>%t5y#4r z+&ya*a_jD5X_+L(>_rc$b%=KC4zY307Au7_vp>tHsiON=D@Mk?e~*dnpw}_M6=MOx zV&ThsI9aG)H2d2hTUp>wrFhj}-;)JCHAX*t!mfp;V$6A@vC(JDYprVj=xF`;2n6`g z4Hwiic+F(}DX3Yi2GppjsR7jZW$3v*@WgXjPmcB!azSEE&*^R6nw#gwmrJG}P~hn4 z`S7WCe7w`|6jH>r5Q6{h8vDXNR)TV7a-zGt8*D!)oJXNbRmyfXV}wYN*OzI#!)G=Y zNq#wsii#O(ESkie(Ro=}&7@kkAjSmoY+?0RPVJ#@!E9W*LQ5OfBeO_4=)1<0-xL9c zDA%}mFK?PkQO&<#!3~HD*QfSwde7S0+7S;F(u_~}>jDB0AH`JEJ;cPiI68OjNzfMH zh%$l9)ld&Fm4X^YN`DRKmG9!+#E9|pYvFBB01KeZ2f_TCR@~;}GlV)p)rDkg2$~cz zTPqMPo2TQh^Zor14;)KTo}v=!Odxv0qQ^5=aDy*dt5T#OWSN?k z70`{oF_Y>aSXlcw-W~}et~RNFU|sOCG1An$ZqSBJ)AeQrQ*Vy?p^$Lu!mXbdLHmm& zXD?%)OQh!a5a)A{8EdxotN=WC{5KBDdy{%SS|NwKlOKi7>I(w{1Mu)aT{qiqG;F_r zBJ%gwr=6>!k1Gz!3O!fLh74=mcOOG_+UB;i5$C6ren0N$#p}TGmP|Nin^Yaat1xk(U#ujsD;z)9Tl$3${&n zTz(qco(!N73I3DP0_?H4TPzb36D5h3&bYc6QBFYtABHf?WGGXj8NDPM_3{KHj7381 zzV)~QLp&iRBU51U9PGGqP#PH>-J$Z%QF`d6nBmVLMT7`c)8gu?(=+UgrluyTtEo}4 z!Lr}7dzCHDWbxqf+hjPDWoOTSDNUDoEARUE&xQ_rR9Dy1_NXHBr=8Ui>xT~^|DP`| zFCTyx@tjY5Dt+~QjX@`G!>)Tnh4=AMZZ0c43tzbvk6V|>E~?H1oL6GTj&il@mfk~w z6d2UN2M~qe&#e#W z`+xpa-lxRib|~tEyo`9pjx@$mk_KKP(PD0wFbNo19>5R+qYm@D;fz+`#!O89e=h)i zeZm*%6MijXXpL;xdi?hF>ysusL7?zF;hYxew8I}D)Uq7Sc+OoTZWJd~vDaS`jU=@S zk&L=8nA{c38=YEKR#sfBhSMl7pQ(03IjO&kZdodzprAll-QuCObwyU9T{EVd__+j{ z=<%_!0xrKMS1Trt07eHNM=wu#9-wIIWS<7eWjx)Zss#TLUDurAm}Ox1u0KDYU7YEsNm7%a&*tIW_s3pM@1t~NF-TOb#P`wUxpga*@gg+?k%?=^+ZugN z%%_Kf7a53fG~N*sC8aOiuQ)>eu$3F`idYlj|Z%?cLX{Qwy{&n=Wjz?Z4ls8)ZO z37dTL#KRP=L?04mK@O+#6(~1HSZ|Pr8x}lxMYfH?$OqHYB^k&hPxz;80L9746wWWd zeiaqScC4)A->(MGl?4dcEKQMbyp*c)BC;9BSc$8Nu&U(ZOR9VoEiElzx0;v}W<`8@ z|82XEhn#2)V{}ueHI+h#WmEWQ29crLcc*jyZC19Av@|tYkSilIGc#gw!4^djgfd6$ zpP>XL1qB841j*;8?vBIPkL$b1q2;_vtl)plv~du7qQFnPqYhoL$DB84Y7Exu3oC!V zv@WbGPfthRt*~wN@ZnOh(AuA)-G+&=F`J5H_q8fiX=O$mE}>G^Sn|H}Bu8l`|oX+zj5*Kl-9nc68OP$(?^oTCoLqsuPyw>wt8nvFirU8=OBvU=k1q%{@&wz zGVT$OSyB?7PJz(p-AHoz={|8VE=eXb)5<vnJ=&H42QeP|vt8)zd9Yd` z)Oi4<*!id7_@DtjBLbl;UA$8IT#TOHAb6w~YMl83h=E83nK_V*LOM;Ix&ZMHb#wFb zoH8U#P1En`aXATevLRw^G4b(zRcD=xBrG~V&divxMyh>D_rHjCvcn`S?wVdWi!veM z2@@js@?3;D)4vD?GgvG7zdm4_3yKp{X(gM`mvC{3c+g`ZRP} z!UjXPf(wXoT{zA##f^L4T?+wBzTU7&&CQk1=6ICY5`>4m{) z{E^@VLf*_al`V$*@_BG<0H2FnV<+xq^C$ByFr;1eW&oJF> zCU>OvZ!@=j1o*7U72R>&|Md3uc6GjjgN9#I3T_e3HS!?9e_%m-DK!OWc1DoC(6N*yLGTr5}E6 z`t&w9$V&;*kDv>&gOA85R~nx$EZku71X zzQfC#`BMHKp|g))fo0Swbfz8Y_+QnR$ux5W1O}p8|IH)HRyX3c*n(pK^(_*w1|uAu zq3Y^tN5N0s-68iZyW=}vS)5B%k-dR!^}Q>9X!cqoBNTrLhdqcoI9S)vW8=$TG9~*n zKZ?y?b((ai65C(+IVFsI_n8^p@TdDb33a}(xcFfN&$qGO^Pr$=4xKtiFP!A2^(-{` zpGIH92OeW&H8L{NeRs|Ccl^ZH9BO1R78bZjAnf(G^6Z1inktVZ+<^x~dK|rU0A3xu zLPB|`gO$qt&gz34kYfsexF}4kEGa2z@zIY~so>o^K+!&P3k!=L4SW{!+nT~yLn8x& zL`-@Jrg+l63O(faiIn;miES2YQp;~(5;~IjS0}gKlmsO$G7AdsNw?_g5bH#f2Ym+Y zGwseS0AhS+e)bfuQqg?coO20rpCHYSEkmspKf)T_3kL9{D*d(R{O_LFi744=)9 z&wf-$k$CHiDbu$iJ7_4T0_mJjT~2Zu)YUd{8UO=5W1@+kS8i5NC0%kH(Y9LA;rMbFT@&yN@zswA>~>0{asTmI4o$7k*_+wwU%} zZERs~F7_-@aKdvyvan(tI>_Vw z!v(%~=qZ5m4J`kX+S$NQxl|r^(0~P-hWr=yRS-kcC>Sn#ZHw@Rv!H*7??`B9=OF z*gcGM&1k8iecN?34r^mIRew$)#ut^8l*ZiG>+Fl~xNW@~3q|51jkE0}fegUB;!@98rP5?}@WF{#x&7OJG>^xxKh7{0_@Madg zXm6LtM|~(qEPrI1I(T9pCz)sFsxHDwUp4S4a*Xf$HPM@*wbA(FUsn!cXAYH}k+tlO zG$Hx=$Kwv>aZeSoU>rk9Czo*1ovq#7WfcO<&oa}?QaqP6JJP19sM#`K1P7DiBiS!o z&{t%j@0Hu&$w6mbEi9P2=%U%eIkF!+{S6rtH6nPBX){u804brZZ+90xdPMTi=V;^t3QKV; zBvlKiPhGiuS+Ucvpp`2P7hyLxG5L6nor=kpAyoFA`Np1yo9*B&DYkepk*m%?82@G9 zNy*%ZL7ppa_5xodb&#e)82zgN&Oe-${@{kL_iY+!QdmY!+iV zOp!~&%F60UEt&Y`Lt9w?iO5u<^zXFda>8(FbzGGR%EGt(j2O4#v5OFBjO-o2EAwqzEva_nGs>30~@C zT-I?g>wZda(|tAG?Z2qm?O(9a!vqzJ;qLB6U)=ALAE$n8s5?D^%?z;EbvSAAeBTxWVK!7EC2tacF*VHFaQ-(%Io6$y21DasMtz)kc zAbD(;-_Qyc_Ml6-BwjWXEi7K|v?6dWdv*c8VS=8{5T`${_z=91KFm z3rBHCP^H3`^)e$Z?PI5v?J1rGHR&&AGm1FOBG{Dii3!n|H`HwX#V*3MG@nCw6H{wz z^>K98e{NLjE-Q-$ac&yLwl8lxJ3Ghm6C7%|onT%>2FQd7ry&EN$>YzTpN*~k-ZR{- z9$KAfIQAprG?qAzAOhFI+ma7gEYWjxWv@+&mWY6;sHoc+a(8i%dqRs6qQESUHXusx z9Q~PA!(6`H{@Zf4n+))ktpXSV!>BUGgwDQ$I7wCz-uJ-+ke87|IR>u91VAQMJY0^ zM$d#jnW*=KGRdT_gUu;wP3-wsB2A&8=WFWH(te`t8T2^a#8Vsp?*I1!UL%vGu~0AT z>lFuu&m6<%f0qml3_zKLCFLnSsQ&%3Y!D}3J5=^_uy&E$tJ>VCj``nQf-i%|uXLP&5-I zmTyOY0;cj6+48ezchs!c9}HV2JJmXZ2QzS;jf^&M#*}m*#&^GUcK#4ZRdaT7n&qCm ze)v5xF|qnad&KB8qGLJZHV~|BtFgJ>+;wf*)A^$xqb0++Gt9_$S@NJ~r0QHbgo2Vy z=L_j)x3)@I`I5V$g_OmIX76hUn4i?jBjNuABI+jPt2e>Hg4oL|J_HP=zRxGzqaq{Q z8Vy%#zxogug!YKz8*75;ruoceb!(9r%8x^V{#>^%F;ikwKXAUzT^ya;Gdev31DSLl zLqL+h8$v=%pX-{cge!59p?2Wb--4PoLEA|m{Zl_y?Pr~P?p{LAN_h)iNiced56SgN z`NO~Sq74UYHFT~s=NCmk7=<0ZIXu`!;RBXTh^Ra|JUpzf$*HM1cz($+q`k3G?2f38 zt}e@=f?h9bT-sHu-@jMFX}p}RZ9-+J!(h!N8|cBTB*V(j+GMPP)97}i;;*xtA5FS3 zpHp3kRQ&UZ=;)gl(v7n@TC;|h(V=g|=XvPAFGteR-NzvnN@-Gkd35BZNqq6*MW$c| z?i_J#Gv*%jFey*Gew!$hTTw|V$DDJD8$5v4JGwl`UPbPfir3r|R?;lLF=;X9F6J$qwdyCDJf(=4w zE$|U*6>Kau4UGY_;eTdkX2ZUVtYeuaptR4N!X-oo({BWTw$dl>|;M;Hzt*`Lw6Pc*TWTS5j ztvh?9{P4{-&0&-(D}TP^?&Oz5r%Pm$=j)(eplra|3mLjCDj2cO*NeFCXrNu7#^TnZ zp2kL>v%1|EAGFO|W?Jf0`>(viucG@8-x#reL7YHxQ;}ep2%|@K3O7}K@fp5Iy_T+S z4%qpaq@?n63dIbGxjA@#Rz6HI4~EdW7G+s^x0AI`ZZZD*PO2h;3^f)^=hws@`j;_R z*SFocB{9@;Bp*?>WqV>`a+Nzme90{`$^5D9;_247xHxPdCSz=RgBh`Yrq8;yvjg=y z3?4M1^_b?bS3|Jr!pcg2DzRSqqpAOx5a#Nho*ul@q^Q)A38uEIEp?dhL|;EOToTA@ zfrD7bIhx-2)rhw{_H=?mS$N7tu9|*lb!4~scKwICIs+UeN`k;AI6L+o{^FT-2aR`` zndT*T_dVj`<3Yb(Kq88Aa#%399bdJ&-)!cx`Vcz=Qc8OW`0(01e#}WtIuFPYzt>VT zUszi^`kA?PV{nGWEQ_^>ix^#b1oj_+BFi#7mj}d&b@47c-VIQF<#Lmnn4n}1`#rw+ zEpCwsI_%l{;$&7t7DE~cK1W+ehTF`7r&U2Xi74Vu6<4=7v4Md>%UimkMdDD|YsXJR zZq{^~6s2R@J31~RDaI|qG&NA}WVFJ}Lyw$m^v%(CiFYN5L>sz2I2nw}KmS2z1>|N> z!Vjs9OU^S~KZKgn~3Oli|RpWEnhHX{Ymo+TQ7-Ut+n6s%k2d^11cH zV@JpSdpfrLM7maEtIi7Z&cV;{ueRdk3)rV8@`^R}@bmIskBp3=pWb%6^iq{8zM4}z zgYabccm9V1-*slBb(-~C=FPuZg_s0nUMw~(d2C%iT>k0Pr^2*dzgu8;z!_|p9K`j{))XR0N0@vj zt@qyzNP}H;@Cso1P|ekK4+M1W({)3ZI>SO-P`7fH=?NXA)co}GSQ)~M(L4GsQ_le| z8fL;27WVOcp1%$bj$2SP2(6FvpuEag$KyOH0n#4Vr}x~eFU16G3ooe;Gqj~Rq8%e! z#Reoc2*F-_eu1Y$VOD$RX_DUqyDi#F3aGkBG;aT@w6=^EfN?s*ze4a~|GDv}wY9bK zI(NEwvm22sdowU!8sC-hG5V$DW!*QYnA2?eAEjYdVh9cw^zL;1vCsr{+H#8@ds(L$ z!^~^Xx4yjW@C*xnb$-H?bHY0OO9~qxdO|Udv7CjaCBS{C|7o%#K>w%u0d4>7^eWsO zYw$kan@{eV!9m0p(Suz&k6%p(>kUTx6x26uKvSTyLf`KB)*RqLtq!~M$Fx35>M35L z&;!43lw)L!A|D75t^XtJz2mX|{{Qi-LAk76RxT0Qn~=Rn_TI9}mXJLoqU^o1av`!u zy2wg#*_V-(QQ0fGP$7KJQ|tZv{quSLRo!ltbI#-3$2pJ3;|u~*6`@xpN3pv!I-1NL zO#R&>JtVuwkI}(L~eZdc4034DeNE78Yn^VEEAeY-}179HwIf0~$E6 zHui*phyEk6G-69W%FbWEZ%i`Sy~q~xW`|8oAP?&*D+gmuFurN~Kg+u26CRMSYERZV zBzcr7vF(M2T7$&Pwp>Tn1Lgi7>osk=}hbJtIT=9qGmMH8=T% zsSuvHsVoUf(b3T>!r}S8jogI+1@GPVj~*zpp3VRk$o96ijGUY?Qe2IqRh1lz{hFE@ zAoeBP+c@8|a&ayY!SGkNwpxMwA-XF5;|)HKu({~rMlB%2R=dHgP!`Hd|L@Lh#5AHv zD7_3$)6I~8CJy=`Cvsf^Xy;g#dkf~riK^U_P2O8LmrbQzt^~)hQ4_WP_#8E?@AmV@ zeVTf@K;~*A&fMIT98JZ?%KrXhh!L0uF{+av%Jv}Vn`Qujw5f-aRX099?p}6IO9v_C zbtfmg+%kmxk?CH^Gwgl) z9q}y5!rG|ZpbNYu{@m+X?;+a`g!evNz$yJ^|Js5Ww5j?_4O++j8z|`*gibuFzZlK@^ zZDm=R)4h8)@(Jvo-oNSZe>hftiyY=;S)#WFRR}#icj2nv%C#>3c3>4Nef#fnxBkT9 z^Ss8)Z$E#tF;%ZxxD|?=uC*KN7n zN{2QVJ&bk0kY>QFZ-7}A7EZsBm){nae)gfXtw1QAy=97sWudZRfQ!pk1Sv}_tyG0! zcyeSwDsZ8u4y-aWu39H;QRsP! zt)By1oLenWTMpZ?3O!^1l=)nu8K`mwrjqrPOcI+AxAGMykRYwIi#EuVYbJp~5$s{8 z=9-v*K-k>T!2u@HvxAWTyK~(?*MxHfs3hSL^g^R#N=*g+G zKtPnj{8rvBu&oU1A#-KUw82L-omViA`h0Mjv=0>C_dG8t!NU!8llLs^);2Ta+B-P# z^VM&t<-BmJR_Ez{6BeP$!FlU=N&f8iA^JnI>hEofZma3I{u8qaLwVzJbVX;-WJHfQ z?QzWzIfi8(xMBq|R$f9?vI}?pcUOjH>sne`a&mH7>X;;C$A^dSXu4bio?IVRbp~DD z18}DU;%cGR{g`EJCO>UuRoM%=v%u@&CU>w#PTxo2U?IZ#!W#Fp=1Ute^A#Nbby z)uF^Bbl~@y?{7&p@71%p{y7VQxnD`8h=FBr)2{gx`1PBRS)@N{TTOR= z9)nQ3JiB!#$J;yC>(4H@aZnN%@bqcue?84$hbWKxPYjJHb_rN7@d>}7io7~<>Ed~c zNZYC_#yDrMqz0^dP>=Ttvc)u^*t>1X8-j{->5 zDMCN(`GKF?23XyeljB233H5Pgq_yl8LJ?$>X2xvD7MsSmb6HO`M5ZwJQ7Sf)qvFSC zvE(9jbC!4B!`pk#wS#atF4g9?7p$cba(T~Qh%1Gd_nRszx14Na2Pspdt$<9%n8SghjGrhkReCCDx`qk zhL=(g7B7Ta<WGqi9?`|~&$7#O;(b-2$~?hV}xcW#>eew3u$&Anl1B)AMK7nvviJFJRU{#dUprC zYPmJr3{|M?n8T9uFB5O5G{h$~l`wmYvhH8owH(Ixr_ zaLFGqSvtyHLE+sC^Sx52NnS)S>N-s2ktx(2Z_VG!9iNA5f7eCTyAIEIBKf6FFGUU6 zLqd(%s|5}W6f`w?9DE@~aAt{p<63f$!j~@%&a{<~L_CVnLzf8)77Dq9F^i$I^9HnB z8QHAwE!6y)mYDEA({ik?p&>eqKq^QX*}kFT8<*ltm8P>KL9C59-o0Cx?3~fq*f=Fn z!ka<8KHSz8%#eNC+FCv>ENB%#3JtLbR7TZ!wkq9TU}|RO9tpz3tmWl?YiQ2Qr;9cp z^BrMK928MU8+KCAspIj{+)1F9*VqHLF6?T?;p?63t)B%_2MjncBSN?4gX8b5CqK65 zeXlmsh`lnc0K&=@^5~{+5zqx)l}ci_wS`4)b`mR6Ve0ac@v7?>9{z!#sUlZ={6!~e zw-SbqTd|fnNiXSAs;jHt#laUW>RPTSKUy+pVo3W7Wy`uh-mo?m2(jaP3OU2#pB!aU2{7*-_a6QlArL`Mt!o~2Sn_k z*|2zkn&x7M3CDPhhIAWaQf6mo1Gwdn9<<^aV;gEL|$DJ*Png4DxF z%5k4b>^BIiqzlzv4@WZ3VJ31*6VcgL6chCKa$`g#vq=l<)-%VoZ_4D48A3R$0cV0W&wXzqN>oM1rKIQP}<$yeJbud%*c0fpK3|UVRCt=zM)}V7~m6T zc=$5}wq;jQcY;>(A4?ui4%%|Z=cGu)eTS;l>&MMsfSFMZ3OWHO!}>jxJy3dJ`PIE| zuXhH-7TxrKh~r>%lyQE#_+WCtI9{i*lq`5p^^3B)?0s832yTzFU5tIja}ET=tlMXk zbH0jKmcYu+*>d^=Ul7ZiF$o{CAGPK{+rKhV=If+U<4=IwB0tEpr+fVxwd>Sx&jG8d zxv8k=N#F6~$Bzl|5`XcW2w&{l*RNIV?EXV>WgHLFi;YT4OUbHmyS?q~?a@RwyjcKx z!^AVz_WV4lLuoLUqwn9NW}I=HeEbZQy)*G_R#sQLPf%(i**^0PL=~Yr37r7YT7UaEv*o7*937-bWBXiofqZhH_j01q(yRX zs<^w?o*j!#NcfMmE8e*D4H(|!5J3@lN@r&$l#1Y_$G5^OEbN0_P!>y*VILV8@okYa zHqLl@UyVAn!fC3mdwGWqW^@MlYV$R5bFq+5P+7y>N?o zTHl}BUF0xML;8f3_4Sc!_)7*tgU@j)$6stYdX}8K47{U}>s6x*^a)S8p`+#%6>WpK zv<@YRZPTi+;8;o|wsR&G=XE{l_*4~5Ble5}sa;N)lmo;?2t_TMn3CBtC*~pXFKdMO zeLx8t%K@9j7RPdRwB8_f^;(#jV`XaBak#|{jEx;0 z^9i4Yj%|G2T)lz;jM9CFH%XtFg=Ht`F)$OPU6#WLqqoG;pHdTA^U5Y$of{5!a!-DO zL6*T_99DjQ2gD~|iQ}$Hl%|rmSU!MyFvDRKNlJ`cca1)b6=kT_Enk{?LKrnulvzofPx|*7j z!v$91m2WAO3*^AeipE+jGcODn0QvAsfmxpWeL4-Z49v{Qxk^LRPu0(xAb8^jQ zeaMpIBg-WeAOp6a<(X}t>4kGtK<}04IS%Ef%w7qkWd}&;L{bkc;{pLLPP4p*Cs!n?x-Ck&?$Pl z2&k+xSQmQNO1ai|rXn(}u0^u8`St6cnRhE392~S^!Ot22#KqA{wX8VTMwAqsi{soa zZAlD(_Cat=Ps@maP}aF~=k})^4gw^_9A(Dwj?byg{rK@JLXWr5ETU_^ly~@ojrS)} zKaa4DJXo1bXlN+2etUGPhRJSG^o0`g0{$;CWeIT6^A^9C9Ow6GBrG@}CN?$`8NMyh zEIay2!CZ%fjtrh*bIU_5)ENB^s3EO3$E2&{)z#Ml$~PNZCP#eOtf;JPa7R#ICzQ<9 zJhQF=w(08XYEH3T@9wv6op-9m=km+S%1|f~{^ZjO#48hDW}4FKS_gFxQw;-*fg|ZN zLaq;3%+#$oKPIBlfsKi+`mC<4@m<5u^gu7{)B?tl=c0^>iGfS64k6&fq+$XBNL_M| z%CcBP^v(I;1<@?fBZx&$Ux3B0V&)!wU)1QGdFJgL``y`Z3=L{Ei0 zue7x10olZV7%fA?Wk6n4+-QWIt1Cvs8k6b~nUExF%NiPBVT2}|p!3?CDjfcg%h=-m zxe{zCLVM4Dy|QVA7R346=y1*SpJ8Q+o+62=V*B`Qq6~r2OR1Rn&VUC7jTbiKacG*P z8#%P-k)a+QIbZnR7nT43CZC94M`r1Xs(QW#I-rV!uSojBe_DJs80-aIhMI=DdWK?NO$EP|pu#6&-6;^2 z501NuY+TO^t$5`Q76*?gNv>I0S$PSBvelm*w{Sz5E}gkU+GCkkR{F@(^7NYOwsP-P z13kUE;>mo18n$9$97~$XX8(qq*enstMhtaUX=M0Z)7K!?ck^5yP)!DBUOI$ZneB?W_QnQO=!U2EyIjk%PYI`xHz1o4G zrtXV2MDr`zXp6=gG)fc-Ou_-Mxt+%ZBH_|_@!G^)>3Q8+Rku8tNFtu6AiD?`ErvRt z0Gcl%bMw*uHE^TiKccUV>XLxP)0cnF0*D^-pQCyU2>$KcN8I(3lg9db`C8~$2aKnp z+POHRPjwkNIRnwQlo>*zq9&F`5rfP4g_CCp8=vLsc{R=5m3F%Zhd#pQO@34C{_M7I~Vl>BWl?t70LSYd6YnUs+ znIa>4{CF7m!iBc+JjQpLbOQYL9Z<8Fq@?A3Y*&7KofBqXveXNN&METl-qarH9gV_Cvn#b^^Yq z`M;;a=Gvbfb4AZqv;(^Hap2t(PaE&G;H4a0B`CT>e??6#RG=nL)F31vXHytgQMzMg z#a=Rr+KrWmr$G*(CJ^cXnA%o183JKD(+cGYnOe1rP5` zyAR$F6zuVJ99kd)DkKjnjJ;g*g+WLLKz){wivi3aE`Zb%9YRwN^^{O4q&PBe_%Jgy z<@lxCV<1Eii7$J`=*%!vMJV}(5{{VNZ7(ka@=oj5W5uhHR=O>R@HQ2``*;B4ic>$F z-b@EB1s4!*Dr`eq#zIgAvkyLDNsByI$M=G%sgsWaDKi|+Vqzp~~lnWqFIzwk~@pCJ6_ zqpbQZK7Oj*j!A6kSrui#Xq%fiI9{!(Xlf27lK3vjL3U4|qewmL?8D%*T7Cdjf)izr z&sIe)EiK{V;`Rl`Cj<=!4;1r@;LAEcd13;C3y6qhFqq4*hjnoX`+Y_B4#XOfV@o#* zU}T)sM0TC5E04nZEW?aAiwul_JmaM#=o|4wJRUBjDWkh^{ugJ#%4~k00s&hzh{0gq zzJ0r}uppoLK*>2Ez|>H!7r+Ml%Y%ahAVa67ruy{5k=H2+*8HGjp;V3(mDR^6Pqon7 zg2lzf`e%06d}BRucbpnVGiqXW;?m>T0UXMYP-0&jH3uP9dsO= zoUG5Dt7`l+P}eEoI8pUMYbC`V5+}4mCGJoPRnrxn8#D3AzJoy^e@Me+! z!fsJOL4?W~=r(WSI-FTTMv-03hE<%G=|b)x%kmur3w&T?uPg?P+e7u&(pk#o(^CH$ zsc<0G2*nInf|8mE^yqm}k(z7ALWxdEa!=?3nD@|3PjByw9W7m5QUcr==Z3SK+-V%& zAB$7PaFg}tEk1ZAkfBCY%vBdUzJBBGm&x@l2LO>kZoj}8SUkfvc#>6thT5yIZ}2z2 zLFu4fmh38#ZT7wcOJaV*`V+>FH^Q1hLC( z9PI35!S9rWwpQ-IbE7x6ecY@$E>0$MOXAQGySuw5C^0HVhcMX54AeTlQ_8ibyHq7d zN=;n?KVR~DF-0(exW9gtOua+qBq{c|<2GqO5F*ioBYWcGW^rBfepEo|85$U@(S<9h zrV2a)c4Rj)4S$o4c0BAE!dh3d8#O0I5w!;mb#7}spTM?R@+c4WpyzdUbwV(1+0&^y z_d$tq=j4J4hJ<{UdtP3GJ2VTV55)V2xO1&(-a^S}^f9Nyq{t)vOzp;aRrHl<#n_lZ zQkCT}#jA2$3O)&mdw0ly!$a1psx;XQ#a0F=J>HaUhnqk>UaG3>1sd(6LndX|!I;57 zU0w#*+4wNs%?VM~!HA&;;JU;uODZl5mH%Dy*sPx}a5a6m)hq9^b$bp|8P)u)OFhRAEldG$%hldAa)-&~t{u1I#ls)oLIxA^0DK_8d0ZBA$JX{{IVGYv{>$g- z>+oL{^uIPG*S`_CF_PdZ(#ys6Ka-lLym%hi`hq(w!skO}5~(clA9sL{Ij_AUDnI|4 zJ}(W%k_6%5JEU;AzOIhd5(lYM(%vp3@uFve?+H`?5p>+0RHjyPy&LWd{Rb-Wef$YD zeFC~WiG@ZRAEFK^Jmwi@8U&CW!xYRTG0hd7CvvyU0NU3&m@h-SO?_%{5Zz@KqQe6AMxz4dxOZTsx*wEKRM5)~Ew z)huVtG(5t$2&yZ>QfTzr4FXHR!Z+b5R+j(rrNQlU7~*%%lQlN^fW_@e5Y*&H6M^7o z-RJo^N4y+C%ED)nsAf%c048>*WWAgeMHiGCjw~$7Q*n zGBPp>9K5WIjg8&iYqQaL9MrsLpbHRNXJ=<0pI2g`)6Gl!L~gg|Mn|nlC`84?Jj2)u zCN3^e7&Us-baE&aycUp@Y_T`glw62n7V2fz%&({zh&7Dw2LVwz{vtR=#!hG*^GJbX zIHmDfFS^^1hhM0@Vm;Eq`(I3k8@_x-llFTq;#pQ-j1HPkp$KBt%@Sq+#Il#x)bJhk z6*81vtEF%19)Mrbx0Mck;27lNBRm)!9)@04k+cLl8Obj^IyQ!#lzW)iy#VFU+3=zW zR8`taN=w}s`IIIB>2Jp$#O(3>pF1)5hK4hXzrR0?2)^4pNingkWwGS6wDooOtU9Hp zvttaXjQ0q5QBWt6eI-?V=ho%-)6*MnC=eKh>o>ipR_bt8I}=pQ%(6k8nPp{UbW7=6 zqlzgdpZ98Vw_{Cjyt#|_N80_1Wh#c|%ulYu{Apm2k+V3NH%i*MJr&$hrtmA#0pB+4 z!>g;S^Yil+X#@3C^m!EpLLXo(RxTVtol2`X-L&eLy;p01+&!tfA~FpkJY5U-9?&pQ zjoJD|AV9Qq&=ze|HzXtiu?xzIqi@>Uq>l|hK9tU5kaKtEuMRX4O6*3`l+Z2Ohub{1 zoI+mE6gBb~k4)a%QHu(gA**Tu8Y(G;S7dOskbar1x!A*@X9=o=Rt9$4jwyZRe943| z+zTmtnn3<*aO8hZ@_?FGJ&@Y7DgekiKR%tQU4Ea8ijm{-P9_okl_PV`}#V|JC z?aAFi%=C1h4DnsE-$RvNO{%~}oe{Wh*O|y%BPb|ndy`A4GUV(SAF95Nft*i{0@RxL7qcHC9i=`-anQRI^HJSg0urs{&5r=dB=jYC*zVH{W(h!b+#ItB>i}_|lVrQhM?gfh z6old6;J6FGa*!@p6z8cIWEho!VdGH$vVH*ZIP*XDU=;$Z|K;^;tg8)g1hk&8gHLXVWAkHnLJT-ywt-@9t!X z;M1Q{xm&H(XYviWyQ#Jg(vHphrR*n(bL=xidbe)f)gf1NP`Z5P=o~8>*z2O)GA(B_ zeBm{0n~mBnoQ{k8N5|5c9^EP~SsvZE8cba6mR0QPf_Nq8e+8WjC@NyEu>wC19WYf36aIpvg^zf})|`5JNVfqd2FeEuS?!+1x8Xn+c@VN$>ML(OC(^~_H!vHu^ZLSN{U}FO z_>|$p7NrHGYT+RTcm9sLls)OT!f%ZLGxEMuogQI}rWu1O=nbTKDf`sy(2d>6hxK3~ zhzSW}Vq=Mji9etSn9K6N4(b5()v&%8ChNBpUa=C4Te9OYX%EQo<3~$dZV-p{@dbLJmQ5bF-U85}?7;gb#1)k9;J>bJNpLr_X07;dC%^ zDv3x)l*5_5HBq(X3$stJxIca1nn%9a6c4NqVbQ7*j-24)`FwwQPX(br zu-azQVe}i6U}c)-l?~VL4M~tj$b%KPwGO@bxP#s0AYwV-+wS3!7i)*?ZNg`-Uz^_E zLvOWm-OH!BQ$2yf#1q+I5QMQ+;R=Ri(MV5EPp&#Sx=WZdghiv|W@*IYJJMr_h7U8D zP@-j1pr2o3Q`0RTgV!rgq9Q$>g(6d-?Uw$y`wc(H&OjC8Zq?&+bCs32p3Z3%=xnEB zm(RfFywAfk#$=fyKJUg~p;k-}sXzzT%_a}Jv#03bBoR?4mWGt9M@}=bSuV!J#jUTL zU&V2I#Fnn(t*{n23LnXi_p%Qetv$uDziYeI144@I_wQi7N`*SH9^qkv?^JfB4g(}f zd-4pEdNW7q3g@;ASta=S`5AW9SVL*Xs_dmZo&m?7BT51f1I7^VE?wU3z@&}=Fb@NF zs@xF^R;edhEBdj3Q#Q14C#@rK}+dh4BeifZ@flP zu4{~>S*!XbX|XbX&-u2O?xa$17S7Oo=^%AvK(`9&QdoE*Lta)>GyGo>op+wsn~-Vm zc$x^CBuxj~VAA0{Z=mX|?he7e3=$RED zoJ>rBdj&of;55_(TMiJbo4Sn~g<8f*bJp|c&*Sg1)6`pD;0BUCl@%zQ>CUotcw-H6 za9MWYOCEQBLY0;j4;lRaeR{r&y>8{&L?pHFLPf#~x-FQin^bBjGCQ>oYeWNK>4k{8PBH#9UHA05@ZwQDOU z7b>g0NQ<#t=Hq0`yDiG)4OFjH)d<3)u)2C^eUCl46pO|7JH&d4`0X0)dbC4rC^@ZL zl=(77n?$Cd(76zF88Q#dVOq_uOYJ&3M5T}&2H!+b-jdw!!>aSZ&q`%rMWg1&(P z(DPzN?F07lnqhBD;*}T=PEYjw{QdXd%92dQnV;K3KXt4tQSfr&wPug7>w3M#L z9-8w)>a_xNJM&g+qs_1pIgD9rJ}y#+7n|{AY^<;IU&Ak|K^`)r`iCw{iQ2X6U3@M} zwCxk%<1>*^Y{|l@#5TTGYDrE`ZX8O!5eelmmTZWJDRhuM3P8SB8TN$_qmnh#L!5@s z{Mo(}AOGCL0D8A5(d%L4ThMTfck}ZzA=mfyML~AB-IABTUWO{;WwRSS@XbJ1jcEBu zhYl|Hs@YWuoqHH8iOA)E3bAs>{aGH^{(Y3`4Trx+2h;9@>S}6g>gviR=cxLYCMME*Zi!zV*FD;q zoLu0e1poZ-ijpgk2yj)sl(ET4u<k4`+073zv{7zj<$Bb6_VNkf4HLR6B7yE;mz(AtKlr55KAec#O|Dsij~Ic z%cQ2S+SN5RvsTWFsmY9cI>_!m*n447LeB902fhM}b-AnXpS818NC8`r?awS!sX*CN z%ahj$nakQ=>m`#*^6v*o(sa?;*gA$DLAprxI+|AEu5@Tdpx%$UsrhZ-JToJ1+D0ZA z&*`5(dnSzJQq()J!8EKfq%?)}xk*3g-fns|03#g{+ep8_Q=uiE5V0^W<*vq_A~X1& zcJ>(z_QLTFtJg;kGaU!}J@cRu<}jwnn*~r;uJNnPb~4n#~}x4{>118wbujN*@I<9L7iuo!D+XKs>+iR*AwC^=G%Imyw6 zGqd>PMDh{&-=#-H^Z!NP%%4y*%cw6IN{ls~0_lxhDJmsDYfTl0w4QDe%5!p|zf8=$ z+AYtew7RoTCP=yel{2|Kez06cl8TCox&$8UgM-S|G1@}jk`oo8J_F^%KQd9qw!1%K zR@zde>mS{Faauz8>kF=r{`qIEVPjCUsN(E}T6bY;ueYZ+<6a#b8)Xo+LcO$>rRhFC zap0XK^fKeM;Yb=^e_uQ0wgI$AlE`GY(-QxVe5D$P+t%3VsPzQ_fIOqZn#UM8M}gob z*e>-~7ApmLc`->cEd$1Lj3g1%%Irfyo?e~zuwcT^6V+C^2cyL~{$E6z zeOEBo>bcSN&E3Yl4){PCR~vDj2qnCbq^X4Z5WhP&j<-JB*B6b_PZo;;Mj^qsQBqQ} z0&eT<1ho%waOo+hr+w+kmZ7$0{-lo}tc+{OUay>YHTL2F|0-T=JkAI=t;XNM3*!D$ zPDYP+siOBc5K-@#hbiFpygXbE*Oeu_pEWdi4@va)_Nr3=IfynP#trT3xbAjA0E`Ce z8sS?|P*B7Negu9h?9+a}^p}_ylDUImfSzX1#d%#FD_Kg{eD^_dZcfhF2xrV}T^RGN zwUro_9G^GN0_!GO@5?;}Iz(@o`+Wa0)95y&aCs(Rr{6bx3M>sFO6_1d=y(}wzz7U= zxs6-39pK>6H($TH9&gc&lQV~RpXa`a9U5cWkDqA3b<_R$WbM}QW0ngjWM4u#UE%a3 zTN%EaqQf&%H$x8;k}iF5NaC88Ur5D=tRe-;NT3J*#01QmH7hGi_s{QOQObonsB=^s z{g8+(FDv7uBoKXuP?HXwOb$fu`drL6m*=DyK@b{49Qzf)=a+#AW45>Wmd*vF|y!iw=4h|0Yn`Rsdr<(m6e%gAZNBy)oTv3#2 z^xm2k4-)*pTvPI3-0t`9K^s=I{!1BlyG0LdZ)(7ytdc_Zt8rPiC_K}6H)W2FUN+6# zt`Ez~%_vlcNA2EiS640WnZ=uG+&dfbIIelK)qlx4QK_qpTCYiiu`?Qsh>fNq@MmE|~O;dCEgxR^F357yQ$bkuDzb6_bGro7e-0<~h^4uS9 zS)d|-BjZzX&Uqu~6WBugO|6GwsAD|?YzWaJTf$GM6^i0O2qh&Y`egEIT-V6(@Nj~y z8^!s{dUw;ZQ+e5D&W{yUZdwOzO74M)o~4Szkdx zA$IpsUp$WU`#&Mm=J@yW99X*|dHUNmlx}YYl-RO3u2*QAo405QgielD;+{Q|I^qE& zIACwHjO=V0YHB^47eGT+R=PMkCQ3b|>AwUIgEEupgJ{C;P}0(Fb@TG_Rw2Xg9X)8J z>B0aFJT!EzaC}|A@HX@|wT1Qmpg+`?>{~S3`%Gres92 zlc0RYO5mP53k-~DBL@!@=MLjXv}+bZrjd*b4q+ig_plGUGjl%L50UQ&LkXXMNs=P| zuZ9JfiWmh0W-e+^nEE)O#z;~+(bLmY`r^eV5|@F$9qJQuO`^of+FE{)c7(j^w4OYA ze7#(AL=~Ia$hOGytje_8x~8?YwYa#rp}|n|Qc7g9YBnJyJZ$$h=H*L433Wa8n3$Mi zsgbt>78rNue$~sSuI-SXeO6ddDVS;G#-tw~Mey+Rxxo7#4=E<(6#ZKn9_0j!b`ysOx z*luRUJ-Nq3CDDB}S+Dhcj%C?Xs3<8hb~kD2^Hfn&eJAP*HClEY=}&Rkzzi4(w2U$) zDJv$1u&GbUe!5(p8Nj|Fj-!YUNp@pfcSDgG4C)EGWfiDCE-XqXmz8ACK)`{bESn}5 z{xin5Ou6H~`f&mSJUzc0qQ+LJudnYpxt4(e1pzLLPqTS_``bI!?d|Q<2*Ly< zdGgLpudID1U~L!lZR;21ZeD%-__0490U;sRYT&}i7bR=^yLaz8IBfffm+~6#T-NJ! zTY);`NbPrP_5_7n3H{mx0~S6%K0QA9%yTTuO|I8@UovUH9<3`tl~Vg*Vq(I5P{Qu) ztw{)Nzw_W|`Z2WQ*@Ydt@MDzveFFYQ8 zAv8sF4UfF4LavGBh8J%wSY0xTjxfahY9IgmOAY&{D}rAGf>iE(`}XbVXfhj%W{Mi~ zdpOwj=!8+rRz+RPhMlc5-~nfg)#6nwp04ZP`X=Zr#{WkE zuy@5Q`_@Z*)9+rRETM+w zkXk^VPy>VpGjUx~vIY4aFHCk5@on=%nplub?ehA|y1D>tQts=OXHlmYPJ@rUep zIV|>j${S|ci%Hx+4=gt_oWVtX z_I$)9%nqE|`c|S3d3Tx+zo^WYKnfLoBOQZrKF;LgDohcuw|`gBNb!I0%ZT6B*47Ql zKXL6>DrrqkjWk_+MlZmx70B53>{Tzh1Axi4lSORwS65%3R3z^_HS^S2HK9{&3#9Lp z@*5h2D54fmn0>h)<)D^loBgGZx8q(sii04V#_RYEqH^shs`UrH$c^WP)SLBSv~Elz zzyT)|6$BuMr>D!b^sp@P97bZwGSP8yS#>yUiw6eez%-8-8he$3*qq;HC8MK?vF%q! ztC*YQM~lcEuSD6hUPKk(A-DhX_5a791MQpGjWib&yek^Y@b=o(xEJK47taH+M>Aq6 zv=#}N_ij@3tC+YrFqFQfuV1TPoBVjq$8T13jf=lb=D~Z%c?31}#^&bcmoKS0kNK3$ z9xNMso3Fu_zY)y7eEITZf3cz`JbAAZCvIQF!H6< z@K5@pRYHYWkmpEZ;$>>F-lh3CsfsEOw}Bg%`Hkf$ken)`X}ybysxnDPIzXT_*YL0K zM>#4ln4sS>P2}T!5>QMJ(SvJV>V4d;d(p(>bqK>PnH{K~+uxPBPN4XA(VRS5>HyX$ zd{-;f(bd((FXW$?B*ca{KEn!%iHRkr4i1P$K{*UOZg<~MQ9~up`c#f1FP&!^F+|u8 z?vMC{1sA_39p*lHcjw3fe>3lL*g(P%U27c^7o~YkPj7Dnaxw;R>KMn<7loL^b%(}c zJ2*Ye(s$uW_8=AGl4;&|3tE;I@pHk_ZIzm#$zazH}|O<-&!WXPt#Nc*wu z3_SJ`&dAjW`Gq^?<>Hm&>u7b%8Ao7Ib<;S6{w@bBnc$!Ig2nSRW2?~aCqU@B3U55I zOKv2Y07y4mSaD=ATRsj71i_p3fozpLtRs@4F^~GAEMGfa96SEpCHfEa-G5KlKem38V0+I_#YN9VzaTa@yj%j6jLl1qCP|D^#p2y;2VY9 z`~ID$(azV`S6w{@*h&I>UeC$p-O9EyyI1$7>KsllUp{`cjExRg2y*GRb`!prPqT31 z2|NHpa(gu@XGwDnfm(8DK2ysAvs4GL{@@*l`F51WPx=&<)zFtTne)OnAF>*qiv`QB z0I;%SP1l2T%xm^mZhc-0=Wseps3}3k4 zi1wQ59qtEzhf;OM_aD=1oehBU?4rJ8fLMqih*ck9<*KRe(Gu(aY|Nf2cyLu87Ocat{JHfcH;Bisn)dkXV`7P24D_Tc%Gc|qtZ}9a?b;?8 zZkO$95^1BPca~CEpAQaz-o8b*_hVzW>iWDX(sX%((O<>IG~0=^To*VQN$~0u7l`%r z^=-h!tekJUv&>mm9w+*5tnB{-j%`%)UQK&%TLZj^fTqv8?PfkU8vb*fIwvb@L~3?s zrg>#RGM7hDI@Ij@;gKU#N?KY22tv8jrg&bD_$IQjQ94l>N@89c6S88zs^^*~CnjFG zy|7-+aevOTl39XcKT>Y`3P#-e6AQJaz+Q+{V{AQMxeiD{+3f*JR9)i;;t8nA8ESn6 zwuWxpCi}dHmJa`LQa6%8xt+)uD3`R;^VQI&Qwx1BNGWQA+-lvO#aY>q&1MSVd;z4P!2Rods_s9a>~)tbh4p zZhs+nFbx3&P7e>uPBE~V8_F+@?PdoGS5xf;4jO_E8;Hffwn42>Py2heP2FF?)V3EP`KKTk9AGoKZ&Ec@XLUmE>`_AzqR=82=l+0oDItQ`_(>(~7CO0IyhidXckK z8=dw7rPw07E8li^IUDUD!yk+*A*Cf`8^dKpvfuw`m}2U-v$JzRz%(S@Vq;>sGL5da zKF_HO^ZM%79IF)$*^yY^m&Ub}yC*m|Xy4MMu;d0{8`mrRq2>g$-&+hzZb+q(!^R{; z;sTC$a-qIGyG0^XA3ot{6vLXB8fItBMQ*R^ew*>0yGKHSd*On9g76!%jpsOK6c1X= z$v^pe<%AT}F_2?5t4ywn%!|pAQu{&!-w)FGH^wrvzey?J<9Nn=WDXo|Csv^AjiU!BdF|m>*RQA zk+Xy^gq%;vb4Fu1f%Nf!F0ZxjfJ)JQWo2dKZjsReUDxv*7bkD4t6|eDGEI}xPuFe8 zUT~+?!}w}kmz5opFg-b+JH-N4?cWxa4zEeMI&=OX6q}alIXXJB^XJL14_64O&%?QB z&44{dU@ToSZ{`jbN2(l40sBna|8e4Jc6R^v{I`p%&)iKn_Zw3d!RFhIJ2A%dt2q8j zfdezrCzY!{XR(^7BKP9E_bl%b3WVjPU9LW2TQnm})cqQNRK7G+A6yh~Y;5i~e1w{Q2;&pQ9984rhXfJX>4W*5>d(HVA;Ge$gU7k3fPFP?s3|JL~FZJ+{XQ=eK5MG35lN(_>cvo0#20s_)40@6tLum-H60-_+TQqm<2 zGlWVr5)x9<(%lok=N*`V?{)pWuKi>6o%5da#Qog&skhwl-Z(=Zmmfx5bqZ8!L|?3n)F zwToOcI42axTQu6;tqVo@&u@l)mp>0ac*E(YLsaeQ>G7Y|)zUJzXUX0xbO*1q?5HL9 zMnh@9o`S@1u^56B7Z9ceDRGtD)_v$F-H*aTyuVw*m)*9M->HG)bwY<0OFB}~r#H+vcw3__<7=mB6@qe6x z+a3D0gFx)cd`MZ;rYt7iIwjNQvsdTh8xU_JWcx^3~)1f!(gN)?(kit^~RdGf@%w`45} zx6wG`y;5wSt*J8qu(Ktr3sjnP`>&S3g9`jye+3^G5)e2wwHA4I|LDqwpy1KuloVvq z+ZfnqXJUG~;&wFupGh1b&EQJ5x3&LP6WO$CNu05#72@Be@H_>a}k*yk8 zU*DU{#XVaTW{THFP$h(6CT^ax zVf!yFlaHLGYYyb;6*~(H3)g6!UdXuZIL~P%aCB1gN$LxCha|Ggc3*bY?U-9bKK_7L zu(q`|aKzsi5*HIIwC$6YEsjdQ9bzgPew?RrhS)2yJXv_dXo;|#k3awVm0q#_92aKZ z%zs)$NXTxe+5s^m9z*)Chx7zRSQEuQfTH*09}zCa$b!LdxR0s<{T5G$WPN>oDOWs8 zaF;8aUcb0X^xk2f^YZ^E3h|!iFRxdP|H{7Lq$lot`pIs~rUiU3F7uqQh)5k-f33FN z(Z$7!Fo+Qn5_;DqE9(apu((}+!}*C7a^B@~<|zIFq1|Xd7(+!}L!-+{MpRKjVa)JJ zeGdKhYYbm(?-Bv{SvNa;{EmBaT2#rqk zoqKX6iuLomkzl6R$BKW>xu%!Q*SeGpvPVTl1w9>l-xY8nQXjY0FgPFDv@|~cL$I*} z`zt_lsWn42DK343_%FMJe)hNMAi32rGj9j*fs70>Hum(qYHse*``ayTX%cv`QG%~; zd_!so9`BFha9bZUSXquf!Ok8cYHMR-X>C38tAkLC^9aI^>inWpigbP8>3OGpVuDRV zLUfem_mW)#Vj+D3*on0@dy({|OWuT4<)r5U0rGmHjg8ka3lTCSW>Z8#c4@-m+#rhn z;4%aK;)@qAs!=6{g}F&dxnL-_(JAe(k$M++I`s)ZdUw)#I2MXtZvT_5wGR57mK#C%{gQyd zRnkA|I{7xliY}~Omvz3>`mflRv0l*^=&wEh-;N+oHRs!rvur+pXz?o_aCc6(Y2N@I zFIv*i(6`aMLh9!vUAg!em0AP=?PV63rPmI67)@To4|Ry0h+g-@tXk%{)tvP(fIPl8 z?L0s9l+p92b$;(U#{MztKR*uf*=ZMpjflPzD*j@wvvizm~vtZhn$XAr^tUV~~Rzed$%Szi1{?mV8U~M#p zXiJ{D-l=fR&|Tbqp#d|mfmtGt>@zqd`%-d67UM{SI;)VI;OJD!k)?S{B*uNbosN-YIMbVwGflvg2~V=Jl=W<_tVm^a(jkTT!2q;7 zbn(QC>k9t((XMQh4Hh#i6l#S-%6+vXD^^gjWj%gwE-S!mGQg&2Y~&_iXUcKAnbLgB zoIl2hOjlQI{loG4`BtIJ9ps7wIN`#*L}FC>Cu?2-jyAFib+*851 zcI|f<8j*8N0ylgD%<@Kv0>-0Q&At;c{H2=rgl+@aLMq-lo z>Gk!ZDTS&S#xUedDhQK4&AC?1o8N6;#qLtg)$kbgt2u6JM|lf8wnLrm5_t@iMv&Zg ztK6wj*JEY6bl@2`a^*niE!m{8$?o}d7q3-LQorru2%5aW#8)yq;JerC)>m8ag;lSW z9&-^O!?^0_V$3Woq)9WhjUTFHOu=@e5>4=_S|D?ZE1e5==~?Q5)JG{P$=-2qTxP

NbW{$?j#{M?-H@w4~S055CrWcKa;>Y)n4%HkX_mNjd zm86y|OV#6zsGVO*ia4f(8LHvJ#6wumwquv$A#5e`^6g(pBgR|a@CNF1<|H{XRH&fwO=i-c`nX*c}mC3 zc%0Mt?iaTBCctxOX1Qy|>ru>TxFwcTS~B+_`JCrUu|^Dr6uLL=kiCNg{_5g)ce%O4Sydc2Y@u9p;-xpbch5cfiCJeVCM}@J9wTOhq>UNo=|b{oB|TZtX)L~v z<&eR?SLCLRwtR2TZ&&;hl#cThczjPjR&H7}_%g!4ZTQLJ@*pRA1|lc%(ShInI7$D; zkO{bzKJvT88icgmd1mrj2j|`Mh>Gvp~)9kBg+_iWNq zB_m3=WECIgg4yV@Y)jRO(w@odiXM&L=qyK$LM?uiS!n4}RTLBKab!--%bT_(FB2A> z`zt)e#l`p51J^O;*1$$-GaWmI8M{fA{A)PSd3}ttj!?CrBsnL?zn@3j(e_l3oGqYy zo3EAF?f7CUyD@*>(d@6B{Dk1_JZ<@83@%&7i6!-G+j$m7A^)a%L!HxOAEz z*@CyS5_>L(diinW_fAGe zO@S|bZzaZ%kgq_wfwTLIii;%(|0zl>Rfg?Z=~+o!T<xR8mA z$w@4I-!jkTdQE20p$YvshV12v1Nbqe3az5O z4h;jZAH#aXdO3cha(Lp}&hg_v;i(NBapLzb%eO{pqLiM+!Fu05vX z^z2B8nObbYhY6ZZug)E*dcnr@{9r%bWuuC?S^U3rSWHL%j~{=GEhVdQ|M)TR%o>w2N|y(k<1^x>u`^yR z2o$}Lavp0AZJB_qK3!cACtn=bZi_7xT2S{QCcBmhZ*ZlirtT;IW~{EIb#27CgH*9N zCi`1ur)7p$%S3v5`qD(ZnwlD2Cn$H5v8C1|EiYj%rC#Au8*6KGD_tEuJvJ+plJwgB zRjv-t_;?fYJgToQA*kF`?EIL&0b#&8zh`-)kL>;B*)b|-{6(eU{OU)KAJ=#8bivKP zSy1T$O2@_~l6o`E-`_Y?e?97jRAw4)Z)ay%ujv|UIq_ClxPFFiVM$^l7Yc>S)hk`s zBWp`6^eqRNdwF@m4-IhGOB}Z5wzd<$?$3;mPyYIK-%2+}3$Lmr<|%*jICo9AuR-nP z#sRRoVunkP(~1>`ijEGG_gV$&uEoYzwww887^AvL?1p~d>Q~0f6-mRcYCN7Sr$Q}J z^3=H8^*j!RSu;=+H`mX!p2U%_n8kQazYryf>$bON+=#&}rD)ty`))O}Ubq{$p5EMb1(W+*mN?##n9b!BDY z$$B5sKW1jKfw}dlU!3GsOeMP9R69TYBy(Et3U*AE!>t>MPDnRur+lX5wqs)m5=;;z zOsHtDX1H{i)W+-B0MgHM90KofnI?b~%@b{HBa7lF+tja2>l+)krAxjByS-5;f%J*>0wdjny=4PF1}!n;QYdp?(~ zjbhfIq#3A8a7DWgLAqQft*TN%#BigTI!R>6Q%G8mLFujAkJJ#>TpHe9n)nrqF39pb zdK^0uvyNHLVN!}JlFbY|rx5;X?(wxTCmo%wFk@Ebz!3WDSO0Ny`@$tXH}>eD_@{K6 z=AQv3U!LWQrr^Hy_KHm2lI(p|$S#`xSGBgX@&oXhg;%ru0+RS0xBC59o}cUYvs>xO zm)@8RPMQMQNR&A!1~#UiBiogCnn+bpU!R8>cq12kx>@MmzWoh?UmHW-&>&2jiE5~+ zF|K|5@BzG1TgS~P{_C3|_q}DNec_8O+7>FHpG-xw&_CMxy})^cN@ zM}=8ySZsqwETjmVb3$R^1qX?rmY>Y~XV;frBsmF%=f5#%P#yr561o73cqQts#YWm_nlV51KW9jgKP>Eu)Legaw@Ee2rOLo3-^EcLw3dR}M{OWtJDDnHjG8 z_cf1LMeWXgl8~@ezTDhVkUQgfzx-iwC0^6rqtm3X=c?z)Po@pyh7R`@{xG-c4J=Gc zO+A<`;!SwGSd{g^I#cHDAPNZ-212(HnfNLD5yK{iH z)~TrpCj~=Jj)&-^bI$)OCMM=FnWf}jy!6MT9_KD@hhhL?!<)k+BMI$2J$jXmCILne$S2`96&yGc`T+bOpeflJn*bX&5H`nP(n*f@8`fwcc*+yVxHNh?l zwi(#P|E>NQ=MC@MuBi9o(^X|Ou&f+`+Qwl#3+QInFA8q*o`zWOmI z$G8RG(%mgIc}qlKDc0kUl*76aJ~(56V1V8T6L!AL80`BhDhlnEr%Ok4w5@lYGcVJ&T+}S znQv@K$CmeiNP14rf=Ay*`))ryy{K}#Y3xRuLbn$X)Tk)-u_+&XO(x{MY5m(bb9p3Y z?>|I{fe1H*(oh_;`Z~t%>VSV^hkqUi=F-)>Drc z#XT{k#l#3-&sSgx01S5>9Z3Rx928sY*?ZTnskxUzLCLk8pu^MuLP@R-#g^Z$sM3G% zMMFJJ`@v99)$yZ86Ywp(&lO6z@_U>sE1s;-uYIZu#VzH;=)LJxjJ&)C0eC>91%c}O zLgCu^`T2Uzoud_u&c>CD=#p6gRxOKC`{8*ALJ8(Cz=rV>GyY@Nsx1hP7*PYo%7e<^ zcU^B(5G6X32ojHY)%2uDF(k;nsUjx^4FjU>*c4Qt!lEMQ+1Lan^uX$%5)?%Vm981@ zm25-+7F-Sy6Lgu@VwAKq6K}8^jUtyqB*d)MUsFw-4tvRZ=I~Pp&)K{#8`tH|#AZf_ zbo{Yn#~8h15e^H)`L?aCZNc=!1c+)rpt_+i#Y`Kq8ys&VBG@?E+B1r#i#VkTvlWXn ziekg{rOV+VYiFS4tcmnu+)`V1>vB7egzhi)s`!KRhLp_5G+xqBZ~)l9513L`y3IhU z7MB5rh*HV-okTt7L|<~)D4iirph<&F%iRvzXAWyYVgp_ZN=nXG8`sv>MnpuY2%=ZZ zMJw@@m#XR&(c=xG2DpiIooV3wjg5_vDE@p!gzP%$e8;i6q+*xu2Ma)g!`IZ;p@O?$ zk}H*F-e`~(CNge1p@pe)0XX-8rwd5s4PHRwI8S-z0dUW6^x-6l2{N1;9q5Et`{`bh{QnFWTZo%IaP+wiSCr69 zw1n^sc2BhhpCL9p_RApYO!$pTNFftVzr7Jw&>2{`^~UCp-jw zrCD7hdi@upcmILVgRZY2`4$>C25_W_P?fIe=;)O6^<`VkMoa6c(bD*v{;F3T*vae} z>}-YLm^B8|7dWG~YBpRuoHUh#mtKlT5oIj&bWaoyhg|Fb@bTm744IUJCe691j`nj6 zb@h=Ffo#pbSYCAWv&~B5jrOj%$+u=|Zr=I&f@%x#3CJSDN?#>tYBzvSQo#K(t|@5Y zVY|M^*mn(slCgw7U(AQ5Uwp-r#}8&`=iV*z@aQm-#YcPH$h<}xv6ViCeVQ2KEt$)J z26vH$?UdEkrHv|vLP8Q|<8pEY7f$vYyhnM@WgGG!@(oQK%TaX-__l(>e8FQ#eb=sC zqa77%uv)eaq*bUvKp`BU(LID7+0~rw>;7!VqdxyVLqDjOPuCUy;o1tr+b|#wAfhKA z$t}y)e&jBpN*8rq*}wg{TEWCe9OA+;TXh5CulgI5@UVKdqtL%5Cq37OM+FBD1j!A3 zYLRvyi|?zcVHq%4KmGFUrFYy}-ozq^%8P{Hm#D{_q~TBu=EtW!`wx&;41T&eIWc(W z%~}&1`aCZ(H(p4Le9)>~WfJY^_zAcC<0fcZcX8}(W#zR7Tm2={3MWT8UUFfuu&{8f zAH?1INCbHz1LJincWT;X$}Cep{|b2{-@WB#Ly2*TSE6J9}D#O zYxEG9da{p9{2?Fg%;L%I$;Bu!`D+G49+l-JmfJDQ27wsy?Pcs6vw$aBAx6jNZP_p4CDOlmNz!{dd|lPI0-{12^L}QxqOPHx@Q4 z)#=pUqdM{ORNzToib$ihmEv>ag$c~#R;_~q-CY1_5KZ9CG ztnYuyo>0Agn}6t*wRMk{84)qS1Z2dBI<|0XGSZpVv2UT0fT!hWF9&zR#(TJ?ddyv41tvt^)$^~3pdr4_3Z3tfUsUG zQkki#k{zBsJv|vE^A+3~k_NYLYwAcCf$~rL`0<2fTYEbb_RAaYJ|JcolCPibrvy{N zZn_do^_?rL9KJE>;MwF9OH0d%hdhhR%hF_m0UPUhWx)Avb+zx)MH9%L8x8*Eij}FQ zc7wDG0~YN2kdTqtSm5I~R@X9;lMiakH%H##x%H(vK$=bGQ3v zNKd0sy9`s4lakg3&i1j}bu={vT@<+I%(6EoE*<<*K63wtHr8|PoaxsWY@u5BIzH!u zis0hnqW<*gx9w*9RNe}C6IQK!i;Ig}oO~5RS^tTOit3a!(@-%sHWsPO(o7YS*nx;$ z&$q`SkwG93#-ZcwP?~=HSZ}_GiZ4PwQo=iP{NQg9r=vevd{4IWMTQ0OUt0@=M?~48 znpC;f*k20UYu(vuZ-ku2TNUaZot+b!=_~bRyu7@ww1vOQ4&wonHz>->%bz(+Re{d# zw8@ZN{IB-Evaqo5jhdX9v9+|UOK3f$FCi}eFxBZ?nqIMUM~&Q>!~S1tDX;e}_2tyq z`d#LuZEO0hTu=5oRBH;%_|rY!69=~&0bXpVB(>Ax@m&g6zynYR@X7J$U<2$(Zd{o5t%lYS@1&@!9gT<$&tl>|MA_RY6 zu50u7_Y}XVdI$i-W+1WtM-8&r?E`crp`e`Vg0oqs$H!~4TfhDI@dFU!ULug?3t-BJ z4<9y9e!iOp{A23}%m;RK`;u{Y!2@CWPWr0BIUZw%si~3R~A_khrTxvTY+ zb^n0_ThlNZevc+WN#vhP(=D{`=)W(d9iD4P zJ@9q?HB&$B#Zh`ftZ8z!rUk$s>QrPTIc8>N7_)=r&a{CMbu~3L)z#HiR0Jk-3kohD ze!8`Vugq?{>$^l`t~9UC4f;{ylwviC&tGo){8jdt@MBthN^ldm4>(w#I{ftYITNwI zj*fz-f6D-TLUk#)Z(*@N8vwUG^3&Zf&#XpLl9MZ3F26B8@0AZB*_yVP`|;z}4M{%i zPj(#W`FK0(b;CUm509J919PsKVr^$l#7?}pF6clX=D*tyV2(Bf{%2#`dlsHwx+d@B znAx$zSh1VF_Ek1uAE+r|L(55yu80Gr{tHGmMRsm z$2Mv5sBbw+7=_vzn9qxr?G_AgQWAqfqO+?@!YcNp6L@NB%hdozEPMb)3alb+hiYqT zw$P}f=GV4~GOdS4M%2%k2u3zu`aC$7kdUxD%Xc<&m>qz5D^w#I?0AlIH)KB5lzH&r z!PY1aUfIS%ALTe6^V-)JDixhwT=MTBH)`eQi&kq(ntxALqYR^5&$s!-KEEyFUgypj zrgeb-96*M~W@d}LtNzyAEjc8Nr1#A;huM$;@bKJv!n}8pb*~27Gk^cnL2_F?aE{x~ zm9m!^m(434|3UGzwfMKd&IiB1$=Pi|pG+IVsR(tW&)WFAFVujoZl@(|x3G)M&Bc`{ zNg2jLfQNjmZXXNe6Y+sjcG+T(=nn?JzOm6Y%{Y0~+i`2;GCMr!!}~fW#sH$!PLjj6 zMiD|aFgHCt-8at47b+vv(4XR!KkZ~7TDI&ixbw$TCqslD416}?I`Z@?C07=HPW;rA zxqRXtZ}cbo;aVduKqucx0eVG|$6Yk2F?_xw5PX`>vc5nZ+1=FCl>O(PAAs+Y)!Ir* zN=TW96v?R$v=O2|FZ_7_{{8>k@|*mQ&0AkHE8^w`s~9CZAwk1i!4CyZ{O@|c_4Kgs z?8V-rEPKzeHFNcg&?@wfX*|lRCgfCzklXx_k)MQwgde5X5L!U~{*sWAl6rxl;oYoP zuU_5pKgn)V-R-+)Y@xfmd+X=iJA!l9o?~aex378Vksm(YSHAZ6EI);n3~sHhy)2lrEnfKS$~9R_E1Iu#@*uM)B_7q>g! zxBhRL5jVi3d2_a4U-koiT|l_NKsj~%f3*b`U61v4KZ5+I?%elv+P;A6r~Asc_tAVU z(Nuw#i&V0+vxkZK)~m>v7C@miJ7TbJX=O!}D@`-&ZU<7Z9Q}=||CU*gqk(N6)6TJu zZc;2GE;d$Hq*Mz$?rLjmYc+Cb52$*CuoSHv(~g?^LgIfl+*VO}bx`OYhc8t3|NVdb zN1t}iydw*X#fF50IEJ1SY~y#0k~{No@^SD)uy54!tEaLwt^N)-DiiOq{O>w(b+bG4 z<)YuVt(12|QBl#Y8I-m!`}D70a{0^^*NT1wy1mtY9DK!jePcr>n1XWf4}0TSn!6yb zX0St-Qu_ z-2dvS%^yEES>Lf6CRQ0r>kU?C;t~>+!Y<0iYk>9a=-1>CDQM&$5@B5mPN)3F z3XSEa-R`g}^T_remFC@e+{xTkq-~8l| z;lxhw@IM9u5hXNv4`8lNLZt1!9OL84E6(Dt#wRBHqE0}>n}(mvX@mg0O*8229jU&n z<07Rn0_p-M$;~yn&JrH%`&<}^&0i7_i45`-@ZTNg`{E1h-7L+`78BWibD zkNpr=R8(Zd1(-v3l|^8JK5VrAUSL#jZ*M{zwF1E3vZaVTuGr*B{}=y!veN!a%F6=+ ze)UvSYwPQm0{2W=_kLyt!uN1;acL<&+G1^fxbk4=>(_Cy^p89k#-6B9aHecIaYr2~ zYdi%wyj73^L6PibLlP(VoQYr{SqjX!OHvjgH=thw4HS*%VKF)xu7Cm1D9&H_+ z4Zx}jEsy-U!N3g33TfP5mvN$AY$^?PM;cj{CD-#S$V+A-o+u2i^7g) zzPGoV2}Zix*7aWct20nPG&GcniOFwM6qPaW9Q&@=y5p}|wO=(m`JT*wdi7Mb_G*2S zEE3W!!4N4);9ORQG03dVY`D(-e@36u9Pex8+tt-2+H?QD;ziJ{84%WxYw!1sWJTU+HsgMC8N-g%w>CE?H{RiQw?R z9y@lb(&tvCj}x^f^B>-62cLft#q#3O1=R#Acl#Cq=xdT3`0Um|pwMR-B*bjG3wB@g zou8jC5A&VnXI;u^q1Yo~m1AprPgw#aGEc*wdwC`QKyMDOV~v)y^e2Plc(k(bDI;RnNdHTx z>^SmIW$N;wtQ2{}e*0dBX2$#2*wfXDvMOF)#LQqdz?QO3;n>=(E6kq`TSRB~NL z24$pO;ySm7QF8X13?pzi#3yAQC%0mek_@dS@=2aDms##{MI+2zA>dkU6V#{d{@0C~>Fp$-$9jzKs|s3X$vn&PU*oM z+p}wyd^NUd9I_OguX@tA{=AIEpZYBmw^uRbM?3%!O8_Ltj~)e$7k`%_UY@PXH<%KA zvm8(Ftu<^hDj#`Ym=$4seNL%37LA6&@CjjbC>aYX|!Am2^KYRoFizO8rVK%14zf%Vz)ngV}(y_>Zel*-$ClX5J+C;xunIFD|@Y^PZadv_}O zr_Uasm%?U^kx!3sArm%biswN0oK*-DFlh;Xdi4V+g$NZHL~TYzM@N6%gfrC{W-?a;A&P-4aiAUR1~j#(k+?f*1&1uxcv8a0@aGPwlnK-3IPZfbX2QwH8fP<)pWvT!j+v$S2n0G6ihN~rOh>cEpe43K}PUu zW*W{7d;#0;nT7%4-(E6qOV#Rk0%1=H!bd_PA_?~NY$8_o-SZda!P)#DDrUZ0r8WlY z-+@1BYLxWIoT3R+yay{*?Jbg2>(S$t=??*;P zkgW=FZ(hHK#$I#9A0M;U-a^nFWXrfdSuN!_k7lM_e}!3$m-8%l^qV(tI0--LkR<3Z z@&lPiF|(BcU?MW-C6C;Eea%6|BB;nW|6!22o?g@qK}fMD?XwcslCBlCA38|U)R}+M zHkftHu1{p3wgMBoKK`>9;3DVMLFv_>TcX5A8O0I6cwRVeg8n^_#-)jNztR3v%wiM} zDoIXG1{Hqlf|{A!nZv{KCMG6H!JCjxo2BDVE?sQCdEiyA`$Sr~3m5PL%eK_c95YV4 zvfUJOOMHOp2u5LG6A>yku68mrGvohoB$I6go$={5ee&>@ZY7ErY zxN`?^iqhdG+EgGjue*mwD1b5;{+j=BVG)so939{R)5b_K00wvs#q61D;R12b=##G5 z*w{dXC;td6+Iu?r-Me?5=fmQC!^6WV&91zp+F_Oh^lyOFatC2;flL@hGp;#IA>SuY z)yjE^CanU~p*)sX3bG0z*ZwDSTvt?9Zh|h4h=U@ey!^Qkwb1@7ZR+VM zb)6enTNp({y3DzHmi2(|##$2bkzx*z>fgU_-m3NdMt^=DNY1#7q-!7|`Rze`i$Oc(3;7062;{m}+Tl9{ZJeJgZ|A z7UuhDch}WZe?E@{l6x=8sLTlXJ!SB;2E7~|9VMZ23!`|

`%RQa&2+c=Y(kSZL7+ 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बz?n(nNH!xWc(h@@?n;WcLu$ZYHF7C}zMS*7 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%0Djo&b8)cRhWVs=l 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

R64hH^uHHTgs6iHcMmv;Ze4?@4D$1 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

~8Or?tWFl(Q#*A0vvpKU{a`}n}8)y<(C#lOnG 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

DJ;XceL^6> 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 *Np1Dm5$T1ddYw(D5xMs_VNd9uf6bp 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�XZ*I{h{W<(>Mr;+zB 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≈=0 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 z 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

qpE+K)JL!JWMyp{>pn>3~!Bf(r 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ð z>olo6v#8Tls5)l}T3a5YUgFpof;An;f9U1lz-uO~$owDw!fUMfM!g5Q0pkr7ZhrwK zZqx3ob@RfzbLuWO80DCVJ~lC58jZ~L*||~&&N_YGjde4r4?nV}Di*Ot&U@pd-(nr- zg)3D;SC>kG6hobb-3|umy?yZ18tFFMdud?T&%I~b6(3nx)q6~~Sh zz<+iwi`x7Zo9!d7I=J+{3pbB|VoXt1cksdf)t_I+qliIOdjppq3QBP;uFDDNmQFxYLtl;j-)QhFqC`>vFy+Cov1J z)?XUvSYbOolTY1%?Uk=36s@ZJ^NdGq2bi?Ie5hLSV`TKmjh1a#3m)%LPqO;yW?Es} z#XqC9nE7GW9rp2XGOt-XaL!d^e?Xh9rOMu)93 z(W;Hw&vz2bwI#KF-E}cb^X?IiYU_I6?e@Vm;r@6HYUv(|yogvLDXK)l#` z#((y)eN2?u{+*{OxI-@nW2&#u)~;08u;Y_`+L zE|F#nV|XrDq?NaH9BTQyJ}7LbF@{~-YVy&dPVaHjgVdc7{QISW5$_g{=5hRP0Oq&4 z;FuWNH2vmC9I`&{D%`P}EgjBrPPhpHgv?|64YD{1lVldPrdWAop)bJIZqcGEb!x09 zQef?ka>0IYmNsYku1W7*|3o+7qRq8{k#LI`X^uIICia3F(rVj{Av-sVZgdsmj%Cl% zXRMybP4m!40&GSr2~)!uzt9>Tn9Mb~c5aj)hNEMtdOa7BeCz3(08 zQ|hV%ps=Mm%SsD(Eqd!kEdF+@qTB5*h<&TeC3~Hn-E{Vc9B1ijPo{r>ou_HV$1|6m zSEINTQWmHmx=_iNo}nSrA2{3XV*x-U;?KUdfI zpok9|<%SX@J1Vfc?Uv>sBW`Q`H4GV97w2nU`94$tqjl_hp7Y#bc^65SNE3qbngPnNL?M7$~u`v%hggzAavYurF3}ynOYI7cIY; zRRbd(BpGE)1fQu^uR_IoV_Lu^eRHw!Uuyx(hi6hhYU$;H zsTeBWO09Y_vg{$c_N@bi0`nNQJ3Xp8b}HXgjr|pf>R(cs;l`q%D{f=tlAx7I)!tBv9e|i)Uv`bAHjh{h&9=39@!X-^pk=Ei zMiJ;{)rhdM)n9I2UStUgM9ka`<^{Fa=%$qY!~oI=?9s-WG_9ACGSK084dz>tvU$l; zOO!e8Z~MGL!x!jdelUk8vW$JM30sCt6ZK z>)F~apB7uqBBjen#u{n5S=I->ciXMz)NhHV;ag&n`Mo4S(}`_yb!%Caq15ClFS2%M zvydOfZ|)sKExPadu`xSa6*tM`_JNBLUo?X&g+c>!OgZxsM4Yg&K41j9TK<`q_{?;* zXV2C*;@sRo0k6#r})xc-+uE;_TG7=nrDQZ7inxNnFCSF%n})$ z8D#z#>NcYS7Y6h36lROHqQ6eecEyjsd?iBPRUFI?P(i8ylSwKmz1Z{!Zt0pIEkEcK zz3(JFFFNoN;`@=7nP;ILL4Pw$DYx4P6NJkr(W`p zpp?NFxeof!3)`Yy5BJGLR)4%b?=Vp(&JRKZ3}}t)BU#zjh9X=>i5RU0a(n(Gsk|z; z0p#QsRe!F2{sWcnrvSe|K)(lR;I+bdtu|-dbek?L4VST+oVhGgh_8QttvN~`v@fz4 zIySSbV3lUj6vp3!LFH)I<%0p^H4N$lP)=9PBN2|I;s%*yE5#sIs1N< zBhPFoL%n2MzmR5``V9Tjsz&;YA|6rEc-^M%7-7^M zTpGd1C{ZnBqFG>QExFKbzT?9hkg13)yLP21ne}Ben+UB86!1GgZshD*=D8fUfkC6$ zu>T-1PHT=%QAktl_|jZ;Fp@sNTj%meRl`8ODM=JgMTMO_%%dC}i)X7}GOja8%&z0f zN&rb{SXhQij?v+MPl35x+5;b-s?$u1?s4<4U&Ny$3-mQ``I)othhEM$Q=LSPc^@4C z_K6JCO)R#b3hhHqp2>;+eP^4$V(;)@v9frD4isS_&bCTLmMR#iU(~B3H-(RrluUhI zz90E;YhP)n6?+i&wMzH}Lj`W@dDcF1Ofo@;`Cn(wTaM2CzpKv$a)6 zZ=jqlqYe*tGSqhVb6Rob2?^I}jJnZ#hdXY9kJSHXl&6P36ONFpD7L(g5iY>**5TFH zoE;ta?~@(cHHD?WqWI+;kgu%_cj})uTijofkzsQy0x(>PV<%|Lsz7}<7>!#6T zN9VvBoMe{r{@20&japg-GP(WT!ZOFD-&Na51TXEgdda7+QU}4`#&lmci z%e1a%fwL4s26`nAS7Pv7+W5dh#nXFvzfD1;xMKl$ePoys;p9 zT?aY+%+_>9LFsl)e`d=6$IqC4(^uio5Mh9yx&H3}y&=3iB+rzMwn+U&r^r{K`_Gpi z!YET^{vDgM(u9{DTy<1FvHZ_3j2``hWEdq2)4x994j17)l2ld|MS=6o|L^M-ehu08 z9{hWXuah0UBoVCp#{Pf4Pq<9%V?TWV?Y|$ef$*mHqm$WahJSzTpGR+(c(AeZMo|1e zZs-e_gGESO1_~_;Feac-eYFn6GvC0*$hwJO>5B)FoWolOc z_s1#+pRHo*EV;U6=4R3Nbn-swZ2#^wyLUXe0+Qr z`~I55jqtO0pNoQ4IvN@pBjql}PM`l9B8xG?N=t*mOiK(olT0*^Vf(9-XOT@_ad~)p z2-@A(rxYr_u(5V2y`eBJc^F}i_i?o^dVQKqCRRjHT-*)mE->tb#~rqYHZ?ZVz$0sD z40kD^=>GdCUmcWK$LPk8hx)O-G;p?&T{ZXS7>adnZVox5*3i(<($Z32|GP|26X)XF zZ1g9-7#iRJtW1bjy1~x!&_rE8YilbiTSv0$DTrd2l3IVdfpV9FpMRfacQ3sAk|1_F zHKjnz{=w0Eo|#6&u?~9!Ri7nnJ3jHFkV_(|UJ*8Q#!LtD+56pW+CD!Zz7J!#?|H7F zxtT=V%f^BaO3F`Ow1&ofW4am4&@)$892ie>&*GPJK}sB~tUrsz9e=I<%+afWk4_Oz z$ehfvS?Io5p=!BP51Ls=Uw;PXh=vC_UR>FCqe&{y!jZY#9#gih3V+grm^|O4?@zaK zuxnt;Tbi1XREdA+_p_FbMD8jwFe2pj6OvjAK#@L<7RdVeaTH?vO zSPXyqSr8JE>n8{YF+}>Zb&-p`&Yn3F#)*o()tM|8KUVEEGdX$gl0c@}P;uqn)h4NS zAs=`WMn*=YdtPg6oRG~t{Lq9K7Z=w<-;3|V!}JH!hdADchtykzfQV7Di>sVYE zK6w@j=N-}uq{@RB3Wrq@{pg}mdqM+Ln3c8l>2ntY!)%Y?9ITc~R6XM2*%qSGNH5@~ zo~S4WRSHUFotiqpkTTotu8sl1OwY`;M)IZs1z!?+Ir~F;ii?|D!jC32JiG@g{$I7! z;!D`Bx7M1d^^A-Zl~=<-KH?mZmz5S_>}N&24w1d{xx-M_7i^mwE^^~r%zY+7cflc zc+H2MC+puA6%|2(WyE}2d#a+yQF!))mS2JGQorRy?Hl|9^Zs0B&18Tb2L}g8KBN9z z!=F!RV-4~XM)hC}=@)QG%vr!yK9KT}-AM%9eTsY9Yj6QR>%Pfb!5C7zF#j2Jt-Ks4Ml=t5-0NbhQEw&18sD z8!ioLWy?VT#}|J{!Xq=Yv&RVAnL*`EHUyJh7P%-M5*sT9DFY<|_?DQ+*hF`9k39p@ zkg_jFUt+8atk`8c8OWG}?ImGIX{h8p^AX$(O4WMOLIs3z!iE3V{~ZOe7F>;(^0iu8 z;``u9yw}r29XEeZ6$JH{qa%}5%gVvQ!N&F-3I-CYEnZ^6E0V`BC^$GcJY31o_V1&Q zeL9uc9iDu2~6i~W`A7aGq(Ev<@xp~F--_xu zOiW4A;T(5K7@8Ud6^39G$bCmV@5^hRUpts_KFjq?pDe5{m7Z+6Qs54>1XgFV| zAqd6-QTF%*96bqN)6=%|oy^IaFeMVtn1NgN)~ELN_JGv@5uC7lKrlNCJ)95}C|D9& zzH>*zNshelMcN!E?glerJ^kI`aH}Ukn2DP^2QpMsSnsR*F$nfqnQ#Wyz@YKhXzOmQ zkdR7&*^rpa{yAzco!(4MNC{HlDr>?Xp;5+a+zB5lPDECTI9SzeIU=19qOItJZO<9q zf-EhTf09)j5*i90314oYYYui+0_al#A9{cP-qds!2=XU9AiZHAyna<_nsTbDs+KZf zYIu8Ia358Py2Dgxo>9!3!4za@T6eqIz4T^U4_s@A!%?n#fmTTGE@W7Q`>TwiS5e0x z;k>s|L*QGg4C?&ptgWpfLtW+)!%u|->rSyr?NJz)!c?_Ya9gyb#n!2prAuSeOmJXGT4RjGpHaDsAR9%zF! zudY~NE2NWnYpe?pi${d!wG#CbTSOMLw1A^uP*Fip>Mf#_?mRh1w4|$T>mlX^3nMnXaxbaw8Zg=gNE< zhV&=de}F)_z{Ykzx!I&l=ZC zYhG$OCC9UvYmN=nKL7dSLZ1vCw(pAHq|`|Fy_sgQP0r>|Ij~-6mJsYYNlsWhK6&4Mb=DDB6)NhLxxK1 zn0##)y4m^p?LY}pf${%p2&3b9l%+Th5~2y9{FY`_7`xhdYfq{|8ZaLq%9ym`e{`Jt z{1-IZWU4V#&K?n);G-yKcnp3pEWZ0o7z5G0UHI`gm48Cyw-}7SL#pVvM61Zl^MHQ$ zZmRPFEpwWLh6e%%bUANu0w{)%fGpr(NSxw8Iz3O48OqU@tuknh6$K&q(2vHZ?SaC+ zwMZxwO$dzg!EVnxcxI4EUKnj+PAx-2Lj<*;l-1m!9Dd$d9yH)dLOUH2C2Y40;)hk{ z_W@*|eHMff7y!UQMW6u&!QYW+^1MRd*5o_@1T>;T4beLLp&z!2m&-aC&!D7 zemLKB00H!42tg#*N=ZrSwZ^JHeR|8ZKi7lQ0En?lJYzr3edNI8S* zM*6SD#fjU@cUF6m)sgAy==dTpOmLb5(lu9`U4nRo&AARAZ|^Fl0}or<1eb&DzP>)FY+}?5Z{9H?2Eq|9 zd2zWPpj~Vr!`JQu1(4!tVxyv>f`dCC3Eiz9hJ^+PX^E0+4sbfZgIOm-Emu*M?SA_H z{X0O=)YKGm<=#;&3-46f)*?*X5+e+m2?~nNt_8VjeW{cNkyn9($b`Slhd2Vl#c=D( z$jQlRYK~b_aT;_cw|%_(8p3#*?DAlOWH9_WMEkoNUB?RVHgQ(GfGE1`Z+h=_0mA=v zfYF2Ei>8A3-SgfuL0Xl9t62a4)2$ZEARx>4=hNC+(xk)KB$fTSgF-{Q3P98x9*|wU zH9GFYNt#NASdSP;$x_fARH166_LeFtDpdwRHcp$f@70&rn>ZnJKAs{cNP0WqEPzfh z`xF;0To$lka7~tp5jx!8Y63t6-Mh{?5)}l1$idugt=SaDe&ppag`XV&=rAJw0Q4!Dat%B5X2A$~ zo|_veFjtK%_yg?41ffuZgsdj(eW|%WW9Ol`CcLV|^%0tdYX0{2Jd`+b;YS@6NroE7 zjC6pY!9q)fkaG>6S3QMnMr^+y4dcL3jYNL}`PBlC39#FdBuln1(K6SO)arihMAfn> z7}VGEvWPmKVXCKjuBuvWzcyZFrD<0(?g8e^qe9q|lrAzRCMF_+8oAq$u%z0MSXfw? zoSgjeBLmhM9$@!VZf-83i@`P0is}v6anO&d?j@o1xV=wD0OfmK!B%_>%w4|g7q}! zFcl!!SlQU3#odtifLUc`yVC~(uiS^hI!=WufgTNPC#>Z%n+z4_0fVehHh@{X$-yCW zvALz?vY^%E+w<2Zm4X$u!nV5k@)myUQ+4sIgZebNUmsUpg<}5 z2e{KktFe_xFdo1pfmX=yM(-j048Of22h`5hs`2*tw2EneeTt;9xtUJrr2+ik@gNQ7 zu)Ho^>gwSU#jw1G@3qQCy?uPno<%IO{`U{>Gs8@SZ#=QGvVuu>+*wvn3$s%{(m79* zo;}M(#APWmr>mLc(NOa@OOeS84W&dbAG{+a5t;X=gGikUorYeqI5V+w2r>M-BN#7Q1h?5f-G=oFHtDgQdB-xno^nY{n$lYa(+&(#HZ+gR1|xq~DxvLpszPjV~d? zW}zGGBZzV^bOqxckl$uQ#aoqpBfV*tzoNt0_VMT&<+#0^djv#e?dV(V9oPi zq^PseyxtVXd6}Bkp5Sq(W@ah~h72hM4GoRmtI;rTM+0QmT!o;Kx0Rh@0ek2H^@_rfXz83fE~;BYmJ2W>He`PhVeU3EZHX2nZ+g>Q;qhs# z+ADyA>L@r3OQV&qH)dJ`s*pttvE^tWXP8U?sQ%InD-5UDQ^j%7M12)Y%QZr$6XTwT zUPxD)(_*XtTJa$8!;xBHFR2haVycga160gIon@u4~$Z!7X^Er5!G;&H49^6n)i z6U6yiBSzz;T%Jnbdv2zt$f^Y8=l3Ng8$i@UjVH;*A#ZN%egd82PmmNCD6k6{!sdtj zq}+=am-zILkVslunzf~&zJ3`_q#1~uQNx#bRlxb9Px20l;BYVuKyAV|J3`i=NiBjw(;ptFzw zHg+Q}J8I@-lyt+^t)g~=mJ&osX&*n1rlAgvHjgWV*2^r%?Jt}#N?nck1E`qN-Jf5;p*H_7JA`x^M_N87|= z6WMROGAwF2{tZf#9kB?>K)g@`P{Aa$u1EVb7XEKc`#^a}jCEy-JFSjZPRNw3H?jh| zjbKm}pnMXNl1>L+s?zH~8ZdzBJ3X~>b+?wk{Cs}IaRF{%sNF?<@e+v2?CNxsISxA` z&Kdt`cOe_dHZ#)#DgrzhaXh#%8XkkEwzk`l=utd|e9Kodv z89*Ell5`FdA_Ud^{rfove>UUBK&^B^KJ(#d070|CLSEzU>*s8i2OS_A0EdcZKl>aN z^eDPNQ}aHBMhp-$=+*$?B$#1PUm%Y{nvNu`pbckH)H5a_^Ia>~jAfLu2p(PJRgAlB;S33sad!Z;8F6Y zjc>$&IOf*O1w{r4+zgZmiVSG~gupSF5QZ96ZV==wz%$t0HPF+N7w19U08Yxt`0E-I z=413RVy=-Dh^87_n#VuTDmmcrw^l~nM!)_8zkG&4I#!)oH-~r;44tu@958z zI0C_42BQm-aG@*hCz>hzfh!X=sed@u1yYFKP6kv{oR~{h%OV6@$aeAKopz`71}3D} zWU^UL#?W(F(Js)>L@ob_k{XDtAw zL;j=$4A19gC8w=<$~(Mrs;c{W7#DVNadDy2`P8&n=k*4p^RPwB_c(F4i ztYoPp4woy#$YceovoA-V>cWMV54W{}|0tPWE_9pL2VMb(wEg}RP#R$>3f{0Mg2R3s z$z#|U!c45TbaHC1D^r?gsiHqwE}p2xoy|D!T1}(nnuAb(SOfo%zL$_QSwcN*bSNJ4{>o7 z7GqU})jODh?c#+DV}Q-0OyYg0qSEJ0$vPdPmTMpf>}Qz-)5Fp4z^gMMm5Kp48v;~C z*zBc!H3`4S=8yZfHIt=+pmxJ6uu~AA2VPJ$j*xEEGP;nM<*%N^iIpWM8-V!%jF-BY z4qkRwSV&md3FZf(0B|1!Gi~%aC@4tT)n;Y5j5r=({lsa~@9+qq`>-rCZ($M`Y8sh; zZr}jvDW$81-s+5(2*?6-y)4>aVsW&a-1dcT!36R5n^t#yhkl|7Zuok6zprz-VnI z9>oKLq~kMD?iD#o^^g0Abw`$B!AR@3L<4Nn9j(QK@;X{&?7JQ)pKa2Yja)tKcyJe@ ziZqI#H7~vGepY9`GX?1{qZMW3tzg{`Qd>!0US3(b5GJ<0z1^b?MESYPBK8ns%>%Uw zS|ayUL@_aJfjk0L33gvP%_I(kxjjr=V&tng6At9haCL; z_7>^CgFSiFhVG6{4u}g-y>FiMf>_T`D_AbHp6|hoK*k%)baAK`cV?&yyLWOyZJefe zUafzBO;a5VCz9fTU8JM0&Y*%bnOwk5+oKwgRpJB{qU*hkAt+D|<~?_jA`#eDR_bz*=w$*=SHyRJ4@YEm+P_F99&U zEb53{_3lowh1^g*=0)#6{AvJZnkmki%X$5D;BVW@LkC5zF3X`x8t+KKp5wof%jQD4 zxO0=^%+9=2)XBsr56lGin%!UZXpe~EG;do3?P?JlhA}fak!dwCL?{T@DhQPMD7%F zp;#j`vt^hgE-tR)kGP-=?sg!+TiZvAXaq?IC50?J z0FQ%^O6zsiYb^2kGv&)W6kQ zaMkzX?eX^#ms61Q5%{>W1OI^RMtp_aGh)f>$L<9)u-}^v^w=C`RX=&shMn~lo3i3d zoAh2vwzs`QdG3!$=KMB~f1*0^mm~2X_m4~d-f(?zM!3g(<}#Bz!}Z5pm>GJ9=!IyX z-=0nj_3XV^Sr{|{Dr|zUhK9Z@ZHbLG(7O%z!_v~y!NEafOZ(hWqrhCro*)znG4a~g zR-%Cip9k9l`(NIa1y9x0V@ji;_$VnTZkqqqee3pZOFO%Ow{KT>c4oYP_R1zIEHW}O z;!B~VL~h}l&7P_6ngb13l1g$}q_@8Q5z(oX)YSQROtHILJ*d#?)zwucl#4=`)o&k1 zkn3|m7nM2fuz1-GJIr{|yY|LQkR8iCw`Z7gT~&9lWRF`N%JlN(%fm+b`S}R%dJ;}A z5%vGMo@TI9pFR9%g7POO9Z60Yt#HagSjg)f;uK;3v|NfZBb7`_6I6xe?3*QT=MoL3! z%eC>EaFnYcJNpyC+^np<)oL;c--}n=!xEmQK#GSE)>y4~S2bhgu3bY;8XP1KIn2Z$ zV?O16G-jgpv|BfIRMe=M6=y#|vD~a&!W51lq=$0jBwmX_F=u1rr) zBST%HASA>rXOV@9ynIMxBuh9~Yn(WSTgsJk>7q)v;(c#Q$Bcx8>&(o|f`WVCNrmns zTVP~l0lvPA0|l60qyHEIA#HG6xRIBdn%WfGQRZZ)q|^g3b+osCIoJMxX!qJ)!0cR7 zoZ|S1o}Qk0*;ZIZMFmm+7syO14f{`DzC08RNvsXmaBS!d`BP9;*3{J0)zvj4a{A;k znhO^$Sjmj1b>|r?!SuRsAN3#K^bbNQY@-+}&b)pQmPZ+=^+2tyvlHpW`|aB|Utiy8 zVPv~p;Of<@A|it=Ei%7`dQJ@j$d=C%g#iz~o;{5{hEY7#T_+UFzSFB;QSv8UJ`TOg(?@aTV`|bwwY^BL|O^!>(5M1E{;@G z>=FC>`wtHfmzS3V1>WZ3LXh0xfN)mn4k}rmMdkS9R?V-qfX7dsJSmfMg1H|8i~oK};KvrK6M6!R~HhNy*0di|_zZgkyk2 z1zS50-^i#a<89PZZ&p0fxpOf5docVMG)I%PzLwT_7`xibZrjPk=NdfM zu3eit*$Gve^|MMpx&-NVL-4={$z4#hTOLe#mJ%7Kt)s(Zzxp>ne*sdb)ZAb0dyyXh z%4=X`q?-BnT@w?ul>o>nM(MELzCPlQWr6r$AhtSj?CNVP13kU%`815Dr{|f`u++4) zfn3Aq{{6r~FCR|flQ}pzvT2qlCOUHTWsyY6Cme+%G9yt@?pmyHOvI*U<5~6;E(&C$ z`RSMybD6Ro!;`zQlm{_FHfM;5-@Sc%k=H2X{rg`{8HsXTz_EdD4+=#tJ?!c1e6bx3 zHovgA*q=_gySaHOf542KC_}=<<&e8oBseY(b4f^0kX<#mzOhk?Xvv?A3t6vN$2&}| z4m+(N$0Xhn%U-|339bs+WYX7P>B~vlOMd0``@!PJa2)N#14#viW-y zKc=+wh2SNy?ob2v#K$)q!4c);69? z;|41%EG(1w`N$`nV7K?$BjDC zfn)~+gus9OdPhU@SI^4*`-#t>Q116R*nkSo?(N53A}0@qT7}U!gbsrs%$B=uk%QeH zFb4^|4|XxM8l;gK*w^E?&SmHCLU!L^WMuXN^0fyw}$rIi&|<`zP^{hE&r!z zOS$!1C_v)ub%FS9iq!_>PQB5D&Sodd^_`rY1UkBFsHURA{-W?lU!MvH8nC!H>|R$_ zSL3Ioq?su5a!D+i=_{$k{%l=oTU%QhnHJz$n}>kp5&@T&78Vv}W_keB5QtIx=Llj# zqMw-!mx7vL7Zp8R?8^~~x1xIr^m^~!@#Dvp`%jsj$wv3Qpl4R+BNt?nHM1h(1gDuPjD_ZSEhT6U)EiDZcq`T1t*5G#{c4X(? zyy7sw9XSIM#3+4=^wLeD6Sm{u-XZ!LRPQs=rKKhDy-D&^F9S85Cod#(mmw{48ZsZk zd_v_qySPaB(de3(AiG{aR0-@g${EDn0D7C{0E5FFtO&*5xN!qn|AdI2Idiq*%-~BM z70h{N#Zjq{1^avV?t$ap+nBL==yi_zPikuF^XD~hbm@w=wzf*3zpwAP-+#}{ z%>30~+}$|Gd_)X18~9m*X5+RPy`!Y0RCI1(ad8k-__2?aDe|dQDCgUVl!Qe51|IXC zH}Q{r&_$T?eJN`J{g&v{m+kKmnFeEf!*jTFqq-rgK&u}zU1iWSdPaXAo}quy{?{K`R=$+BtMsjmltwt)$)%|uZjAzfv}n1buSGR@bmJ{ z`GT%$g@rzru&$?uy1wL_uHsdks zO#Xv+nEc$Jm5_?!h?5!rZQegm`BJc2eYlR1k&yGQh3utY4-(up1Z)?3L51_0ui;7}i7XUA2)2qHp!LWn zfWqB&$GoaNNyzUweL6BJ={GPGfHWHXdfzXK=YbnU8i!#O2$ZmTIx#U3WPM6X3KW&8 zn2^=vBgP6NeSIdPS&}6-Tv!Mk{X5aVPHU{FtjO9o2)W1p;Si>5 zI}&aAJ5kTatgJO;U34lO6>|Ui^A5Me1=K{XANidU>)9Vy7~6`W8m3oR=RjLy`rn?v z*4s=Aad#w~S^SC@gmFK6_Do93`-QKu7=&vzFfj1Pj~`}3#l%F8@7U6S7IHIzl2tOK zp_W@)l~UyU?`JCl{LxWU&rM8d>*@V!djC=VCMPH7&6_t_So#YswI4jF(QSRtC=V74 z3=ahOERmxm?!N1K1Cwsn{d{noBTg%#@EgZQ9lzDqBIjrQ{QMfnI#ZrciL=_$NjTXo z4;Bp$zEHUuo>Mt(?wp^O7us_kg+j^7wn70TV(i5ULMfbD`u2_-XbWZorse;z^%h`N zbzA@F5)}g#6$O-15s^kIX%rPD1W9QTkWC}fNW7w=qJpG?l$5mKCZtVDLg_{csZDp@ zG1tcPzxV%Kp7WgVJMU|(HRl+=7<0_AYUBW+Q~I^Qu^q>TB)8UO2j1GQ^E|CJ0j$`` zlVgC?W)32x?sFzNF{st93gRbj*8F29Z6w+0Cu2D@xL!&A-D5zm&qLgn#dsobwYO=a+ zo=r_vRaIrBsOM^a?K^l#KR-Wze`OgN8Bj4u-eurTd)~)6!9PGkC@CRTKlAgG&kkQm zU0+}D;A$8_ZI5uZj#G^A=-(hnY)z->{>sJ0MM!Mmu+cr0+85!+!NH-Y#N*%PuAw~8 zi~5C59KSW%>c@nVY8o3I7AJpK4W?#)qI8haokIOw`UUF9+^qTWmAuc(qr=uyva_?3 zqCItHzFyBXD3$_2;<>iGs|~SGuCDICj9%`qkCl~oaRl@Q7!H$6g8ZN)&)aJ!A}pHBPuG|*4Fm$;X@!nu{iw#hpFp# zot^W@jHH6ko~>UG2@6Y#kB?7Gg!ucg^p3mf^pZxm=x!ndWr!);x7|bju&Qt0zJ;y% z@#9B9ff$+H-ugXzHoLHpq_WvJ*-M*}md4G^tv;Qaq#Ru`CJJIF!vf?P{H+JD_G2OP zLSE~u@Jj~jD=W=^zP+TWsYy|$G>z5^4Cl zg09^HEk{SQ*rEyuZfELkDi2x#K3Z6e0CJ3h_jqH3Y)DuXFY4lUkKLlfUv`{?!6(x;}sTQvRHwrPRyoUkHgraEDZdTs8gM zWZjV~Bq%5-UEbP?ivQ!|;~5zlta2|-_EQq6QUC8)R{1{0b1{rnx4xn|t*miQi|vLo zER13fgxWWv?8;H<`@pWQ{`O_5QjNj(yec{f&oR*7U-5*XuOC_aZgs~W(5`)beITL8 zn7D@$|0JB#TUauXu0ldN`T6--S=Y^o;ErHnD*}#Fcz+_4qrH*ou!qE)8*O1fbqX=6 zSp`rzc&-yCKL4NMOWE_6egWIJZ-?*&fP&R37!!5wyyF|u4*nrMEp3~(Q$MQ5Ni7q! zwO`w#lVUk$*NYh8DloG9;A=BM_hZiEol77I8HKH0VS5a~T7!Zl+fR7QH~|YIqu;PL zskg~mvmL*0i&^V}Ck4#_%K7^Bm+}d}j*x!F$*HKQ5C}uys<&f4jl3Vy0F;E~d1b9Z zse=lUlq^n6yzE|4Q9%I21=VCf@(T&N&39>0%n-3@CnmptuhOjO&n)TIcGt?AyaK>Wu=#I_Z#9XjWIkt9Hsf{)@{VK<k0g7tO91e0W67G7e&+uMeq7_zUZ=;cQ0;8W|Y@Yy%H8Gd+Fu=uwBuq_MI4_wPeK zT=r+?!RU*eLQ#Sfx6<($1hW+Yy57G}5gFOf!_B?Awg#TGtFu#4QE~Hr6Q=h9MEJ+M zW-r^vy9y(Mt3I*3j)?FF(b?3bks-1Vm2}_Ll#bGrX;^`Y1~36Bm~DOg_B_accURY4 zSo&#U;rZtx-Sxp6pu(k=GJmzU-oWZrL7KmQ&A~MYyKJ%EYdFze93rVRAko|y{MQJS zLLvDhygbR7nRPWaN>{JGGz=N>%LR(%TGC)=XHR*L5pyEAxi~aqB9l{6fKi_M`}ce> z^RHD2Uz z#Hw%K@bECC2#Hi9eF8Q`3cue**lLo_CM_+^#>OTtUg#>?{Qdi>W56hB;7fGYdAYQ zYfB%-_Ec7daP@euSSO&%s0f`5OFb#dcvLktg&`y0-zbR^^YS+OgOrzNhgmVb^Pr?) zJs~Y1U|=WT30T~^bryu6p<$1=w>Mb~dJE$hvAowUtgJdg@yN?pJ=)8Vf+TNxdivVh z8W>a)9!*}YUD%?4wOF?18erGiNX9Zt8a3PE&ur zfexfi230YU{kP(NGNfprAsdmBKJA+yo!3H_vwWd#Pl-Y(_wdg+U(8Mc>~-FEioLFBB3@kHj1O$Lc^ z?%!h#WDBwu{3d8)u{dDb;MD7o%|M`ui4XEIy=dWZv>o)}$ltw2ny|WB4QWCqF^9>8 z1%Dv%1e@-G%`_*nXJ0FT2ZddMumcQkYH1OXmeaiAOU;t;K+DwU(uJ}BAot?gUkYH_ zt9}O@mz7!>6R@~uTNM55I_!ge4aG~3MySJqpz->eX*XZEV(o&7#)~*Bv zI$K*?kcF_tZ0<^}zXwtR&{rMrVJ4je?miqIIAhEz= zi-?GTj>dKVVl+T0dz8y9pouCYJG)5++oDgjHQt__`0cszWVNK=FE3f;c=hsC3)2<#tXM~ooDU!IWCcamBeJTOU}YN0gIQF$)Ih; zM06u65Run+f=>C<*QchY1}-sY<@vK`dU|>gDS*f>Ynvh}#upxK9^~)4T-cfr`KDDy z0f7(b$P83QAsV7~BVz^LAnt=%oz#4*@s53rD*KWYUr%@5tpfv-mYqEf;MAUF>}%f| zC+82;_&A2ijyXef{UppMZW4w3}N{#^VSk zytA_thu#yB3k~MrJ@N|+;Uy|9%#k|6^gdMvv9oy0{>;ukJAh8nTqZy5*p3ymbGbp_ z$g8Rb+MnifLq(~)ygba#7^tjYP*<}K5DH|10|J}@X+hWsFjNW(3aDzSKxRF*>=%J= z-nerD5;pw|Pi^U>VmnG(z6o`c_^JY@=&dQCrI^AtAxZ zIZ`V=acDCMbgt{`>!Uj8(nzeVFR%Lxy-#=5W+o?xKqh0}(lZ^lrIN4*fE?M@R#vMc zshO8AUIeLFj!p=F%CQJ>_*3jW1FT-UMzWqJpbpn~0SHvOK2ZHe3-*R+-Zy;H8M0rfAHWzX69~m{E6k=XTGg{HH%`A3S9M3 zIyyQQmP}Ww!bd(nvS5ZxOitSF*#sk8*^&|MweDK#xwg$acdYZ{-8zYxAE7+D z!LlG2sHIoyfBw9V5zYV`fVl(Ws_Bt3HaBkr7eGd)C@auwJorIGnUad3VKi)PVBm=s zH(rCHcLMFev*eP;?=QYoSiM%B1mbBKg?AvFu3UNS=hso_oLP%*h5$6(x^>HKVSKae z7F&G{sFRqO2w6`{M<>!#fAx$-<7sMYYG5LZILzj0X6gF!hdL>>_WAjF^bVkN;TdCj)i zgbrAO2X%JCGCz6pWME)GOcsFP@zbZfsj2gFb7?oe8>w)X~=7h2Gtmh;Dg%;8B)kmRMz#W*Wk5ZVk1m`oHi1Dw0%y;HuW{Ja zPhUQN*3;K_Wk2FA{5NzA-t6R2uuXW=K}%ls{;$W9qUx*3>irXGmyV}_4+=2Jv~|;or_N?31Pyv z-K#$Y>fT6u8Hn!Lx6c#g$AF?NM&JQ;m8z9lTUFJL8bchOq{aI)i8sUM^z@WMc%q%j zB!AwT$!WavHK1*1X!AW*KEN6lmS{*3Wo6~Nckgb&tTnmJ5Lo52!H&VsfnChAYI`eS z0{h3z%m8mekiLBQu#ic`{!O@|e+GgUM1fL-FtV9WGc^6bv_ZcIPo@L~(P&)9c;Z2J z0K0K=bF1$wE-voz+VJQ;zl&(he(lXGNOZg>V>8k1n~!5eURSyR`~nMG=I1bv$eQ|C z*|kPSMn+h&GDrORC;!STCdw`#`wdVkxB}KW(&+OKLqy~u_6ui|Yq@bYSIfDqe>B0W~HkB+bHf-4nNrrP!EXDpl3e*ID%nEY=C z^D6)A$6R9X}|ku0Rd+-8SVgz!=sNyl%zI;EH{HRSoQ{>+suih3$optiQQ zJ9kiXboPx5NfW?eAWSAE9`*;DiiBVZS=OJTWn^S@{rb<>0%qaS_3!|o2?4r57DA%$ z#0dI8%%GTtaK`XjpNU@Ryz7tMym`ymm=4c(#baOlfZHd(P*Y)Uy_3Jc$iHG|$3adG4H2}(^N7Sv zf#r=pSMv@m2CNJq>kQ5E!bIi+El61&ZtiVZrz)6aFt=$L8MGtbYvA!l`}$ZhdVbN@ zu!FUDx`QtBT%9UMM?l_E$*HMaoSaqU+Ozw-75stoq*1`%i3#ajUw0aWZ^bYif43&6 zCYz9if!cZF^z!Y_n-R_GqGByT%TQo@x|M!pGxr!qtWZH}SSuSF$GwsK{_R_3o3X5{ z&wRkchYz`nzJ2`)8P<%d7v!J33)a@8@6Q=RR!64#$|It0T3SMujEs+u4-cE8Dy@w4 zAv(Ic2$9T;jBB|(JUpNf`#{!Hfte~OSVo#X+td%&?8?$>!Cg#S)=+8i?%!JO9AsRj zW5F1LkIjBRJ~;TDvKru$8=pz>zM`@YwlnDePzkz}06(;}!a&Xj7$w$jBOf}qxZeK8 z@S5I((iBO1B47 zRKC#T)l*ZWgw-2^_ODX6G*G1*@v4~a{@T;i)6&vHJ`|G0t333(wLhWzG*_>R-W_~a z8=$v;*Up^~whZDqc4wOTORoOs=1JdeaI-B z=HsiYuI9qK<;6gh&d`9GA^rZ1N`8Zb%{V8!aq#kvH)$DaMBO6&j4S_@px~-@(tFSo z-i2CfF(!F{-;vK2f}2utjDfQqo=XD$%AhKPxu&yjkPduO=W^zy|&I-+x_& z&UCOT_;qHC)CurLLqh|51Ei25&=@Pb!`60Ua?)<82{jX9>pu)@ac5{ynUe$f3p+A9 zJBt_Cfh(n@OJBXB2X)oGSt#*laG3h@jYl{4(7!9lF-yBbLqmCadF4GrPSRs*3o~`n zNW;r_ba$_(W|m}s_&|f%iQ4Z*THXKxT{L)mKAqvcmlTZkniXC}uCA`2Ccs$&;nyhB z3laiK!>x7#^m^h5Oj3hi5QvwakuXn9wFKC@c{3($a5q*qw@8JH_&xun6(=Mmm4Ewo zn2v4~T@DgGd)EH*gI#MY3!Ar6;MbD!dV(iMK*f%Xjz&cH4h_9~poKaHEUKo(y>pG= zy?Q(rB7ZSUxJ)KRds?7sY;V;*#&eVYUaN6wX^Nr__VzmYcCk4*Ias~ZJ9SQ1!ytI{ zkPyd_#^gcv*^#DdT%LHrRy=6hf)Q|I?(LM2n0QK3Qu551ELhwn3A3+{55V>V4Kzw) zy_fa0kch`*S*!oYAFh5hAuN8TwVR#l>sjNo-2joVLX5 z<>cU~ROjO1v6gBF)&s%r<>lqtVr*n|9M!>OPzDfpfL(=!hiHfNs_BuHu*|Ni~s z$B*$c9QerR0r6$3q+i$rKnuZs>eTo0a$laaoAm^Og+(Bhyu6DeJj=Ao z-)#Z{ACLk3-6TFyq=v~b#H%Jpd95$)We`5?+uhwgQL>T&@ql?-Hq_ToPFM3K#mAra z&FgaNczekYFB%iIfuO*4!0LD8T3dRups;q`(LXW4S3O$vbq5HA7sz`MI?&)Rkb|M2 znnJP39B6*8FSdM)In(x7b2We^C+S)D5fu_0euCHFbIxhQY z=cX`>fBN)kXJ;pH9VlUdL?P)|P+QCvwY9Zl7q`VIrKYCBVjF-{x2HdPwBY6^3S(nq zaJRz|wk6uxCQp6|3ki9ExHbK$gc17s_g*KHoRLxN8{wg6Ria2LmzH|T$jBhW0*~&4 z2amA%M0fGkt5-QVIFhbK{yH+!Q|e`BXLsdFh4+@N+prk6VH54O#BLjl`Hk$fa(N4T zt!OmG@u-lH(D3juBn+%i!;z7eOhYi{U}=Y^Oca0kd%~rMsIZM)(I@8_+47s8_~OorwTTlg|=WKgDr+$XhhYe zOAqbo_wRpy^V5BhDLXOJC1c}05SIc?z~AA~H*IY*PwL3MV63EqP_FmF-+^HSMmO^N2hn6~=1}2>?1H zIXPL3?$5IP)AvL-9MY`tdy2R=)VL#S- zW?=Fmox!Vfciv*&5x)TtP!-N)GRFS2pQRriUv5s$VXQq81Q{$6WEASltC1^o82&Rl z%CLWb@5o4%W!x65UKbzcw4Rcjd=-q6ygVl_uZ@MpFJ^#is$IKwQB$*^(<-dfqJ1UX z;yoP~rpKynrEuj+fT82^j(v>uz$r{jN*~E{2V?e{TUm8}yqk2;pzDK~|Fu}Pv%u7n zZp4EIOaSPZ_x$MBCp1XbCaY~M9MxlGjoVH|`{3b2Fu1M&w9y{(+M*Mx`%s_bR5=SZ zJ--Y_NCHEUcv8oCto5e^m9e=w#Pbn&fq?;2Yik~0A}L%7&LSlZ07S=Ukk-%xJYQd5 z9}ut~mJVK$T?_{)yJ84OP~)JXk)G|cwXhf=k(g*`SWClSz1qz1p@i)0Y;wI2Xb^N0 zAUarawHgo&&63+OqBHuC#_UhIx~R3%qi^*_J%Nhv-Ma@G(Mm~4$+l!^usz2zL{{{t z4w3NE&(9C5&(Kg;H!(A_ZGCUl_x(8_s#u);IPg9*aOeL0GH(HBCC?+c9Xg<04}XS| zqGBf~Fg(_MedWMjmzI_yB*ccI!wlSpKWB+Aw=eoZhJ-6d8TTZoz6L2$3R^ul+ET4O z_3`ds;tK5a!6QdRZ930&A1BZIiecx~%YT2T@3QGk6G%H@>GN&(niQUEFkzIJG92sP zh^ph5?UpV1nSs@JvyJDYTZsW|MF-rST|IjLEV8MWX@X%3kxI25<}{?H}vI90BR*V zbt*9_iEE;_5q)?Z?310{B$)Z_khCiI)3UQ>8#47fF9S6youIOUB!@i&yphJMT?4t4h z{zIU`>FHY&6zIUW=}@5)4m+x`jy%3IXU>R%EOG2Z9w;Q&ojj%~?U?s{mo)0o~o*$!^d)A}KjJbmP>Gf3*N}cqNDx z*em$eC1ZCrCEaExL05tcbac!?=IdtbSpk7)_i@n>dA1JVLc@Dg-gyD@uiTlISRFYip~j zs@}Tw$F_7WvCG!RW*l<;z=7ka8+sSu_eID!9XW82Zf@S5XwPZ>6`Cv!cB@Ij_ zwa{hi&+5|5-Me=~WS6vOhm)e`NgY}k|4sI5ZvqnL0gNGA;+BSBS$*!`H_0i6h(%$x z2ZdS8Hw`TJj!u71Mu+!S|97v${ zHK6X;*jSoViu6+V@;8-k4jGKiO2Th%@G`*zs(((kD%p+I0Nam)&(>-OleP56kFVlC zEdL?8!$bJ_HrjLfswgox*K=cSL0?aA8|I^hpNPMH`7#UAa4;^r7QxoRgP&KmuTmK&rMNYkz&`^ zR{U9{rNqSAo0~VsKKI&JRab{hT7W2abab4d0q*+#>_}g-@Xa!83zq)|p3eOD=ZEqg zpFSCZ;N@1@TED}xIn8yZMkEA31Tb_PX44j@!D3ELZ26F#ZIZ0tP2JqoH2iEIv&1=m ze*V*^-=WiIAT)fGWtq|`Gdfs)r7KsiC@3@}&&`iCA&Uk%4yujaYTscFkXEN#9%Vg71}-08%xSc7fG?c%;7?op%}(9&3eI86ZBPof4`vD zm+PgTYZOiW5^~6S;mW*IP|lxOztqzM0=zPaJ!i$*%Idz44+P3(urjDa9V4N^?)5al z(l-j7tS?-+U}~D+R2mtn@8B@|U>D68iM08Z=ij0p%MMZPiAoU`78W3PAXVV61tk3a z`%|bmX7{|?W1$Nb&aAcBR{MjL#gMU(i5>$DioT3{_%MEOd4D^VqLR{fOi=B{jeIb` zv$GD7_Y2WfjhL7iZ*MH>83opxN#=#%B7J4BHdn5odQZ+u&5s}VJUrmpi;9c27q@yl z`Gaa7IvgS&5*b-+(^UX!8+L$ne2GKS=<_!1STjCyZJ>U<@=~C6NA3XL;kp45CrmO) zIa;b}FctJT_baT-@#nQH&=2!KYG*}6=&%^CYtd4W3S&Mys5yPX+xyY-0N)=3XA1k# zUgF{YNJm@ybu9rD+Exk*imh7*^yA4}+=Ab^S@Z)*0FXs<@E|w=@ccQx5TP`{Bu9@{ z-D1J$_dyoNL_-*Z)-Hu-H!go+z5qm2b!266st?`7`=?kxo(znLhzJYIgS@J?DM9T& zpg2HAl1N>66MnuY6)iXHUHY&2nHhJ$c$aEX%tKRGccoEH85}N`?^en^i$Kiy$#pMk zHu=@iAOiU{RDV1&_FAOa((*Fp_U#`F3nLKbVRm=}ZP}bT7_otF@?|qBI$i=b2nRmZ zbhElB3hd@hNNMjVG>a4d^Xu0ycwgcQgtN5K=LbVW1YC#Wi+@{4Sa`fOi&fd0+@?k= zC=`)79dHI)HHEcw>w7LD$k7Zo3j)3YRj0f?g9I)wO&w-nNM%H`Eg*sC=jSP~j8C6@ zc7$9U?JjnAe8kPeQ(RO88{XeS?lZL$#h*DRP~^A$VW6w5q9VP*QlL4&yO%Ftf_s2$ zki7&s(f**ly*)TMILESOygf&uu&1%Hv98V*?7xkTjf551DYOSbK!VqyrKQ!>(h|W% zP)A2cb#*F!ZN|azxs*$ZAuX7H^i}!1)vv6@lKX zj=EdU_j=I;Jsi4*I*h!+0$LpmV7;4d6%i9e#HqYrU;3$vd&gZfQ1lGQInin)Ve zh2M{kE2pQY0b+rWd319Hg@rAsUx$YmXqqi7)zu+EU>cq7M-hFJ((aM?@4lk=j>R??sxIMnrS~*1&R@{-?Al zu>S*7Ra7ML@x^r&6}$1ykAv*+;-5f!RaaMcpix@gun%ewT;xr-@x`1WE1R3;#r1B{F|r~5sBF6p_N?^FtWQnVc$)*sws z<8m#v5Z!$!T@Mcn3xn5$jH#9yHnFvxfZsYiEb26N13zmb9NAcIDTVL{QzA88!AgO( zXQQk3uLY7&0qNf2Z(kO#)jME8V{&sfyNhp|m{fG!h?KKSxE^?Q8mlPJ8iNtc-YzOz&>^RWjno!ghn#Xi3*)AGH8K-Y)yampYo? z=mLT8E+HXd^W?#(sj2DV!-t^TmzI_Qw`-L7MMRwK?Wa`>`(B8nG6Jl6ZM3wsfPk9l zy^-Xkaa3i*tb0If{{8V9l;2y%?_a-4tj#vyH=JyqapzaBv_bs5dBbQrV`dE+nrhFU zJ-c>&T$}HJ=%>UleLTv@&OR$8C3XC`(L{G~`x?1Z1F~v-d>rr8@J>Z1V5G{WnZE;) zpV4GqWY73)X)eghvMavgN8N7t8`yndI%jtbq%uEsXqm-iH!(c|LeB`REkpeH=AsdHU8raQ1zS^`C zIpEbn>Ejo(fDLxS>hIgY$Kh*s5^$DQn<;#~hXDWpw!3nxlL?jO+a7jtY(ynZaVTgJXiARgs zWh)=nc~Fd_Szq4RFc&pKGcK_B^`!TW@rEpfO%v4wa|5849mOb;jtE^ETyfk9?uwf zYx~WeXV0EBa3=|wdhJwGYXH^O(bHpy$yDbL z{Bga?>lcG<(E(c8Q&<^>nx&i5v_bx8?gKyd5zv1pWIVd3bTD1az3B>Q3Tiw$nEzb` zj;TRuC$rKB?5v`)pM@nlB!n%Ms$G^y9fm%e@dIy>H_i$DUM82B_bHljJkZgV4@oqD9bI;I0ZzI-wM z6@L{Lo!rua>bc&a89;3Setp!7QOi_!7;F7mQ&Xc`gSURqDgy7NX@77UYdzj!Z@xgv z>)E$+=Y9}L|9=;a6Dcqq1#|P{K!T)QuXk-gQH16^fl1)@o+p~%H<1wVc6tj?culFh z&;n^fO1y>vNOHFnQXLmMkWpZ0v|-yI+=wgie~;482)Iu7Z{C3dMZwG@?I|H3AOO$} zY{eOpva}0zq5~tril^zI?x$i65Q$%DlnJV7EcYh=TOFdsZU&5ujz)W}Fa2M)9x$Dj zm#lIi7(nVdFjLcx=-j(`^QMYQ!0I#dP23?7HF>>NYhsH2@b|TU%-AQqX}^AQn^8(<4Ri4n|43KUfw(-B#@1c9)gu7dQ+@I(KV- zv`@e<)1!W3kVL>m4?$_Ov9Tp2C85#zX74~ERxzia)Y*b9o!iPZd!eut%vE2xf3%?a!3FZY4B{nl-=Y?D5VDyz03BPvJy~ZjnpYukp4Ie}5$?kdWc(6f1wh zq&83J%Cn8GRry;R86v3z&RGfXY+uG_hFB}Y-=e42xjZ*Y%`EY*%NDQ@D3gf^VHqrS zDq8CNwC~?9oBC)jX}J4n0<`e)Wr7WKcXOM*OsazZg&@Xt^R5XKQ58w*ywWC&)U%^5eX-n4Gs>*k;i8cd@L+2 zH`W(QEmhN^?@d2JrB!Sdfc9sDvNVrb#RbW|s2gI5xGhE+U1}WrnW8vCY-?|)q@;ZG z;K4a@@tGIqSXnx<3YbTpWlIJS8Tj0pzjc-i;-CamDq`l>h7)_F8E}x4z5D-2Ov-)U%!4G6r={*gnAhtpk~7E3N&saKmQe8Uy6Vf6o=OY zxmKAAf=iCYLlER4s$!tg=fS@UM&5YusFZi_9s?=(`H4FW1vr(ar(3(YxHvcv4R6WFd1`MSXjKgHgI;4 z5x?~GFlM6%;z&(d5`^(PM#^p5isqVir)4!T?{0C}{9CtfSy))ieESbI9AB)#kF3aq z+uKaAvieb1=l}e9h~upg`GjGSGiP27{CB7Cd*$vkRJvfH5xn)DLLF39AzXcb{x}E| zNKL6NKn&mgS$fFDY52+b^pJ|qL|>JbZDxA97B7nH>gw|G@o7f}o66%I)`S-HwFCEg zE4FVIw{B$r_;tnl%Z%bq+#DQNJzs!*kTI+1 z?v^@v@}!{PEV;oN*Ebl!+IJrl1gz4PE2sJRT98oQ$iLI~_U&7jV+>e5EqcdJhbqeS zRL%7E0>@OR(&S`w8JV(R4z)Ltk>pZZKBKl@CpZN(vh7aRyt|_iB+2gEnzWP#TrBa2bXU>s0EZEY>+BT%q_7>7_J3`B%Z1whmXlgfh$ zJgMkX2o59llp&#^pm`GG<13C9*VY3m9|4v+c<>iqyDBrp^$u+wBpLh%5C$01Tnt?_ z!29_qwr&NP1*>Mw2q7(_Q22{7ok`4L=ia@MXHBc#8+{=&!Xvrvvvh|Ko8mKy(9!ME zE_88pdU|?lYHD(F2(LWQGrMM?F2BHAU|-R396Co*Iz&geP{oybn#3&W#;spKRF0Mc z8=eMhm=GTypO65dp$Og86gRo@y(}*FARgrtrNoHr=-;Lf z!akI)PAlBIchAu=$Eh?ft`GMA^XJblC-DZ8n>!&jgKM;?sHk#!-ld+oS%w+r9ALdn zk4~DrV^x#Y(a>T8gD91x8$I`CYI=Kb0wW}Y{aByN^s4mNYs<~b(k5#h4lL$*#|JZI zd3kvYixK2L9$oflP9OV;x1?+~U*=c#s|KghmVf^~`1h}fkdXN@04^+U`E!Q9fBu|+ z0C2_wKpR{qXgtU}1$lYmN_tw_30BsLg3%0o>IPmJiv(k7l1f7NZjGhUfQ;|Yrsn2= z>xY_B!(f$*z_5TrH@kg%HzZsA=cj&te`_L=icBwSrqS{lNI;Np!K|b8ya3bO?d|Q| z+(4E;oDXN{Wl!d9Il%(X^>e5WREQI*@__&dgk-g*RU%yo0(a0dI4rBwe*~)4RbY;$pwY7EJ z+qZyYb-Xf=H>hl8XIXio4OE;~x{l-Gq!G!})shw$^CtgJ%w!_$e}8@mX79%j#U+iu zQ!1A-4T|qI0iGzKQaa`}`%8h3?c~YRBsv2ZBk<(# zSfIn|O91>J5JAzTrKPpE>yVD$y?fWzcA~ys1)Lq;*MP0#t@vJDpuEu}d`RG8l7CiK zR#MVmfI5>;uPn}BWp+qG3_Veb5Jq3u5)k;1m36(ar>n~YRz6$(HtM9n#hS5MU6hit zGMY6Z@)2OEMwwpB;a%FL<)tO^Ksj$N)Gwlyb|aR!u~g@UMqk78qo&Apka5xH?p(+P zJV4|0A3uiBA)!7`cxE+K)qX8fQgXrzCh_H!6<>&)Tawi3Td{3u-Pi9wefsnU@`r?l zh2aLX&ip%P&YU6Nx!Q_EMT{0IzGvtc0{a8sn=gP%vYrOuJEb)8Zz7XSbZ}_sZ8TfJ zl!RZ3{`m1DY=35^t&EHe=rUM(t-0U6EJ#qwyQ6W=w}0%%yfxLYU!Q6<_GglCQ4zg2 z{_$_3;_DMw%vwr%dPwzA(8$}jZ|4k=cdz*V{S*ibP(JvCgUb}y&37mZ?b44jFhFFs zz}g1|#T94yKYaMGsPw3a&6}VgaQ0;?DCmcdyH12gL=@T&$ZK;ppwp(kyLT6?j2Fs1 zKgvd?8OQMOa5N?(0gP$ZAbV?jI~sPjwB+jIQc)0(VZBEy?soyDgv@`TmR?=#^QQv! zDDJghw7QKK9jBs>Tla}#E%4G>`udSkQBi?`+2#$WK90vqHiA3_O*=VhCnqNdlqG>+ zX7Mh&a+F@N+Z=>5X!D#E-@OdNo~tgdvZnY@5xj(rEu&G~)49CD!nr7=H-KJ?{zkd? zTQm7n;C+xfY5+r^<$xb;Y%*$#Q$BZhcjJwhTD*Dq&^Iij4J_SixBCPK3H;Man^`o_ zh;Ba!Cv=kuwl(+*y2A9qtPVUaeg9Lr>~_5LKAzwA;{AJm?c@o3xF0=!nyPnQR#w){ zZMi+i5|TP+Mci@Z(2*me=D*^}uor{0e#}O{z5yUCaIc_0)#O}OPERa8`H8G3}o9KwdS{+|H}{1OtYIV}cp zN4J+@5cm9N&Ro|V@n@0F5D;{mB`i(RnAkq#Fc^c9^lk|$zzA{#=)}Zr%|J#Wl7KD zM$r9ujR4)W!|$7xJ-@1~>;;(^%zj~QZ4F(4KB0=mNJD-YxDBJBBLgbkJBwy&#qsjY zo?j3^{c<2-M~wg?s+JX!f>Huc;Tr@J>nu>b%r@qla08n5t*;ld3t56e$yr&M z8x=A7{NU9qdh&T`1`ATT;vbC5U%q87!)o z1Gy&@oGs4o3`dSUXA&0%ZOqRf;Eb9^QIlMKZBuh|RbiM$swSzY)UXhJ5`l*O+Orog zZqMz2ghJ;7F-(?VMSuLzE4jA>*@rhr^rsI{GASiB^{%}={OP-Q?*L+Owxw&$-Q5PDm4k&Wn~SEtGswHw z$DB93H?>_^fTAp9tnCB)@#DwY*b?v}BBUmy(18O7fM3&oVBS%venZIXXR3x34GIh- zR#!sc!Eb=)XB4#u-o`}Gx6QqepR?;N1L8h5AviiZDijIA8=ecq43og^XXLsA`sCk{ zBS*BgwLx>#pf)C0%8`i)>3fTIuvDY)b}K7A8zp9S%(2}ES4T5TQI9_S#`AaX+{rAO ze)@}9kWdd20Vwe#sGa)8M%bj_SFcd(27Wl&*4p|2pMd0lRHzEgN5*E+!^ya_(v8v_ zJgAvz0EXgi*Fdpq)MTU_6vX{nG{@TRa2R>9k_e2t?=k4Cxt*_FU=W@I$A^f#KC zL0A!1pPR%ziV|S)4;9`_n4eNmPyqW4!2=5T`}fPFSitW`zP@soF3nB!7{a6PLXW<3 zT}P+j*0-nN|3DxsC2_O+K6s!A0nc*-68Sm`_(zv%zX)5kzQ4CLZQYS;zR=Oys`%#I z6!7XWPS0rV56Hb>ysDs3T~Sf*s+*xQ;qbSwkA|Lp2yf;;j^tT?c7KDiG#ZuA0iona z$LDnC4$3-SQPHJ`bOtKz;6l;dl*(+1G9hq`fzfYw?LwdG{dL6N&h9b%JbM=JM2)%O z(OiQrTNZ8A&ar61tp;kwfF&OqA{hAY!DP4)p!44VAprs@u1Fv~Gqc43#MH{ligKh_ z6Q~SwLAa^JW94ik8nh$Om}99WEnQkxCPPO@r>3R`Hi_Bg_d~jV)p#qgs_49~yj%`e zdi&DU`h?d;VRG`-cOTLq&>t4D!HZZrL8|8G=fi@dfq#3R9}zfp;>3w_=kj5bLHLZ~ z#BK!Z1OZ^!uU`(nQ794=)burDkm45!kbp`!QDvm0SO5ZXX=O-wEEAnJV$S=FgYE;~ zVRpj@cdunxw(zo*wy*yD4pL&rwrzkb|BJ{N5i}wTUHg$=fxqa*lPBu`F0D-2Ukx3Tl$2yWapInb2l-}UI%)!lAze>a2l{{q z;^yUT9tSl!@%0H!xj&0nhjkvXdVK-H`(x|Q##{DDEt!Tf;p8Ii1}Y1Gy1!lCz4nbLwZtT1;}-1gnJY<&ENtp z-xI7A*psQLsp-_TK1*tC9UaPT+b&+bm|s{3vYrdoTL}vA=X|he;`}IRXkd^rEGQ&2 zx3Ca>*7PY}CCBo1B2_~S2@OS#283s}MB*^|T#JcGzsEusJQ;cXIN>k|k#FC=k?&NL zZmbv9zVq>sRZ&s7c@uDUEAaj@Cl}Y~YqO~9QS<0~6@zure4v_wi|)RRo{XJGfTQb!rcL4 zCwsb1RlF>dk)1tFmxGS`JgKSu!3_Dg6jI>jVRP~T7#$rQh%XI|klLYuChtG9>gob@|EI6d7&ph>%qSzv zLIec`PqMMC%{C~bnXcn3{5Q*r7rKGg%+XjM^dsUUpYW?+t1ePJNdSE~v8=2tARqvi z0K7^2eZa#muZ^{woSbYPOS@=~dDxTJ$RTiWaPXBZz6~^Ww6jBVb<_c&9ryIf5Oqkc3JK-J#-495H#Qcq>C6XZI%8o10I?UB zzKw}W5$GNxIyJopo5u0KfhLn-@9?|tL?RKOJ90H8D{Jc28DomATYc`|&!3^dh&*Ps zZ(g47pNfv&D{3ReTaQZV9-)aA4aWOGo{eoa_F050}p2>V|c`o}t zpH?Ulk@V*;UtkIQ%fY~P;=Xe^p`=7gRMhp`)5E3f%c)Kqj}Ned={|Vy;AdeW3>#v{ zU0z(Aoc}twT%a~^AK}*k(X@9(NO=^XZfW$R$AC9_yzAF;oUi8>7KS(42eiL$A30%( zLhu8!WCKi{X-94CHC|39Qo9C*?YVmI-fA^pX&P$SECss3i_iJVkORQq=pF&7BT3+7 z^}gNt;WhK9z~_;CDf+-VUafESs)R;M7a z@i`M9+{r1-FM+yY`<{yg&rkmT62`54A@ne&bH&^olEezU4k+N9l>z%8U`9p7XPKFq zctDZoYUaHvI*2|i5AlJ{Z&MnRl%qM+5}&b18}OD>{X15eq=Oikot;IUxC`T5?Q71R zcgkmn8vxhH^;}5FbZ~P3;DABdOHCl(DR=Au=jt@l2t-sLicWBclcGUog<5~Su=tJ6 za1V==9;|i9wNNyY9@paaXH5=($+Ly%0AR>Ympn-q`I%hSMgujl7Stiy8~U;deTgky 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

9Z8JjbhCgfocfbY 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%0D0JoiE~f=Oi_ zV1Uv4!|-sM8Mk?jyWUa1cmP`5qx?g(X>N&7icknLId9q}QeOQhh01#En0fy_TK?{p zY^AMN#vd!McZ>K_M4ew3&6d?1%nv&vhxjtY7JF$t+1Ym0qi5doSR&+jOoZEgBw=JV zzg+dGCXlE;op%q#)u+3!WN{K0(7}w{Cgp}X^^QLo>fvnaowkOz^ksVSsIJj}4UGadPfs%FEEBYnAVih{7P9?!SJY zp9dm58o&W@(+v@7-1kkzp#*wH`wTs^SHR3EP}$-3#=DQKy%Fs;yons1nlX{2jmPEf zo;X2br6_3~W`!x;;&gK{ev#AbJZ+2L(U#C%9rhTTecWwE_9HGOA}d@d&>O#z&sMXd zH&#^0Ivm&GX}al)n5mg$(YD5T1eDr@J{|Sn^9rddP>3=u1v2O|dE$|%^D+=~QV7v< z?Tyj<6FR=GD=F_?iBfzl@ zSnz1;auMnvdLe-@e{QLP(9$DqtU^{>o9aDAiziSwiye#ZDX4K)WvWWH&}+akwAw8m z7k6U`M1r}OWppsb&G5AZ@@MG|Jv+Y9Chgtym7B~XEV%mA+Cm*WV&BNeY>%CO)Rx0$ z7h!-1smns?bYTIGKx5id+5M-}!A10;9sIC7SG(wHKloY1x<_9m;srt3v7CBi$lQ_LeOO_l)F|=CG@%D^33@ z-wx#|>0Q?9@|@Ft0pkz52R?rKW0yxkE#yFIE;In>;-@y}@3&o7#iY?C0=zwI-5@Y# z;r3iBS}Af_2VtdE$Sa!K*=GurUtONkdoo`K%~fY#D7I{^$gAG0>YzGj(iKAxn7xSs zk~kz&*|5DQ6*7{So_1jePv3UbboHb@j0sUG-PK2wHqv?F9F>;bQ~)$KZ=0 zDde_|2ZX>J^F;a45z;1Lad^2@W38ddX{*5WAxZ}PB#!{U;{$I5yANVS+&+N^7vg(I zeIIC#ixQtJ>Wdt|QjnO*Fp>C%Xw4X*kRlv!>jG|zxw7-+^c+;*6%~T_>UICP&H%H9xyN!RB$$H!Bv1Xhzp;kOcorkt> zA-wYe!&Hh`?kH3^g((YZb$0`Rjn7gt;oZmpQ0Ly^rXOsxo#1#?fvk<&k5}<$2~*I= z2F}Xv)eB|5v%yp)lvrYFUgUK8=th$ek|QA*N)rfzct%8+28uRXOVB7s9$w|TzlDERS0 z++%lU&g7y-MfXBQD0GcspJ)V0en~X&&Bv1sK7m}=c_X?H#V`7PEXt?IczK5E>Ow>R zo67-yZQZ=zC|Toz!3jOQM{x>?%$BzCx}Ve}DkMuC4O}MrCj_;);zc1k4$Vl>I4*nrJu0=0)3N^it|LBf z#3fkqkj26}s|?WZV~kcmS+r#IipbxjOZ<%Gu1M5a6~2^0 zAH}Iy{Uu}}vs=erh_zK!5#TS%_gq7JjVq@FC$?G{vJ?Z53D4k#(-&dwTkqt}Jg4$+ z9;gQ28|j=9f|5Kt=*6P&Fz?+XL?bWXBsI!j zhbQG8j;~Nm{5}yB1{=C~Px0eLf^v3-9X_Kz9ay59AO=yCcrdKozXB_Jc^F5HPQ_Hq zhD-oRxO|)HA7J_(nkCEpb0U5;^*bB4saF~px)@!}1P8N%$ES>~8#)TC26|{GbY9w$ zyG_frAlU>0yYR}nY%!-@E+eLGO4WMCVSV2^;RE>c!7Ul#WqZPK5=%6kBj*ZI#VD57ga$biiJyB*$F^gzI%YltGdtcv*GR2ZE5GJ4>AU z{Y|vEbsGN`soI9<9ywr@>oY-;mjteLGk~d0C|aH6u)Ky2a4cldMez-`8Ng!NJiTuK zeYsKo?x$Ixf8D8ClTR$a76r9wci{r*GqFX^D6F5l#mGP6=&Dm=p{}|M<<5391mhq{ z<$hL?@1@lt#lYAsTy`PiwB#|U4(X(4HjmbM$Z^dz$~JQk?W8~PxV}2Z^Yqa;0<=v~ z(fC|&lxg&MbMZkG7w_nLY33^JZ*Xtb+c}@BHf7T$EZAMCpe83Tneijv=EwVsg0kNS zIf1)nWAj>!LGiEZhT2+Yjy5{v?>bMF$&OVXJo!A@*V`xLNo~<=drp3JvxlXgSCFEA zAm4kbhmqoGLXynQGlQz3N9P^yk=HW@m0cs_HPT5ru;{u+-|pJivr0L5U8M=wdx{Z5 z1Z);RGia+U7o%3vXFgBmdr-y{Ki#4Da&%fJ#K;b>`9y*>Ph*x0%DEPycm*$sb2KTY z4?DnGW6xje&Yw-wldvWQwHY^8m&5D6o-p=hq9x*CW0Eguh;SPSi>>bCccqyl=E1J- zzw6zVA4z3Aq{aSJ*Z7r^)sfdY3$*1vmXMk&85!p~IxY^@QHf{8dF}U6PxSMCC8~8W z$CN)+mMn|pd}IW_o~X9!jAb45`k5vM(KEN@lTVr~u6JKs_fn1J%XQD?p>sbwM?&>) z4+fp8gADsx0`m0DI>KkGS2Yb%HECY#Sw*B0=(pNW_JP>_l;-ci?rR2aChg*blzGi90nE2=Uk9Vxe zqKMdTYWwFd8Lm^N%^iyy0~oIF35hCKo*~OfEeyQrg+1oCp{Tu;t#~D^S!)tt*u5-T zuxQ{kdZdm=gdY`{A++{JcRX4mEfs%oIXXFLmmJ2JB!KoRf7NX*X8b$Z*P7tgp2%L- z;UJ&Qfkmx4WBfdAFq#hmM%hCuLSAQN4-|hYM55i*djMBP2d)qh z-u{m`|1C&W;)HTPHUdJ7$P2Ty%hxjp?BN1{THE+8$yhSLp{VQ@zLu zQt98|SYx~+WIo3+?6N>786-Yc_^Em+`yvc`tK%b)N@4J!ybuL6%Y^!0sqdLcX@p;I1vBSNj5WQSEnE%%%AbD{X!RSglfenF;iBUHfi{L);hCrE;^gdV@Xp!! zKcU-Iq>cRH-*v*#cz>Xa;go2y{3kdtvymN582~8fLHh?>3;ACo;P1Kr&)BJk z_|pU7ez>s#0GvO(N2&h{?&{`cZ{hk+-v?T&2Ett#`q#Mtz;+)1!14zeto1LjgN3=x zJA)54E^hAc>^aQfTDmyd+grGBm|M8oxj8v=Iy+kZJ*J;2slBK&`、`>=`。 +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`。 |

bVq0@ZxLzpL9WNXcgQ3z(|c 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∓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 U%*{}SL00y})MU;OrM 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%0D0Q{XlUoljAZ>3NwAG> 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�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