namespace NModbus.Extensions { using System; /// /// Utility Class to support Modbus 32/64bit devices. /// public class ModbusMasterEnhanced { private readonly IModbusMaster master; private readonly uint wordSize; private readonly Func endian; private readonly bool wordSwapped; /// /// Constructor with values to be used by all methods. /// Default is 32bit, LittleEndian, with wordswapping. /// /// The Modbus master /// Wordsize used by device. 16/32/64 are valid. /// The endian encoding of the device. /// Should the ushort words mirrored then flattened to bytes. public ModbusMasterEnhanced(IModbusMaster master, uint wordSize=32, Func? endian = null, bool wordSwapped = false) { this.master = master; this.wordSize = wordSize; this.endian = endian ?? Functions.Endian.LittleEndian; this.wordSwapped = wordSwapped; } /// /// Reads registers and converts the result into a char array. /// /// Address of device to read values from. /// Address to begin reading. /// Number of chars to read. /// public char[] ReadCharHoldingRegisters(byte slaveAddress, ushort startAddress, ushort numberOfPoints) => Functions.RegisterFunctions.ByteValueArraysToChars( Functions.RegisterFunctions.ReadRegisters(slaveAddress, startAddress, numberOfPoints, this.master, this.wordSize, this.endian, this.wordSwapped)); /// /// Reads registers and converts the result into a ushort array. /// /// Address of device to read values from. /// Address to begin reading. /// Number of ushorts to read. /// public ushort[] ReadUshortHoldingRegisters(byte slaveAddress, ushort startAddress, ushort numberOfPoints) => Functions.RegisterFunctions.ByteValueArraysToUShorts( Functions.RegisterFunctions.ReadRegisters(slaveAddress, startAddress, numberOfPoints, this.master, this.wordSize, this.endian, this.wordSwapped)); /// /// Reads registers and converts the result into a short array. /// /// Address of device to read values from. /// Address to begin reading. /// Number of shots to read. /// public short[] ReadShortHoldingRegisters(byte slaveAddress, ushort startAddress, ushort numberOfPoints) => Functions.RegisterFunctions.ByteValueArraysToShorts( Functions.RegisterFunctions.ReadRegisters(slaveAddress, startAddress, numberOfPoints, this.master, this.wordSize, this.endian, this.wordSwapped)); /// /// Reads registers and converts the result into a uint array. /// /// Address of device to read values from. /// Address to begin reading. /// Number of uints to read. /// public uint[] ReadUintHoldingRegisters(byte slaveAddress, ushort startAddress, ushort numberOfPoints) => Functions.RegisterFunctions.ByteValueArraysToUInts( Functions.RegisterFunctions.ReadRegisters(slaveAddress, startAddress, numberOfPoints, this.master, this.wordSize, this.endian, this.wordSwapped)); /// /// Reads registers and converts the result into a int array. /// /// Address of device to read values from. /// Address to begin reading. /// Number of ints to read. /// public int[] ReadIntHoldingRegisters(byte slaveAddress, ushort startAddress, ushort numberOfPoints) => Functions.RegisterFunctions.ByteValueArraysToInts( Functions.RegisterFunctions.ReadRegisters(slaveAddress, startAddress, numberOfPoints, this.master, this.wordSize, this.endian, this.wordSwapped)); /// /// Reads registers and converts the result into a float array. /// /// Address of device to read values from. /// Address to begin reading. /// Number of floats to read. /// public float[] ReadFloatHoldingRegisters(byte slaveAddress, ushort startAddress, ushort numberOfPoints) => Functions.RegisterFunctions.ByteValueArraysToFloats( Functions.RegisterFunctions.ReadRegisters(slaveAddress, startAddress, numberOfPoints, this.master, this.wordSize, this.endian, this.wordSwapped)); /// /// Write a char array to registers. /// /// Address of the device to write to. /// Address to start writting values at. /// Chars to write to device. public void WriteCharHoldingRegisters(byte slaveAddress, ushort startAddress, char[] data) => Functions.RegisterFunctions.WriteRegistersFunc( slaveAddress, startAddress, Functions.RegisterFunctions.CharsToByteValueArrays(data, this.wordSize), this.master, this.wordSize, this.endian, this.wordSwapped); /// /// Write a ushort array to registers. /// /// Address of the device to write to. /// Address to start writting values at. /// Ushorts to write to device. public void WriteUshortHoldingRegisters(byte slaveAddress, ushort startAddress, ushort[] data) => Functions.RegisterFunctions.WriteRegistersFunc( slaveAddress, startAddress, Functions.RegisterFunctions.UShortsToByteValueArrays(data, this.wordSize), this.master, this.wordSize, this.endian, this.wordSwapped); /// /// Write a short array to registers. /// /// Address of the device to write to. /// Address to start writting values at. /// Shorts to write to device. public void WriteShortHoldingRegisters(byte slaveAddress, ushort startAddress, short[] data) => Functions.RegisterFunctions.WriteRegistersFunc( slaveAddress, startAddress, Functions.RegisterFunctions.ShortsToByteValueArrays(data, this.wordSize), this.master, this.wordSize, this.endian, this.wordSwapped); /// /// Write a int array to registers. /// /// Address of the device to write to. /// Address to start writting values at. /// Ints to write to device. public void WriteIntHoldingRegisters(byte slaveAddress, ushort startAddress, int[] data) => Functions.RegisterFunctions.WriteRegistersFunc( slaveAddress, startAddress, Functions.RegisterFunctions.IntToByteValueArrays(data, this.wordSize), this.master, this.wordSize, this.endian, this.wordSwapped); /// /// Write a uint array to registers. /// /// Address of the device to write to. /// Address to start writting values at. /// Uints to write to device. public void WriteUIntHoldingRegisters(byte slaveAddress, ushort startAddress, uint[] data) => Functions.RegisterFunctions.WriteRegistersFunc( slaveAddress, startAddress, Functions.RegisterFunctions.UIntToByteValueArrays(data, this.wordSize), this.master, this.wordSize, this.endian, this.wordSwapped); /// /// Write a float array to registers. /// /// Address of the device to write to. /// Address to start writting values at. /// Floats to write to device. public void WriteFloatHoldingRegisters(byte slaveAddress, ushort startAddress, float[] data) => Functions.RegisterFunctions.WriteRegistersFunc( slaveAddress, startAddress, Functions.RegisterFunctions.FloatToByteValueArrays(data, this.wordSize), this.master, this.wordSize, this.endian, this.wordSwapped); } }