Auto: focas-f2a — DIAG: address scheme
New FocasAreaKind.Diagnostic parsed from DIAG:nnn (whole-CNC) and DIAG:nnn/axis (per-axis), validated against a per-series FocasCapabilityMatrix.DiagnosticRange table (16i: 0-499; 0i-F family: 0-999; 30i/31i/32i: 0-1023; Power Motion i: 0-255; Unknown: permissive per existing matrix convention). IFocasClient gains ReadDiagnosticAsync(diagNumber, axisOrZero, type, ct) with a default returning BadNotSupported so older transport variants degrade gracefully. FwlibFocasClient implements it via a new cnc_rddiag P/Invoke that reuses the IODBPSD struct (same shape as cnc_rdparam). FocasDriver.ReadAsync dispatches Diagnostic addresses through the new path; non-Diagnostic kinds keep the existing ReadAsync route unchanged. Tests: parser positives (DIAG:1031, DIAG:280/2, case-insensitive, zero, axis-8) + negatives (malformed, axis>31), capability matrix boundaries per series, driver-level dispatch verifying axis index threads through, init-time rejection on out-of-range, and BadNotSupported fallback when the wire client doesn't override the default. 266/266 pass in Driver.FOCAS.Tests. Closes #263 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -176,6 +176,25 @@ internal static class FwlibNative
|
||||
ref short outCount,
|
||||
ref IODBAXIS figureinfo);
|
||||
|
||||
// ---- Diagnostics ----
|
||||
|
||||
/// <summary>
|
||||
/// <c>cnc_rddiag</c> — read a CNC diagnostic value. <paramref name="number"/> is the
|
||||
/// diagnostic number (e.g. 1031 = current alarm cause); <paramref name="axis"/> is 0
|
||||
/// for whole-CNC diagnostics or the 1-based axis index for per-axis diagnostics.
|
||||
/// <paramref name="length"/> is sized like <see cref="RdParam"/> — 4-byte header +
|
||||
/// widest payload (8 bytes for Float64). The shape of the payload depends on the
|
||||
/// diagnostic; the managed side decodes via <see cref="FocasDataType"/> on the
|
||||
/// configured tag (issue #263).
|
||||
/// </summary>
|
||||
[DllImport(Library, EntryPoint = "cnc_rddiag", ExactSpelling = true)]
|
||||
public static extern short RdDiag(
|
||||
ushort handle,
|
||||
ushort number,
|
||||
short axis,
|
||||
short length,
|
||||
ref IODBPSD buffer);
|
||||
|
||||
// ---- Currently-executing block ----
|
||||
|
||||
/// <summary>
|
||||
|
||||
Reference in New Issue
Block a user