From 63099115bff3009c538d18bdedf9bc3e72f94a7f Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Sat, 25 Apr 2026 19:49:25 -0400 Subject: [PATCH] =?UTF-8?q?Auto:=20focas-f2c=20=E2=80=94=20PMC=20F/G=20for?= =?UTF-8?q?=2016i?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Capability-matrix correctness fix: real 16i ladders use F (CNC->PMC) and G (PMC->CNC) signal groups for handshakes, but PmcLetters(Sixteen_i) was returning {X,Y,R,D} only. Widen to {X,Y,F,G,R,D}; M/C/E/A/K/T remain 0i-F / 30i-only. Updated the matching test row. Closes #265 --- .../FocasCapabilityMatrix.cs | 7 ++++--- .../FocasCapabilityMatrixTests.cs | 5 +++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/ZB.MOM.WW.OtOpcUa.Driver.FOCAS/FocasCapabilityMatrix.cs b/src/ZB.MOM.WW.OtOpcUa.Driver.FOCAS/FocasCapabilityMatrix.cs index 8d84b49..36ba82b 100644 --- a/src/ZB.MOM.WW.OtOpcUa.Driver.FOCAS/FocasCapabilityMatrix.cs +++ b/src/ZB.MOM.WW.OtOpcUa.Driver.FOCAS/FocasCapabilityMatrix.cs @@ -97,11 +97,12 @@ public static class FocasCapabilityMatrix _ => (0, int.MaxValue), }; - /// PMC letters accepted per series. Legacy controllers omit F/M/C - /// signal groups that 30i-family ladder programs use. + /// PMC letters accepted per series. Legacy 16i ladders use X/Y/F/G + /// for handshakes plus R/D for retained/data; M/C/E/A/K/T are the 0i-F / + /// 30i-family extensions. internal static IReadOnlySet PmcLetters(FocasCncSeries series) => series switch { - FocasCncSeries.Sixteen_i => new HashSet(StringComparer.OrdinalIgnoreCase) { "X", "Y", "R", "D" }, + FocasCncSeries.Sixteen_i => new HashSet(StringComparer.OrdinalIgnoreCase) { "X", "Y", "F", "G", "R", "D" }, FocasCncSeries.Zero_i_D => new HashSet(StringComparer.OrdinalIgnoreCase) { "X", "Y", "R", "D", "E", "A" }, FocasCncSeries.Zero_i_F or FocasCncSeries.Zero_i_MF or diff --git a/tests/ZB.MOM.WW.OtOpcUa.Driver.FOCAS.Tests/FocasCapabilityMatrixTests.cs b/tests/ZB.MOM.WW.OtOpcUa.Driver.FOCAS.Tests/FocasCapabilityMatrixTests.cs index 8efff33..fb5a86a 100644 --- a/tests/ZB.MOM.WW.OtOpcUa.Driver.FOCAS.Tests/FocasCapabilityMatrixTests.cs +++ b/tests/ZB.MOM.WW.OtOpcUa.Driver.FOCAS.Tests/FocasCapabilityMatrixTests.cs @@ -57,8 +57,9 @@ public sealed class FocasCapabilityMatrixTests [InlineData(FocasCncSeries.Sixteen_i, "X", true)] [InlineData(FocasCncSeries.Sixteen_i, "Y", true)] [InlineData(FocasCncSeries.Sixteen_i, "R", true)] - [InlineData(FocasCncSeries.Sixteen_i, "F", false)] // 16i has no F/G signal groups - [InlineData(FocasCncSeries.Sixteen_i, "G", false)] + [InlineData(FocasCncSeries.Sixteen_i, "F", true)] // #265: F/G handshakes are documented on 16i ladders + [InlineData(FocasCncSeries.Sixteen_i, "G", true)] + [InlineData(FocasCncSeries.Sixteen_i, "M", false)] // M/C/K/T still 0i-F / 30i-only [InlineData(FocasCncSeries.Sixteen_i, "K", false)] [InlineData(FocasCncSeries.Zero_i_D, "E", true)] // widened since 0i-D [InlineData(FocasCncSeries.Zero_i_D, "F", false)] // still no F on 0i-D