using System; namespace ZB.MOM.WW.OtOpcUa.Host.Domain { /// /// Maps MXAccess integer quality to domain Quality enum and OPC UA StatusCodes. (MXA-009, OPC-005) /// public static class QualityMapper { /// /// Maps an MXAccess quality integer (OPC DA quality byte) to domain Quality. /// Uses category bits: 192+ = Good, 64-191 = Uncertain, 0-63 = Bad. /// /// The raw MXAccess quality integer. /// The mapped bridge quality value. public static Quality MapFromMxAccessQuality(int mxQuality) { var b = (byte)(mxQuality & 0xFF); // Try exact match first if (Enum.IsDefined(typeof(Quality), b)) return (Quality)b; // Fall back to category if (b >= 192) return Quality.Good; if (b >= 64) return Quality.Uncertain; return Quality.Bad; } /// /// Maps domain Quality to OPC UA StatusCode uint32. /// /// The bridge quality value. /// The OPC UA status code represented as a 32-bit unsigned integer. public static uint MapToOpcUaStatusCode(Quality quality) { return quality switch { Quality.Good => 0x00000000u, // Good Quality.GoodLocalOverride => 0x00D80000u, // Good_LocalOverride Quality.Uncertain => 0x40000000u, // Uncertain Quality.UncertainLastUsable => 0x40900000u, Quality.UncertainSensorNotAccurate => 0x40930000u, Quality.UncertainEuExceeded => 0x40940000u, Quality.UncertainSubNormal => 0x40950000u, Quality.Bad => 0x80000000u, // Bad Quality.BadConfigError => 0x80890000u, Quality.BadNotConnected => 0x808A0000u, Quality.BadDeviceFailure => 0x808B0000u, Quality.BadSensorFailure => 0x808C0000u, Quality.BadCommFailure => 0x80050000u, Quality.BadOutOfService => 0x808D0000u, Quality.BadWaitingForInitialData => 0x80320000u, _ => quality.IsGood() ? 0x00000000u : quality.IsUncertain() ? 0x40000000u : 0x80000000u }; } } }