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);
}
}