diff --git a/S7.Net.UnitTest/TypeTests/BooleanTests.cs b/S7.Net.UnitTest/TypeTests/BooleanTests.cs new file mode 100644 index 00000000..3390b791 --- /dev/null +++ b/S7.Net.UnitTest/TypeTests/BooleanTests.cs @@ -0,0 +1,38 @@ +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Boolean = S7.Net.Types.Boolean; + +namespace S7.Net.UnitTest.TypeTests +{ + [TestClass] + public class BooleanTests + { + [DataTestMethod] + [DataRow(0)] + [DataRow(1)] + [DataRow(2)] + [DataRow(3)] + [DataRow(4)] + [DataRow(5)] + [DataRow(6)] + [DataRow(7)] + public void TestValidSetBitValues(int index) + { + Assert.AreEqual(Math.Pow(2, index), Boolean.SetBit(0, index)); + } + + [DataTestMethod] + [DataRow(0)] + [DataRow(1)] + [DataRow(2)] + [DataRow(3)] + [DataRow(4)] + [DataRow(5)] + [DataRow(6)] + [DataRow(7)] + public void TestValidClearBitValues(int index) + { + Assert.AreEqual((byte) ((uint) Math.Pow(2, index) ^ uint.MaxValue), Boolean.ClearBit(byte.MaxValue, index)); + } + } +} diff --git a/S7.Net/PLC.cs b/S7.Net/PLC.cs index 8882a138..3a73b4cc 100644 --- a/S7.Net/PLC.cs +++ b/S7.Net/PLC.cs @@ -14,7 +14,7 @@ namespace S7.Net public partial class Plc : IDisposable { private const int CONNECTION_TIMED_OUT_ERROR_CODE = 10060; - + //TCP connection to device private TcpClient? tcpClient; private NetworkStream? _stream; diff --git a/S7.Net/PLCHelpers.cs b/S7.Net/PLCHelpers.cs index 07611cb8..5b2d77fa 100644 --- a/S7.Net/PLCHelpers.cs +++ b/S7.Net/PLCHelpers.cs @@ -30,8 +30,8 @@ private static void BuildHeaderPackage(System.IO.MemoryStream stream, int amount } /// - /// Create the bytes-package to request data from the PLC. You have to specify the memory type (dataType), - /// the address of the memory, the address of the byte and the bytes count. + /// Create the bytes-package to request data from the PLC. You have to specify the memory type (dataType), + /// the address of the memory, the address of the byte and the bytes count. /// /// MemoryType (DB, Timer, Counter, etc.) /// Address of the memory to be read @@ -184,7 +184,7 @@ internal static int VarTypeToByteLength(VarType varType, int varCount = 1) switch (varType) { case VarType.Bit: - return varCount + 7 / 8; + return (varCount + 7) / 8; case VarType.Byte: return (varCount < 1) ? 1 : varCount; case VarType.String: diff --git a/S7.Net/Types/Boolean.cs b/S7.Net/Types/Boolean.cs index b83369d4..f7bc83ea 100644 --- a/S7.Net/Types/Boolean.cs +++ b/S7.Net/Types/Boolean.cs @@ -14,20 +14,51 @@ public static bool GetValue(byte value, int bit) } /// - /// Sets the value of a bit to 1 (true), given the address of the bit + /// Sets the value of a bit to 1 (true), given the address of the bit. Returns + /// a copy of the value with the bit set. /// + /// The input value to modify. + /// The index (zero based) of the bit to set. + /// The modified value with the bit at index set. public static byte SetBit(byte value, int bit) { - return (byte)((value | (1 << bit)) & 0xFF); + SetBit(ref value, bit); + + return value; } /// - /// Resets the value of a bit to 0 (false), given the address of the bit + /// Sets the value of a bit to 1 (true), given the address of the bit. + /// + /// The value to modify. + /// The index (zero based) of the bit to set. + public static void SetBit(ref byte value, int bit) + { + value = (byte) ((value | (1 << bit)) & 0xFF); + } + + /// + /// Resets the value of a bit to 0 (false), given the address of the bit. Returns + /// a copy of the value with the bit cleared. /// + /// The input value to modify. + /// The index (zero based) of the bit to clear. + /// The modified value with the bit at index cleared. public static byte ClearBit(byte value, int bit) { - return (byte)((value | (~(1 << bit))) & 0xFF); + ClearBit(ref value, bit); + + return value; } + /// + /// Resets the value of a bit to 0 (false), given the address of the bit + /// + /// The input value to modify. + /// The index (zero based) of the bit to clear. + public static void ClearBit(ref byte value, int bit) + { + value = (byte) (value & ~(1 << bit) & 0xFF); + } } }