fb04b54d62
MapStatusCode returned Uncertain for any non-zero non-Bad code, so GoodLocalOverride, GoodClamped and info-bit Good variants degraded to Uncertain. Now top two bits decide: 00 Good, 01 Uncertain, 10/11 Bad (BadResourceUnavailable stays Bad, #112 untouched). The SDK IsGood/IsUncertain(uint) helpers were tried first and failed the subcode tests, so an explicit mask is used. MxGateway mapper uses the OPC-DA quality byte (>=192 Good) and is not affected. Claude-Session: https://claude.ai/code/session_01GT67AEHd2Acv1YPwGfXEoV
25 lines
1.2 KiB
C#
25 lines
1.2 KiB
C#
using Opc.Ua;
|
|
using ZB.MOM.WW.ScadaBridge.Commons.Interfaces.Protocol;
|
|
using ZB.MOM.WW.ScadaBridge.DataConnectionLayer.Adapters;
|
|
|
|
namespace ZB.MOM.WW.ScadaBridge.DataConnectionLayer.Tests;
|
|
|
|
/// <summary>ScadaBridge#117: quality follows the StatusCode severity bits, not "== 0".</summary>
|
|
public class OpcUaStatusCodeMappingTests
|
|
{
|
|
[Theory]
|
|
[InlineData(StatusCodes.Good, QualityCode.Good)]
|
|
[InlineData(StatusCodes.GoodLocalOverride, QualityCode.Good)]
|
|
[InlineData(StatusCodes.GoodClamped, QualityCode.Good)]
|
|
[InlineData(StatusCodes.Good | 0x0480u, QualityCode.Good)] // info bits set
|
|
[InlineData(StatusCodes.Uncertain, QualityCode.Uncertain)]
|
|
[InlineData(StatusCodes.UncertainLastUsableValue, QualityCode.Uncertain)]
|
|
[InlineData(StatusCodes.UncertainSensorNotAccurate, QualityCode.Uncertain)]
|
|
[InlineData(StatusCodes.Bad, QualityCode.Bad)]
|
|
[InlineData(StatusCodes.BadNodeIdUnknown, QualityCode.Bad)]
|
|
[InlineData(StatusCodes.BadResourceUnavailable, QualityCode.Bad)]
|
|
[InlineData(0xC0000000u, QualityCode.Bad)]
|
|
public void MapStatusCode_UsesSeverityBits(uint code, QualityCode expected) =>
|
|
Assert.Equal(expected, OpcUaDataConnection.MapStatusCode(code));
|
|
}
|