private byte[] modbusRead(byte id, ushort addr, ushort length) { byte[] data = new byte[length]; // get the most significant digit int pow = (int)Math.Pow(10, Math.Floor(Math.Log10(addr))); int ldigit = (int)Math.Floor((double)addr / pow); addr = (pow > 1) ? (ushort)(addr % pow) : addr; // four operation type switch (ldigit) { case 1: socket.ReadCoils(1, id, addr, length, ref data); return(data); case 2: socket.ReadDiscreteInputs(2, id, addr, length, ref data); return(data); case 3: socket.ReadInputRegister(3, id, addr, length, ref data); return(data); case 4: socket.ReadHoldingRegister(4, id, addr, length, ref data); return(data); default: throw new Exception(); } }