虚拟HAL完全满足Web数控仿真

结论:real simulation page 已将保存的 virtual HAL session snapshot 联动到 release diagnostics artifact,保存或恢复后的 Web CNC 仿真会话可直接输出 release-ready virtual HAL source、sim-config、halcmd fixture 与 motion matrix evidence;该能力仍限于 Web 仿真替代层,不声明 Linux kernel hard-realtime ABI、外部硬件驱动 ABI 或 native HAL module ABI。
This commit is contained in:
2026-06-17 23:07:11 +08:00
parent 7449ff7f4e
commit 208992c42e
5 changed files with 154 additions and 2 deletions

View File

@@ -252,7 +252,7 @@
if (!api?.getMachineSessionLoadState || !api?.loadReadyMachineSession) {
throw new Error("simulation API missing AXIS machine/session load controls");
}
if (!api?.getVirtualHalSessionState || !api?.saveVirtualHalSessionSnapshot || !api?.restoreVirtualHalSessionSnapshot) {
if (!api?.getVirtualHalSessionState || !api?.saveVirtualHalSessionSnapshot || !api?.restoreVirtualHalSessionSnapshot || !api?.exportVirtualHalSessionDiagnosticsArtifact) {
throw new Error("simulation API missing virtual HAL session persistence controls");
}
if (!api?.getRunMode || !api?.getRunControlState || !api?.setUseLoadedSession || !api?.getRunSummary) {
@@ -747,11 +747,29 @@
savedVirtualHalSession.revision < virtualHalcmdResult.state.revision ||
!savedVirtualHalSession.snapshot?.payload?.virtualHal?.sourceCompliance?.complete ||
!savedVirtualHalSession.snapshot?.payload?.virtualHal?.motionControllerMatrix?.complete ||
savedVirtualHalSession.releaseDiagnosticsReady !== true ||
savedVirtualHalSession.sessionDiagnostics?.ready !== true ||
savedVirtualHalSession.sessionDiagnostics?.validation?.ready !== true ||
savedVirtualHalSession.sessionDiagnostics?.validation?.motionControllerMatrixReady !== true ||
savedVirtualHalSession.sessionDiagnostics?.diagnosticsArtifact?.virtualHalMotionControllerMatrix?.complete !== true ||
doc.body.dataset.virtualHalSessionPhase !== "saved" ||
!doc.querySelector("[data-virtual-hal-session-status]")?.textContent.includes("Saved HAL session")
) {
throw new Error(`AXIS-style virtual HAL session save failed: ${JSON.stringify(savedVirtualHalSession)}`);
}
const savedSessionDiagnosticsArtifact = api.exportVirtualHalSessionDiagnosticsArtifact();
const diagnosticsWithSavedSession = api.exportDiagnosticsArtifact();
if (
savedSessionDiagnosticsArtifact.ready !== true ||
savedSessionDiagnosticsArtifact.phase !== "release-ready" ||
savedSessionDiagnosticsArtifact.sessionId !== "axis-browser-virtual-hal-session" ||
savedSessionDiagnosticsArtifact.validation?.ready !== true ||
diagnosticsWithSavedSession.virtualHalSessionDiagnostics?.ready !== true ||
diagnosticsWithSavedSession.virtualHalSessionDiagnostics?.validation?.ready !== true ||
diagnosticsWithSavedSession.virtualHalSessionDiagnostics?.diagnosticsArtifact?.virtualHalSourceCompliance?.complete !== true
) {
throw new Error(`AXIS-style virtual HAL session diagnostics did not become release-ready: ${JSON.stringify(diagnosticsWithSavedSession.virtualHalSessionDiagnostics)}`);
}
api.executeVirtualHalcmd("setp axis.x.pos-cmd 9.5\nloadusr post-save-component");
if (api.readVirtualHalPin("axis.x.pos-cmd")?.value !== 9.5) {
throw new Error("AXIS-style virtual HAL pre-restore mutation did not apply");
@@ -766,6 +784,9 @@
api.readVirtualHalPin("axis.x.pos-cmd")?.value !== 1.75 ||
api.getVirtualHalState().hal.loadedComponents.some(({ component }) => component === "post-save-component") ||
!api.getVirtualHalState().hal.functions.some(({ name }) => name === "motion-controller") ||
restoredVirtualHalSession.releaseDiagnosticsReady !== true ||
restoredVirtualHalSession.sessionDiagnostics?.ready !== true ||
restoredVirtualHalSession.sessionDiagnostics?.validation?.ready !== true ||
doc.body.dataset.virtualHalSessionPhase !== "restored" ||
!doc.querySelector("[data-virtual-hal-session-status]")?.textContent.includes("Restored HAL session")
) {

View File

@@ -22,6 +22,7 @@ for (const required of [
"getRecentPrograms()",
"Three.js `^0.183.2`",
"exportDiagnosticsArtifact()",
"exportVirtualHalSessionDiagnosticsArtifact()",
"getLimitsHomeState()",
"getAxisStatusbarState()",
"applyAxisViewFromUrl(search)",