diff --git a/dotnet/IEC61850forCSharp/IEC61850CommonAPI.cs b/dotnet/IEC61850forCSharp/IEC61850CommonAPI.cs index 47205465..daed6660 100644 --- a/dotnet/IEC61850forCSharp/IEC61850CommonAPI.cs +++ b/dotnet/IEC61850forCSharp/IEC61850CommonAPI.cs @@ -169,9 +169,26 @@ namespace IEC61850 /// public class Quality { - private UInt16 value; + private const UInt16 QUALITY_DETAIL_OVERFLOW = 4; + private const UInt16 QUALITY_DETAIL_OUT_OF_RANGE = 8; + private const UInt16 QUALITY_DETAIL_BAD_REFERENCE = 16; + private const UInt16 QUALITY_DETAIL_OSCILLATORY = 32; + private const UInt16 QUALITY_DETAIL_FAILURE = 64; + private const UInt16 QUALITY_DETAIL_OLD_DATA = 128; + private const UInt16 QUALITY_DETAIL_INCONSISTENT = 256; + private const UInt16 QUALITY_DETAIL_INACCURATE = 512; + private const UInt16 QUALITY_SOURCE_SUBSTITUTED = 1024; + private const UInt16 QUALITY_TEST = 2048; + private const UInt16 QUALITY_OPERATOR_BLOCKED = 4096; + + public override string ToString () + { + return GetValidity ().ToString (); + + } + public Quality (int bitStringValue) { value = (UInt16)bitStringValue; @@ -195,6 +212,133 @@ namespace IEC61850 value += (ushort)validity; } + + public Validity Validity + { + get {return GetValidity ();} + set { SetValidity (value); } + } + + public bool Overflow + { + get { return ((this.value & QUALITY_DETAIL_OVERFLOW) != 0);} + set { + if (value) + this.value |= QUALITY_DETAIL_OVERFLOW; + else + this.value = (ushort) ((int) this.value & (~QUALITY_DETAIL_OVERFLOW)); + } + } + + public bool OutOfRange + { + get { return ((this.value & QUALITY_DETAIL_OUT_OF_RANGE) != 0);} + set { + if (value) + this.value |= QUALITY_DETAIL_OUT_OF_RANGE; + else + this.value = (ushort) ((int) this.value & (~QUALITY_DETAIL_OUT_OF_RANGE)); + } + } + + public bool BadReference + { + get { return ((this.value & QUALITY_DETAIL_BAD_REFERENCE) != 0);} + set { + if (value) + this.value |= QUALITY_DETAIL_BAD_REFERENCE; + else + this.value = (ushort) ((int) this.value & (~QUALITY_DETAIL_BAD_REFERENCE)); + } + } + + public bool Oscillatory + { + get { return ((this.value & QUALITY_DETAIL_OSCILLATORY) != 0);} + set { + if (value) + this.value |= QUALITY_DETAIL_OSCILLATORY; + else + this.value = (ushort) ((int) this.value & (~QUALITY_DETAIL_OSCILLATORY)); + } + } + + public bool Failure + { + get { return ((this.value & QUALITY_DETAIL_FAILURE) != 0);} + set { + if (value) + this.value |= QUALITY_DETAIL_FAILURE; + else + this.value = (ushort) ((int) this.value & (~QUALITY_DETAIL_FAILURE)); + } + } + + public bool OldData + { + get { return ((this.value & QUALITY_DETAIL_OLD_DATA) != 0);} + set { + if (value) + this.value |= QUALITY_DETAIL_OLD_DATA; + else + this.value = (ushort) ((int) this.value & (~QUALITY_DETAIL_OLD_DATA)); + } + } + + public bool Inconsistent + { + get { return ((this.value & QUALITY_DETAIL_INCONSISTENT) != 0);} + set { + if (value) + this.value |= QUALITY_DETAIL_INCONSISTENT; + else + this.value = (ushort) ((int) this.value & (~QUALITY_DETAIL_INCONSISTENT)); + } + } + + public bool Inaccurate + { + get { return ((this.value & QUALITY_DETAIL_INACCURATE) != 0);} + set { + if (value) + this.value |= QUALITY_DETAIL_INACCURATE; + else + this.value = (ushort) ((int) this.value & (~QUALITY_DETAIL_INACCURATE)); + } + } + + public bool Substituted + { + get { return ((this.value & QUALITY_SOURCE_SUBSTITUTED) != 0);} + set { + if (value) + this.value |= QUALITY_SOURCE_SUBSTITUTED; + else + this.value = (ushort) ((int) this.value & (~QUALITY_SOURCE_SUBSTITUTED)); + } + } + + public bool Test + { + get { return ((this.value & QUALITY_TEST) != 0);} + set { + if (value) + this.value |= QUALITY_TEST; + else + this.value = (ushort) ((int) this.value & (~QUALITY_TEST)); + } + } + + public bool OperatorBlocked + { + get { return ((this.value & QUALITY_OPERATOR_BLOCKED) != 0);} + set { + if (value) + this.value |= QUALITY_OPERATOR_BLOCKED; + else + this.value = (ushort) ((int) this.value & (~QUALITY_OPERATOR_BLOCKED)); + } + } } /// diff --git a/dotnet/tests/Test.cs b/dotnet/tests/Test.cs index 8ec403eb..ce22168f 100644 --- a/dotnet/tests/Test.cs +++ b/dotnet/tests/Test.cs @@ -454,6 +454,33 @@ namespace tests iedServer.Stop (); } + + [Test()] + public void Quality() + { + Quality q = new Quality (); + + Assert.AreEqual (false, q.Overflow); + + q.Overflow = true; + + Assert.AreEqual (true, q.Overflow); + + q.Overflow = false; + + Assert.AreEqual (false, q.Overflow); + + Assert.AreEqual (Validity.GOOD, q.Validity); + + q.Substituted = true; + + Assert.AreEqual (true, q.Substituted); + Assert.AreEqual (false, q.Overflow); + + q.Validity = Validity.QUESTIONABLE; + + Assert.AreEqual (Validity.QUESTIONABLE, q.Validity); + } } }