示例#1
0
        public void Append(ushort value, Endianness16 endianness = Endianness16.AB)
        {
            switch (endianness)
            {
            case Endianness16.AB:
                _bytes.Add((byte)(value >> 8));
                _bytes.Add((byte)(value & 0xff));
                break;

            case Endianness16.BA:
                _bytes.Add((byte)(value & 0xff));
                _bytes.Add((byte)(value >> 8));
                break;

            default:
                throw new ArgumentException("Invalid endianness", "endianness");
            }
        }
示例#2
0
        public ushort ReadUShort(int offset, Endianness16 endianness = Endianness16.AB)
        {
            ushort result = 0;

            switch (endianness)
            {
            case Endianness16.AB:
                result |= (ushort)(_bytes[offset] << 8);
                result |= _bytes[offset + 1];
                break;

            case Endianness16.BA:
                result |= _bytes[offset];
                result |= (ushort)(_bytes[offset + 1] << 8);
                break;

            default:
                throw new ArgumentException("Invalid endianness", "endianness");
            }
            return(result);
        }
示例#3
0
 public void Append(short value, Endianness16 endianness = Endianness16.AB)
 {
     Append((ushort)value, endianness);
 }
示例#4
0
        public ushort[] ReadHoldingRegisters(byte unitAdr, ushort regAdr, ushort regCount, Endianness16 endianness = Endianness16.AB)
        {
            var builder = new MessageBuilder();

            builder.Append(unitAdr);
            builder.Append(0x03);
            builder.Append(regAdr);
            builder.Append(regCount);

            byte[] resp       = new byte[256];
            int    respLength = SendAndRecv(builder.ToArray(), resp, out int offset);
            var    reader     = new MessageReader(resp, offset, respLength);

            byte recvUnitAdr = reader.ReadByte();

            if (recvUnitAdr != unitAdr)
            {
                throw new FormatException($"Unexpected unit address ({recvUnitAdr} != {unitAdr}).");
            }

            byte recvFuncCode = reader.ReadByte();

            if ((recvFuncCode & 0x80) != 0)
            {
                throw new ModbusException(reader.ReadByte());
            }

            if (recvFuncCode != 0x03)
            {
                throw new FormatException($"Unexpected function code ({recvFuncCode} != 3).");
            }

            if (reader.Count != 3 + 2 * regCount)
            {
                throw new FormatException($"Modbus response wrong length for 0x03 ({reader.Count} != {3 + 2 * regCount}).");
            }

            byte recvByteCount = reader.ReadByte();

            if (recvByteCount != 2 * regCount)
            {
                throw new FormatException($"Invalid byte count ({recvByteCount} != {2 * regCount}).");
            }

            ushort[] result = new ushort[regCount];
            for (int i = 0; i < regCount; i++)
            {
                result[i] = reader.ReadUShort(endianness);
            }

            return(result);
        }