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"); } }
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); }
public void Append(short value, Endianness16 endianness = Endianness16.AB) { Append((ushort)value, endianness); }
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); }