From 7b0c7dce36beffab6140d23d0b55493efe08711e Mon Sep 17 00:00:00 2001 From: ig Date: Thu, 4 May 2023 09:32:35 +0200 Subject: [PATCH] modbus v2 --- .../Lib/Protocols/Modbus/Channels/Channel.cs | 7 + .../Modbus/Channels/ConnectionChannel.cs | 82 +++++++ .../PushToPullHelper.cs | 12 +- .../Modbus/Channels/RemoteSerialChannel.cs | 207 ++++++++++++++++ .../Modbus/Channels/SerialPortChannel.cs | 67 +++++ .../Protocols/Modbus/Channels/TcpChannel.cs | 48 ++++ .../Protocols/Modbus/Clients/ModbusClient.cs | 39 +-- .../Modbus/Clients/ModbusRtuClient.cs | 57 ++--- .../Protocols/Modbus/Clients/ModbusSlave.cs | 159 ------------ .../Modbus/Clients/ModbusTcpClient.cs | 124 +++++----- .../Modbus/Connections/ModbusConnection.cs | 12 - .../Connections/ModbusSerialConnection.cs | 84 ------- .../Modbus/Connections/ModbusTcpConnection.cs | 66 ----- .../Connections/RemoteSerialConnection.cs | 113 --------- .../Doc/Modbus_Application_Protocol_V1_1b.pdf | Bin 0 -> 328426 bytes csharp/Lib/Protocols/Modbus/Modbus.csproj | 2 - .../Protocol/Frames/Accessors/Accessors.cs | 2 +- .../Protocol/Frames/Accessors/Endian.cs | 7 + .../Protocol/Frames/Accessors/MbBits.cs | 44 ++-- .../Protocol/Frames/Accessors/MbData.cs | 232 ++++++++++++++++++ .../Protocol/Frames/Accessors/MbRegisters.cs | 90 ------- .../Protocol/Frames/Accessors/MbWords.cs | 46 ++-- .../Frames/Commands/ReadCoilsCommandFrame.cs | 19 +- .../ReadHoldingRegistersCommandFrame.cs | 8 +- .../ReadInputRegistersCommandFrame.cs | 1 - .../ReadWriteRegistersCommandFrame.cs | 10 +- .../Frames/Commands/WriteCoilsCommandFrame.cs | 4 +- .../Commands/WriteRegistersCommandFrame.cs | 4 +- .../Frames/Replies/ReadCoilsResponseFrame.cs | 16 +- .../ReadDiscreteInputsResponseFrame.cs | 6 +- .../ReadHoldingRegistersResponseFrame.cs | 3 +- .../ReadInputRegistersResponseFrame.cs | 4 +- .../Frames/Replies/WriteCoilsResponseFrame.cs | 5 +- .../Replies/WriteRegistersResponseFrame.cs | 2 +- .../Attributes/AddressOffsetAttribute.cs | 11 + .../Attributes/DiscreteInputAttribute.cs | 1 - .../Attributes/HoldingRegisterAttribute.cs | 7 +- .../Attributes/InputRegisterAttribute.cs | 5 +- .../Reflection/Attributes/ModbusAttribute.cs | 32 ++- .../Attributes/ModbusBooleanAttribute.cs | 3 +- .../Attributes/ModbusRegisterAttribute.cs | 29 ++- .../Lib/Protocols/Modbus/Reflection/Batch.cs | 115 +++++++++ .../Protocols/Modbus/Reflection/Batches.cs | 100 -------- .../Protocols/Modbus/Reflection/IAddress.cs | 6 - .../Modbus/Reflection/ModbusBoolean.cs | 54 ---- .../Modbus/Reflection/ModbusMember.cs | 179 ++++++++++++++ .../Modbus/Reflection/ModbusRegister.cs | 98 -------- .../Lib/Protocols/Modbus/Reflection/Record.cs | 17 ++ .../Protocols/Modbus/Slaves/ModbusDevice.cs | 53 ++++ .../Protocols/Modbus/Slaves/ModbusEncoding.cs | 7 + .../Protocols/Modbus/Slaves/ModbusProtocol.cs | 7 + .../Protocols/Modbus/Slaves/ModbusSlave.cs | 55 +++++ .../Modbus/Util/ArraySegmentExtensions.cs | 16 +- 53 files changed, 1381 insertions(+), 996 deletions(-) create mode 100644 csharp/Lib/Protocols/Modbus/Channels/Channel.cs create mode 100644 csharp/Lib/Protocols/Modbus/Channels/ConnectionChannel.cs rename csharp/Lib/Protocols/Modbus/{Connections => Channels}/PushToPullHelper.cs (75%) create mode 100644 csharp/Lib/Protocols/Modbus/Channels/RemoteSerialChannel.cs create mode 100644 csharp/Lib/Protocols/Modbus/Channels/SerialPortChannel.cs create mode 100644 csharp/Lib/Protocols/Modbus/Channels/TcpChannel.cs delete mode 100644 csharp/Lib/Protocols/Modbus/Clients/ModbusSlave.cs delete mode 100644 csharp/Lib/Protocols/Modbus/Connections/ModbusConnection.cs delete mode 100644 csharp/Lib/Protocols/Modbus/Connections/ModbusSerialConnection.cs delete mode 100644 csharp/Lib/Protocols/Modbus/Connections/ModbusTcpConnection.cs delete mode 100644 csharp/Lib/Protocols/Modbus/Connections/RemoteSerialConnection.cs create mode 100644 csharp/Lib/Protocols/Modbus/Doc/Modbus_Application_Protocol_V1_1b.pdf create mode 100644 csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/Endian.cs create mode 100644 csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbData.cs delete mode 100644 csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbRegisters.cs create mode 100644 csharp/Lib/Protocols/Modbus/Reflection/Attributes/AddressOffsetAttribute.cs create mode 100644 csharp/Lib/Protocols/Modbus/Reflection/Batch.cs delete mode 100644 csharp/Lib/Protocols/Modbus/Reflection/Batches.cs delete mode 100644 csharp/Lib/Protocols/Modbus/Reflection/IAddress.cs delete mode 100644 csharp/Lib/Protocols/Modbus/Reflection/ModbusBoolean.cs create mode 100644 csharp/Lib/Protocols/Modbus/Reflection/ModbusMember.cs delete mode 100644 csharp/Lib/Protocols/Modbus/Reflection/ModbusRegister.cs create mode 100644 csharp/Lib/Protocols/Modbus/Reflection/Record.cs create mode 100644 csharp/Lib/Protocols/Modbus/Slaves/ModbusDevice.cs create mode 100644 csharp/Lib/Protocols/Modbus/Slaves/ModbusEncoding.cs create mode 100644 csharp/Lib/Protocols/Modbus/Slaves/ModbusProtocol.cs create mode 100644 csharp/Lib/Protocols/Modbus/Slaves/ModbusSlave.cs diff --git a/csharp/Lib/Protocols/Modbus/Channels/Channel.cs b/csharp/Lib/Protocols/Modbus/Channels/Channel.cs new file mode 100644 index 000000000..9fd8ec731 --- /dev/null +++ b/csharp/Lib/Protocols/Modbus/Channels/Channel.cs @@ -0,0 +1,7 @@ +namespace InnovEnergy.Lib.Protocols.Modbus.Channels; + +public abstract class Channel +{ + public abstract IReadOnlyList Read(Int32 nBytes); + public abstract void Write(IReadOnlyList bytes); +} \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Channels/ConnectionChannel.cs b/csharp/Lib/Protocols/Modbus/Channels/ConnectionChannel.cs new file mode 100644 index 000000000..bafbe947c --- /dev/null +++ b/csharp/Lib/Protocols/Modbus/Channels/ConnectionChannel.cs @@ -0,0 +1,82 @@ +namespace InnovEnergy.Lib.Protocols.Modbus.Channels; + +public abstract class ConnectionChannel : Channel, IDisposable +{ + private readonly Func _CloseAfterException ; + private readonly Boolean _CloseAfterSuccessfulRead ; + private readonly Boolean _CloseAfterSuccessfulWrite ; + + protected abstract T Open(); + protected abstract void Close(T connection); + + protected abstract IReadOnlyList Read (T connection, Int32 nBytes); + protected abstract void Write(T connection, IReadOnlyList data); + + private T? _Connection; + + protected ConnectionChannel(Boolean closeAfterSuccessfulRead = false, + Boolean closeAfterSuccessfulWrite = false, + Func? closeAfterException = null) + { + _CloseAfterSuccessfulRead = closeAfterSuccessfulRead; + _CloseAfterSuccessfulWrite = closeAfterSuccessfulWrite; + _CloseAfterException = closeAfterException ?? (_ => true); + } + + public override IReadOnlyList Read(Int32 nBytes) + { + try + { + return Read(Connection, nBytes); + } + catch (Exception e) + { + if (_CloseAfterException(e)) + Close(); + + throw; + } + finally + { + if (_CloseAfterSuccessfulRead) + Close(); + } + } + + + public override void Write(IReadOnlyList data) + { + try + { + Write(Connection, data); + } + catch (Exception e) + { + if (_CloseAfterException(e)) + Close(); + + throw; + } + finally + { + if (_CloseAfterSuccessfulWrite) + Close(); + } + } + + + private T Connection => _Connection ??= Open(); + + + private void Close() + { + if (_Connection is null) + return; + + Close(_Connection); + _Connection = default; + } + + + public void Dispose() => Close(); +} \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Connections/PushToPullHelper.cs b/csharp/Lib/Protocols/Modbus/Channels/PushToPullHelper.cs similarity index 75% rename from csharp/Lib/Protocols/Modbus/Connections/PushToPullHelper.cs rename to csharp/Lib/Protocols/Modbus/Channels/PushToPullHelper.cs index ad78f46e8..115b97795 100644 --- a/csharp/Lib/Protocols/Modbus/Connections/PushToPullHelper.cs +++ b/csharp/Lib/Protocols/Modbus/Channels/PushToPullHelper.cs @@ -1,7 +1,7 @@ using System.Reactive.Linq; using InnovEnergy.Lib.Utils; -namespace InnovEnergy.Lib.Protocols.Modbus.Connections; +namespace InnovEnergy.Lib.Protocols.Modbus.Channels; public static class PushToPullHelper { @@ -14,12 +14,16 @@ public static class PushToPullHelper var nAvailable = src .Do(buffer.Enqueue) .Select(_ => buffer.Count) - .Publish(); - - nAvailable.Connect(); + .Publish() + .RefCount(); + nAvailable.SelectError() + .Subscribe(e => e.WriteLine()); + async Task> Read(Int32 n) { + Console.WriteLine($"requesting {n}"); + var available = buffer.Count; if (available < n) available = await nAvailable.FirstOrDefaultAsync(a => a >= n); diff --git a/csharp/Lib/Protocols/Modbus/Channels/RemoteSerialChannel.cs b/csharp/Lib/Protocols/Modbus/Channels/RemoteSerialChannel.cs new file mode 100644 index 000000000..46fd27f72 --- /dev/null +++ b/csharp/Lib/Protocols/Modbus/Channels/RemoteSerialChannel.cs @@ -0,0 +1,207 @@ +using System.Diagnostics.CodeAnalysis; +using System.IO.Ports; +using System.Reactive.Linq; +using CliWrap; +using InnovEnergy.Lib.Utils; + +namespace InnovEnergy.Lib.Protocols.Modbus.Channels; + +public record RemoteSerialConnection + ( + Func> Read, + Action> Write, + Action Close + ); + + +// public class RemoteSerialChannel : ConnectionChannel +// { +// private readonly Command _Command; +// +// public RemoteSerialChannel(SshHost host, +// String tty, +// Int32 baudRate, +// Parity parity, +// Int32 stopBits, +// Int32 dataBits) +// { +// tty = tty.EnsureStartsWith("/dev/"); +// +// var configureTty = ConfigureTty(tty, baudRate, parity, stopBits, dataBits); +// var redirectStreams = RedirectStreams(tty); +// +// var call = $"{configureTty}; {redirectStreams}"; +// +// _Command = host +// .Command +// .AppendArgument(call); +// +// _Command.WriteLine(); +// } +// +// +// protected override RemoteSerialConnection Open() +// { +// var observableProcess = new ObservableProcess(_Command); +// +// observableProcess.Start(); +// +// +// IReadOnlyList Read(Int32 i) +// { +// return observableProcess.Read(i).Result; +// } +// +// void Write(IReadOnlyList data) => observableProcess.StdIn.OnNext(data.ToArray()); +// +// return new RemoteSerialConnection(Read, Write, observableProcess.Interrupt); +// } +// +// protected override void Close(RemoteSerialConnection connection) +// { +// connection.Close(); +// } +// +// protected override IReadOnlyList Read(RemoteSerialConnection connection, Int32 nBytes) +// { +// return connection.Read(nBytes); +// } +// +// protected override void Write(RemoteSerialConnection connection, IReadOnlyList data) +// { +// connection.Write(data); +// } +// +// +// private static String RedirectStreams(String tty) +// { +// // https://unix.stackexchange.com/questions/19604/all-about-ssh-proxycommand +// +// return $"exec 3<>{tty}; " + +// $"cat <&3 & cat >&3; " + +// // $"(cat <&3 | tee -a ~/read) & cat | tee -a ~/write >&3; " + +// $"kill $!"; +// +// // var call = $"trap 'kill -HUP $(jobs -lp) 2>/dev/null || true' EXIT; " + +// // $"{configure} ; "+ +// // $"dd if={tty} of=/dev/stdout bs=1 & " + +// // $"dd if=/dev/stdin of={tty} bs=1 ;" +// } +// +// [SuppressMessage("ReSharper", "StringLiteralTypo")] +// private static String ConfigureTty(String tty, Int32 baudRate, Parity parity, Int32 stopBits, Int32 dataBits) +// { +// var oParity = parity switch +// { +// Parity.Even => "parenb -parodd", +// Parity.Odd => "parenb parodd", +// Parity.None => "-parenb", +// _ => throw new NotImplementedException() +// }; +// +// var oStopBits = stopBits switch +// { +// 1 => "-cstopb", +// 2 => "cstopb", +// _ => throw new NotImplementedException() +// }; +// +// var oDataBits = "cs" + dataBits; +// +// return $"stty -F {tty} {baudRate} {oDataBits} {oStopBits} {oParity}"; +// } +// +// } + +public class RemoteSerialChannel : ConnectionChannel +{ + private readonly Command _Command; + private readonly TcpChannel _TcpChannel; + + const String SsDir = "/opt/victronenergy/serial-starter"; + const String KillTasks = "kill $!"; + + private CancellationTokenSource _CancellationTokenSource = new CancellationTokenSource(); + + private CommandTask? _CommandTask; + + public RemoteSerialChannel(SshHost host, + String tty, + Int32 baudRate, + Parity parity, + Int32 stopBits, + Int32 dataBits) + { + const Int32 port = 6855; + + tty = tty.EnsureStartsWith("/dev/"); + + var configureTty = ConfigureTty(tty, baudRate, parity, stopBits, dataBits); + + var stopTty = $"{SsDir}/stop-tty.sh {tty}"; + var startTty = $"{SsDir}/start-tty.sh {tty}"; + + // ReSharper disable once StringLiteralTypo + var socat = $"socat TCP-LISTEN:{port},nodelay {tty},raw"; + + //var script = $"-n -o RemoteCommand='{stopTty}; {configureTty} && {socat} ; {startTty} ; {KillTasks}'"; + var script = $"{stopTty}; {configureTty} && {socat} ; {startTty} ; {KillTasks}"; + + _Command = host.Command.AppendArgument(script); + + _Command.WriteLine(); + + _TcpChannel = new TcpChannel(host.HostName, port); + } + + private static String ConfigureTty(String tty, Int32 baudRate, Parity parity, Int32 stopBits, Int32 dataBits) + { + var oParity = parity switch + { + Parity.Even => "parenb -parodd", + Parity.Odd => "parenb parodd", + Parity.None => "-parenb", + _ => throw new NotImplementedException() + }; + + var oStopBits = stopBits switch + { + 1 => "-cstopb", + 2 => "cstopb", + _ => throw new NotImplementedException() + }; + + var oDataBits = "cs" + dataBits; + + return $"stty -F {tty} {baudRate} {oDataBits} {oStopBits} {oParity}"; + } + + + protected override TcpChannel Open() + { + _CommandTask ??= _Command.ExecuteAsync(_CancellationTokenSource.Token); + + Thread.Sleep(2000); // wait until socat is ready + return _TcpChannel; + } + + protected override void Close(TcpChannel connection) + { + _CancellationTokenSource.Cancel(); + connection.Dispose(); + + _CommandTask = null; + + _CancellationTokenSource = new CancellationTokenSource(); + } + + protected override IReadOnlyList Read(TcpChannel connection, Int32 nBytes) + { + return connection.Read(nBytes); + } + + protected override void Write(TcpChannel connection, IReadOnlyList data) + { + connection.Write(data); + } +} \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Channels/SerialPortChannel.cs b/csharp/Lib/Protocols/Modbus/Channels/SerialPortChannel.cs new file mode 100644 index 000000000..904be5b29 --- /dev/null +++ b/csharp/Lib/Protocols/Modbus/Channels/SerialPortChannel.cs @@ -0,0 +1,67 @@ +using System.IO.Ports; +using CliWrap; +using InnovEnergy.Lib.Protocols.Modbus.Protocol; + +namespace InnovEnergy.Lib.Protocols.Modbus.Channels; + +public class SerialPortChannel : ConnectionChannel +{ + private readonly Func _Open; + + public SerialPortChannel(String portName, + Int32 baudRate, + Parity parity, + Int32 dataBits, + Int32 stopBits, + Boolean closeAfterSuccessfulRead = false, + Boolean closeAfterSuccessfulWrite = false) + : + base( + closeAfterSuccessfulRead, + closeAfterSuccessfulWrite + ) + { + var sb = stopBits switch + { + 0 => StopBits.None, + 1 => StopBits.One, + 2 => StopBits.Two, + _ => StopBits.OnePointFive + }; + + _Open = () => + { + var serialPort = new SerialPort(portName, baudRate, parity, dataBits, sb); + serialPort.Open(); + return serialPort; + }; + } + + protected override SerialPort Open() => _Open(); + + protected override void Close(SerialPort serialPort) => serialPort.Dispose(); + + protected override IReadOnlyList Read(SerialPort serialPort, Int32 nBytes) + { + var buffer = new Byte[nBytes]; + + var bytesReceived = 0; + do + { + var received = serialPort.Read(buffer, bytesReceived, nBytes - bytesReceived); + if (received < 0) + throw new NotConnectedException("Serial Connection has been closed"); + + bytesReceived += received; + } + while (bytesReceived < nBytes); + + return buffer; + } + + protected override void Write(SerialPort serialPort, IReadOnlyList data) + { + var array = data.ToArray(); + serialPort.Write(array, 0, array.Length); + } +} \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Channels/TcpChannel.cs b/csharp/Lib/Protocols/Modbus/Channels/TcpChannel.cs new file mode 100644 index 000000000..f21946408 --- /dev/null +++ b/csharp/Lib/Protocols/Modbus/Channels/TcpChannel.cs @@ -0,0 +1,48 @@ +using System.Net.Sockets; +using InnovEnergy.Lib.Protocols.Modbus.Protocol; + +namespace InnovEnergy.Lib.Protocols.Modbus.Channels; + +public class TcpChannel : ConnectionChannel +{ + public TcpChannel(String hostname, + Int32 port, + Boolean closeAfterSuccessfulRead = false, + Boolean closeAfterSuccessfulWrite = false) : base(closeAfterSuccessfulRead, closeAfterSuccessfulWrite) + { + TcpClient Open() => new(hostname, port); + _Open = Open; + } + + private readonly Func _Open; + + protected override TcpClient Open() => _Open(); + protected override void Close(TcpClient tcpClient) => tcpClient.Close(); + + protected override IReadOnlyList Read(TcpClient tcpClient, Int32 nToRead) + { + var buffer = new Byte[nToRead]; + + var stream = tcpClient.GetStream(); + var nReceived = 0; + + do + { + var nRemaining = nToRead - nReceived; + var read = stream.Read(buffer, nReceived, nRemaining); + if (read <= 0) + throw new NotConnectedException("The TCP Connection was closed"); + + nReceived += read; + } + while (nReceived < nToRead); + + return buffer; + } + + protected override void Write(TcpClient tcpClient, IReadOnlyList data) + { + var array = data.ToArray(); + tcpClient.GetStream().Write(array, 0, array.Length); + } +} \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Clients/ModbusClient.cs b/csharp/Lib/Protocols/Modbus/Clients/ModbusClient.cs index 0e2e7d158..2aba23c4d 100644 --- a/csharp/Lib/Protocols/Modbus/Clients/ModbusClient.cs +++ b/csharp/Lib/Protocols/Modbus/Clients/ModbusClient.cs @@ -1,35 +1,38 @@ -using InnovEnergy.Lib.Protocols.Modbus.Connections; +using InnovEnergy.Lib.Protocols.Modbus.Channels; +using InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Accessors; namespace InnovEnergy.Lib.Protocols.Modbus.Clients; -using Booleans = IReadOnlyList; -using UInt16s = IReadOnlyList; +using Booleans = IReadOnlyCollection; +using UInt16s = IReadOnlyCollection; // TODO: ModbusClient = Framer(TCP/RTU) + Connection(Serial/TCP) + Encoder(binary/ascii) + quirk(+1/0) // Transport public abstract class ModbusClient { - internal ModbusConnection Connection { get; } - internal Byte SlaveId { get; } + internal Channel Channel { get; } + internal Byte SlaveId { get; } + internal Endian Endian { get; } // TODO: add additional functions: coils... - public abstract Booleans ReadCoils (UInt16 readAddress, UInt16 nValues); - public abstract Booleans ReadDiscreteInputs (UInt16 readAddress, UInt16 nValues); - public abstract UInt16s ReadInputRegisters (UInt16 readAddress, UInt16 nValues); - public abstract UInt16s ReadHoldingRegisters(UInt16 readAddress, UInt16 nValues); - public abstract UInt16 WriteCoils (UInt16 writeAddress, Booleans coils); - public abstract UInt16 WriteRegisters (UInt16 writeAddress, UInt16s values); + public abstract MbData ReadCoils (UInt16 readAddress, UInt16 nValues); + public abstract MbData ReadDiscreteInputs (UInt16 readAddress, UInt16 nValues); + public abstract MbData ReadInputRegisters (UInt16 readAddress, UInt16 nValues); + public abstract MbData ReadHoldingRegisters(UInt16 readAddress, UInt16 nValues); + public abstract UInt16 WriteCoils (UInt16 writeAddress, Booleans coils); + public abstract UInt16 WriteRegisters (UInt16 writeAddress, UInt16s values); - public abstract UInt16s ReadWriteRegisters (UInt16 readAddress, - UInt16 nbToRead, - UInt16 writeAddress, - UInt16s registersToWrite); + public abstract MbData ReadWriteRegisters (UInt16 readAddress, + UInt16 nbToRead, + UInt16 writeAddress, + UInt16s registersToWrite); - protected ModbusClient(ModbusConnection connection, Byte slaveId) + protected ModbusClient(Channel channel, Byte slaveId, Endian endian = Endian.Little) { - Connection = connection; - SlaveId = slaveId; + Channel = channel; + SlaveId = slaveId; + Endian = endian; } } \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Clients/ModbusRtuClient.cs b/csharp/Lib/Protocols/Modbus/Clients/ModbusRtuClient.cs index 4e3afe361..b98107af1 100644 --- a/csharp/Lib/Protocols/Modbus/Clients/ModbusRtuClient.cs +++ b/csharp/Lib/Protocols/Modbus/Clients/ModbusRtuClient.cs @@ -1,8 +1,9 @@ using System.Diagnostics; using System.Runtime.CompilerServices; -using InnovEnergy.Lib.Protocols.Modbus.Connections; +using InnovEnergy.Lib.Protocols.Modbus.Channels; using InnovEnergy.Lib.Protocols.Modbus.Protocol; using InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames; +using InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Accessors; using InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Commands; using InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Replies; using InnovEnergy.Lib.Protocols.Modbus.Util; @@ -12,73 +13,69 @@ using static System.Runtime.CompilerServices.MethodImplOptions; namespace InnovEnergy.Lib.Protocols.Modbus.Clients; -using UInt16s = IReadOnlyList; +using UInt16s = IReadOnlyCollection; +using Booleans = IReadOnlyCollection; public class ModbusRtuClient : ModbusClient { private const Int32 CrcSize = 2; - public ModbusRtuClient(ModbusConnection connection, Byte slaveId) : base(connection, slaveId) + public ModbusRtuClient(Channel channel, Byte slaveId) : base(channel, slaveId) { } - public override IReadOnlyList ReadCoils(UInt16 readAddress, UInt16 nValues) + public override MbData ReadCoils(UInt16 readAddress, UInt16 nValues) { throw new NotImplementedException(); } - public override IReadOnlyList ReadDiscreteInputs(UInt16 readAddress, UInt16 nValues) + public override MbData ReadDiscreteInputs(UInt16 readAddress, UInt16 nValues) { throw new NotImplementedException(); } - public override UInt16s ReadInputRegisters(UInt16 readAddress, UInt16 nValues) + public override MbData ReadInputRegisters(UInt16 readAddress, UInt16 nValues) { var cmd = new ReadInputRegistersCommandFrame(SlaveId, readAddress, nValues); var crc = CalcCrc(cmd); // TX - cmd.Data.Concat(crc).Apply(Connection.Transmit); - - var nToRead = cmd.ExpectedResponseSize + CrcSize; + cmd.Data.Concat(crc).ToList().Apply(Channel.Write); // RX - var response = nToRead - .ConvertTo() - .Apply(Connection.Receive) + var response = Channel + .Read(cmd.ExpectedResponseSize + CrcSize) .ToArraySegment() .Apply(AssertCrc) .SkipLast(CrcSize) .Apply(ReadInputRegistersResponseFrame.Parse) .Apply(cmd.VerifyResponse); - return response.RegistersRead; + return new MbData(response.RegistersRead.RawData, readAddress, Endian); } - public override UInt16s ReadHoldingRegisters(UInt16 readAddress, UInt16 nValues) + public override MbData ReadHoldingRegisters(UInt16 readAddress, UInt16 nValues) { var cmd = new ReadHoldingRegistersCommandFrame(SlaveId, readAddress, nValues); var crc = CalcCrc(cmd.Data); // TX - cmd.Data.Concat(crc).Apply(Connection.Transmit); + cmd.Data.Concat(crc).ToList().Apply(Channel.Write); // RX - var nToRead = cmd.ExpectedResponseSize + CrcSize; - var response = nToRead - .ConvertTo() - .Apply(Connection.Receive) + var response = Channel + .Read(cmd.ExpectedResponseSize + CrcSize) .ToArraySegment() .Apply(AssertCrc) .SkipLast(CrcSize) .Apply(ReadHoldingRegistersResponseFrame.Parse) .Apply(cmd.VerifyResponse); - return response.RegistersRead; + return new MbData(response.RegistersRead.RawData, readAddress, Endian); } - public override UInt16 WriteCoils(UInt16 writeAddress, IReadOnlyList coils) + public override UInt16 WriteCoils(UInt16 writeAddress, Booleans coils) { throw new NotImplementedException(); } @@ -88,16 +85,13 @@ public class ModbusRtuClient : ModbusClient { var cmd = new WriteRegistersCommandFrame(SlaveId, writeAddress, values); var crc = CalcCrc(cmd); - var nToRead = cmd.ExpectedResponseSize + CrcSize; // TX - cmd.Data.Concat(crc).Apply(Connection.Transmit); - + cmd.Data.Concat(crc).ToList().Apply(Channel.Write); // RX - var response = nToRead - .ConvertTo() - .Apply(Connection.Receive) + var response = Channel + .Read(cmd.ExpectedResponseSize + CrcSize) .ToArraySegment() .Apply(AssertCrc) .SkipLast(CrcSize) @@ -107,7 +101,7 @@ public class ModbusRtuClient : ModbusClient return response.NbWritten; } - public override UInt16s ReadWriteRegisters(UInt16 readAddress, UInt16 nbToRead, UInt16 writeAddress, UInt16s registersToWrite) + public override MbData ReadWriteRegisters(UInt16 readAddress, UInt16 nbToRead, UInt16 writeAddress, UInt16s registersToWrite) { var cmd = new ReadWriteRegistersCommandFrame(SlaveId, readAddress, @@ -117,19 +111,18 @@ public class ModbusRtuClient : ModbusClient var crc = CalcCrc(cmd); // TX - cmd.Data.Concat(crc).Apply(Connection.Transmit); + cmd.Data.Concat(crc).ToList().Apply(Channel.Write); // RX var nToRead = cmd.ExpectedResponseSize + CrcSize; var response = nToRead - .ConvertTo() - .Apply(Connection.Receive) + .Apply(Channel.Read) .ToArraySegment() .SkipLast(CrcSize) .Apply(ReadWriteRegistersResponseFrame.Parse) .Apply(cmd.VerifyResponse); - return response.RegistersRead; + return new MbData(response.RegistersRead.RawData, readAddress, Endian); } public static ArraySegment AssertCrc(ArraySegment data) diff --git a/csharp/Lib/Protocols/Modbus/Clients/ModbusSlave.cs b/csharp/Lib/Protocols/Modbus/Clients/ModbusSlave.cs deleted file mode 100644 index 0d854cb9f..000000000 --- a/csharp/Lib/Protocols/Modbus/Clients/ModbusSlave.cs +++ /dev/null @@ -1,159 +0,0 @@ -using InnovEnergy.Lib.Protocols.Modbus.Reflection; -using InnovEnergy.Lib.Protocols.Modbus.Reflection.Attributes; - -namespace InnovEnergy.Lib.Protocols.Modbus.Clients; - -public class ModbusSlave where S : notnull, new() where C : notnull -{ - private readonly ModbusClient _ModbusClient; - - public ModbusSlave(ModbusClient modbusClient) => _ModbusClient = modbusClient; - - public S? Read() - { - try - { - return ReadInto(new S()); - } - catch (Exception e) - { - return default; // TODO :stdErr - } - } - - public Exception? Write(C controlRecord) - { - try - { - WriteHoldingRegisters(controlRecord); - WriteCoils(controlRecord); - } - catch (Exception e) - { - _ModbusClient.Connection.Close(); - return e; - } - - return default; - } - - - public S ReadInto(S statusRecord) - { - Int32 holdingRegisters; - Int32 coils; - Int32 inputRegisters; - Int32 discreteInputs; - - try - { - holdingRegisters = ReadHoldingRegisters(statusRecord).Count(); // force enumeration! - inputRegisters = ReadInputRegisters(statusRecord).Count(); - discreteInputs = ReadDiscreteInputs(statusRecord).Count(); - coils = ReadCoils(statusRecord).Count(); - } - catch (Exception e) - { - _ModbusClient.Connection.Close(); - throw; - } - - - var nUpdated = holdingRegisters - + inputRegisters - + discreteInputs - + coils; - - if (nUpdated == 0) - throw new ArgumentException(nameof(statusRecord)); - - return statusRecord; - } - - // returns an enumerable of read addresses - private IEnumerable ReadDiscreteInputs(Object statusRecord) - { - return from batch in statusRecord.GetModbusBooleanBatches() - let received = _ModbusClient.ReadDiscreteInputs(batch[0].Address, (UInt16)batch.Length) - from address in batch.SetStatusRecordMembersFromRawModbusValues(received) - select address; - } - - // returns an enumerable of read addresses - private IEnumerable ReadCoils(Object statusRecord) - { - return from batch in statusRecord.GetModbusBooleanBatches() - let received = _ModbusClient.ReadCoils(batch[0].Address, (UInt16)batch.Length) - from address in batch.SetStatusRecordMembersFromRawModbusValues(received) - select address; - } - - // returns an enumerable of read addresses - private IEnumerable ReadInputRegisters(Object statusRecord) - { - return from batch in statusRecord.GetModbusRegisterBatches() - let received = _ModbusClient.ReadInputRegisters(batch[0].Address, (UInt16)batch.Length) - from address in batch.SetStatusRecordMembersFromRawModbusValues(received) - select address; - } - - // returns an enumerable of read addresses - private IEnumerable ReadHoldingRegisters(Object statusRecord) - { - return from batch in statusRecord.GetModbusRegisterBatches() - let received = _ModbusClient.ReadHoldingRegisters(batch[0].Address, (UInt16)batch.Length) - from address in batch.SetStatusRecordMembersFromRawModbusValues(received) - select address; - } - - private Int32 WriteCoils(C controlRecord) - { - var nBatches = 0; - - foreach (var batch in controlRecord.GetModbusBooleanBatches()) - { - var values = batch.GetRawModbusValuesFromControlRecord(); - _ModbusClient.WriteCoils(batch[0].Address, values); - nBatches++; - } - - return nBatches; - } - - - private Int32 WriteHoldingRegisters(C controlRecord) - { - var nBatches = 0; - - foreach (var batch in controlRecord.GetModbusRegisterBatches()) - { - var values = batch.GetRawModbusValuesFromControlRecord(); - _ModbusClient.WriteRegisters(batch[0].Address, values); - nBatches++; - } - - return nBatches; - } - - -} - -public class ModbusSlave : ModbusSlave where T : notnull, new() -{ - public ModbusSlave(ModbusClient modbusClient) : base(modbusClient) - { - } -} - -public static class ModbusSlave -{ - public static ModbusSlave Slave(this ModbusClient modbusClient) where T : notnull, new() - { - return new ModbusSlave(modbusClient); - } - - public static ModbusSlave Slave(this ModbusClient modbusClient) where S : notnull, new() where C : notnull - { - return new ModbusSlave(modbusClient); - } -} \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Clients/ModbusTcpClient.cs b/csharp/Lib/Protocols/Modbus/Clients/ModbusTcpClient.cs index badcff48a..ff206717f 100644 --- a/csharp/Lib/Protocols/Modbus/Clients/ModbusTcpClient.cs +++ b/csharp/Lib/Protocols/Modbus/Clients/ModbusTcpClient.cs @@ -1,5 +1,6 @@ using System.Diagnostics; -using InnovEnergy.Lib.Protocols.Modbus.Connections; +using InnovEnergy.Lib.Protocols.Modbus.Channels; +using InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Accessors; using InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Commands; using InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Replies; using InnovEnergy.Lib.Protocols.Modbus.Tcp; @@ -8,8 +9,8 @@ using InnovEnergy.Lib.Utils; namespace InnovEnergy.Lib.Protocols.Modbus.Clients; -using UInt16s = IReadOnlyList; - +using UInt16s = IReadOnlyCollection; +using Booleans = IReadOnlyCollection; public class ModbusTcpClient : ModbusClient { @@ -20,11 +21,11 @@ public class ModbusTcpClient : ModbusClient private UInt16 NextId() => unchecked(++_Id); - public ModbusTcpClient(ModbusConnection connection, Byte slaveId) : base(connection, slaveId) + public ModbusTcpClient(Channel channel, Byte slaveId) : base(channel, slaveId) { } - public override IReadOnlyList ReadCoils(UInt16 readAddress, UInt16 nValues) + public override MbData ReadCoils(UInt16 readAddress, UInt16 nValues) { var id = NextId(); // TODO: check response id @@ -32,19 +33,22 @@ public class ModbusTcpClient : ModbusClient var hdr = new MbapHeader(id, cmd.Data.Count); var frm = new ModbusTcpFrame(hdr, cmd); - Connection.Transmit(frm.Data); + Channel.Write(frm.Data); - var hData = Connection.Receive(MbapHeader.Size).ToArray(); // TODO: optimize .ToArray() ? + var hData = Channel.Read(MbapHeader.Size).ToArray(); var rxHdr = new MbapHeader(hData); - var fData = Connection.Receive(rxHdr.FrameLength).ToArray(); // TODO: optimize .ToArray() ? - var rxFrm = ReadCoilsResponseFrame.Parse(fData); - - return cmd.VerifyResponse(rxFrm).Inputs; + var rxFrm = Channel + .Read(rxHdr.FrameLength) + .ToArray() // TODO: optimize .ToArray() ? + .Apply(ReadCoilsResponseFrame.Parse) + .Apply(cmd.VerifyResponse); + + return new MbData(rxFrm.Coils.RawData, readAddress, Endian); } - public override IReadOnlyList ReadDiscreteInputs(UInt16 readAddress, UInt16 nValues) + public override MbData ReadDiscreteInputs(UInt16 readAddress, UInt16 nValues) { var id = NextId(); // TODO: check response id @@ -52,18 +56,21 @@ public class ModbusTcpClient : ModbusClient var hdr = new MbapHeader(id, cmd.Data.Count); var frm = new ModbusTcpFrame(hdr, cmd); - Connection.Transmit(frm.Data); + Channel.Write(frm.Data); - var hData = Connection.Receive(MbapHeader.Size).ToArray(); // TODO: optimize .ToArray() ? + var hData = Channel.Read(MbapHeader.Size).ToArray(); // TODO: optimize .ToArray() ? var rxHdr = new MbapHeader(hData); - var fData = Connection.Receive(rxHdr.FrameLength).ToArray(); // TODO: optimize .ToArray() ? - var rxFrm = ReadDiscreteInputsResponseFrame.Parse(fData); - - return cmd.VerifyResponse(rxFrm).Inputs; + var rxFrm = Channel + .Read(rxHdr.FrameLength) + .ToArray() // TODO: optimize .ToArray() ? + .Apply(ReadDiscreteInputsResponseFrame.Parse) + .Apply(cmd.VerifyResponse); + + return new MbData(rxFrm.Inputs.RawData, readAddress, Endian); } - public override IReadOnlyList ReadInputRegisters(UInt16 readAddress, UInt16 nValues) + public override MbData ReadInputRegisters(UInt16 readAddress, UInt16 nValues) { var id = NextId(); // TODO: check response id @@ -71,56 +78,62 @@ public class ModbusTcpClient : ModbusClient var hdr = new MbapHeader(id, cmd.Data.Count); var frm = new ModbusTcpFrame(hdr, cmd); - Connection.Transmit(frm.Data); + Channel.Write(frm.Data); - var hData = Connection.Receive(MbapHeader.Size).ToArray(); + var hData = Channel.Read(MbapHeader.Size).ToArray(); var rxHdr = new MbapHeader(hData); - var fData = Connection.Receive(rxHdr.FrameLength).ToArray(); - var rxFrm = ReadInputRegistersResponseFrame.Parse(fData); + var rxFrm = Channel + .Read(rxHdr.FrameLength) + .ToArray() + .Apply(ReadInputRegistersResponseFrame.Parse) + .Apply(cmd.VerifyResponse); - var verified = cmd.VerifyResponse(rxFrm); - - return verified.RegistersRead; + return new MbData(rxFrm.RegistersRead.RawData, readAddress, Endian); } - public override IReadOnlyList ReadHoldingRegisters(UInt16 readAddress, UInt16 nValues) + public override MbData ReadHoldingRegisters(UInt16 readAddress, UInt16 nValues) { var id = NextId(); // TODO: check response id + var cmd = new ReadHoldingRegistersCommandFrame(SlaveId, readAddress, nValues); var hdr = new MbapHeader(id, cmd.Data.Count); var frm = new ModbusTcpFrame(hdr, cmd); - Connection.Transmit(frm.Data); + Channel.Write(frm.Data); - var hData = Connection.Receive(MbapHeader.Size).ToArray(MbapHeader.Size); + var hData = Channel.Read(MbapHeader.Size).ToArray(); var rxHdr = new MbapHeader(hData); - var fData = Connection.Receive(rxHdr.FrameLength).ToArray(rxHdr.FrameLength); - var rxFrm = ReadHoldingRegistersResponseFrame.Parse(fData); + var rxFrm = Channel + .Read(rxHdr.FrameLength) + .ToArray() + .Apply(ReadHoldingRegistersResponseFrame.Parse) + .Apply(cmd.VerifyResponse); - var verified = cmd.VerifyResponse(rxFrm); - - return verified.RegistersRead; // TODO + return new MbData(rxFrm.RegistersRead.RawData, readAddress, Endian); } - public override UInt16 WriteCoils(UInt16 writeAddress, IReadOnlyList coils) + public override UInt16 WriteCoils(UInt16 writeAddress, Booleans coils) { var id = NextId(); // TODO: check response id var cmd = new WriteCoilsCommandFrame(SlaveId, writeAddress, coils); var hdr = new MbapHeader(id, cmd.Data.Count); var frm = new ModbusTcpFrame(hdr, cmd); - Connection.Transmit(frm.Data); + Channel.Write(frm.Data); - var hData = Connection.Receive(MbapHeader.Size).ToArray(); + var hData = Channel.Read(MbapHeader.Size).ToArray(); var rxHdr = new MbapHeader(hData); - var fData = Connection.Receive(rxHdr.FrameLength).ToArray(); - var rxFrm = WriteCoilsResponseFrame.Parse(fData); + var rxFrm = Channel + .Read(rxHdr.FrameLength) + .ToArray() + .Apply(WriteCoilsResponseFrame.Parse) + .Apply(cmd.VerifyResponse); - return cmd.VerifyResponse(rxFrm).NbWritten; + return rxFrm.NbWritten; } @@ -131,20 +144,21 @@ public class ModbusTcpClient : ModbusClient var hdr = new MbapHeader(id, cmd.Data.Count); var frm = new ModbusTcpFrame(hdr, cmd); - Connection.Transmit(frm.Data); + Channel.Write(frm.Data); - var hData = Connection.Receive(MbapHeader.Size).ToArray(); + var hData = Channel.Read(MbapHeader.Size).ToArray(); var rxHdr = new MbapHeader(hData); - var fData = Connection.Receive(rxHdr.FrameLength).ToArray(); - var rxFrm = WriteRegistersResponseFrame.Parse(fData); + var rxFrm = Channel + .Read(rxHdr.FrameLength) + .ToArray() + .Apply(WriteRegistersResponseFrame.Parse) + .Apply(cmd.VerifyResponse); - var verified = cmd.VerifyResponse(rxFrm); - - return verified.NbWritten; + return rxFrm.NbWritten; } - public override IReadOnlyList ReadWriteRegisters(UInt16 readAddress, UInt16 nbToRead, UInt16 writeAddress, UInt16s registersToWrite) + public override MbData ReadWriteRegisters(UInt16 readAddress, UInt16 nbToRead, UInt16 writeAddress, UInt16s registersToWrite) { var id = NextId(); // TODO: check response id @@ -157,17 +171,17 @@ public class ModbusTcpClient : ModbusClient var hdr = new MbapHeader(id, cmd.Data.Count); var frm = new ModbusTcpFrame(hdr, cmd); - Connection.Transmit(frm.Data); + Channel.Write(frm.Data); - var hData = Enumerable.ToArray(Connection.Receive(MbapHeader.Size)); + var hData = Enumerable.ToArray(Channel.Read(MbapHeader.Size)); var rxHdr = new MbapHeader(hData); - var fData = Enumerable.ToArray(Connection.Receive(rxHdr.FrameLength)); - var rxFrm = ReadWriteRegistersResponseFrame.Parse(fData); + var fData = Enumerable.ToArray(Channel.Read(rxHdr.FrameLength)); + var rxFrm = fData + .Apply(ReadWriteRegistersResponseFrame.Parse) + .Apply(cmd.VerifyResponse); - var verified = cmd.VerifyResponse(rxFrm); - - return verified.RegistersRead; // TODO + return new MbData(rxFrm.RegistersRead.RawData, readAddress, Endian); } } \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Connections/ModbusConnection.cs b/csharp/Lib/Protocols/Modbus/Connections/ModbusConnection.cs deleted file mode 100644 index 30ad8d5a9..000000000 --- a/csharp/Lib/Protocols/Modbus/Connections/ModbusConnection.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace InnovEnergy.Lib.Protocols.Modbus.Connections; - - - -public abstract class ModbusConnection -{ - public abstract IReadOnlyList Receive(UInt16 nBytes); - public abstract void Transmit(IEnumerable bytes); - - public abstract void Open(); // calls to opening an already open connection must be ignored - public abstract void Close(); // calls to closing an already closed connection must be ignored, must not throw -} \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Connections/ModbusSerialConnection.cs b/csharp/Lib/Protocols/Modbus/Connections/ModbusSerialConnection.cs deleted file mode 100644 index 434bb467f..000000000 --- a/csharp/Lib/Protocols/Modbus/Connections/ModbusSerialConnection.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System.IO.Ports; -using InnovEnergy.Lib.Protocols.Modbus.Protocol; - -namespace InnovEnergy.Lib.Protocols.Modbus.Connections; - -public class ModbusSerialConnection : ModbusConnection -{ - private String PortName { get; } - private Int32 BaudRate { get; } - private Parity Parity { get; } - private Int32 DataBits { get; } - private StopBits StopBits { get; } - private Int32 TimeoutMs { get; } - - private Byte[] Buffer { get; } = new Byte[1024]; - private SerialPort? _SerialPort; - - public ModbusSerialConnection(String portName, Int32 baudRate, Parity parity, Int32 dataBits, StopBits stopBits, TimeSpan timeout) - { - PortName = portName; - BaudRate = baudRate; - Parity = parity; - DataBits = dataBits; - StopBits = stopBits; - TimeoutMs = (Int32) timeout.TotalMilliseconds; - } - - - public override IReadOnlyList Receive(UInt16 bytesToRead) - { - var bytesReceived = 0; - var serialPort = SerialPort(); - - do - { - var received = serialPort.Read(Buffer, bytesReceived, Buffer.Length - bytesReceived); - if (received < 0) - throw new NotConnectedException("Serial Connection has been closed"); - - bytesReceived += received; - } - while (bytesReceived < bytesToRead); - - return new ArraySegment(Buffer, 0, bytesToRead); - } - - public override void Transmit(IEnumerable data) - { - var array = data.ToArray(); - SerialPort().Write(array, 0, array.Length); - } - - public override void Open() => SerialPort(); - - private SerialPort SerialPort() - { - if (_SerialPort == null) - { - _SerialPort = new SerialPort(PortName, BaudRate, Parity, DataBits, StopBits) { ReadTimeout = TimeoutMs, WriteTimeout = TimeoutMs}; - _SerialPort.Open(); - } - - return _SerialPort; - } - - public override void Close() - { - if (_SerialPort != null) - { - try - { - _SerialPort.Close(); - _SerialPort?.Dispose(); - } - catch (Exception) - { - // ignored - } - } - - _SerialPort = null; - } - -} \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Connections/ModbusTcpConnection.cs b/csharp/Lib/Protocols/Modbus/Connections/ModbusTcpConnection.cs deleted file mode 100644 index 17b4c96c1..000000000 --- a/csharp/Lib/Protocols/Modbus/Connections/ModbusTcpConnection.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System.Net.Sockets; -using InnovEnergy.Lib.Protocols.Modbus.Protocol; - -namespace InnovEnergy.Lib.Protocols.Modbus.Connections; - -public class ModbusTcpConnection : ModbusConnection -{ - private String Hostname { get; } - private Int32 Port { get; } - - private Byte[] Buffer { get; } = new Byte[1024]; - private TcpClient? _TcpClient; - - public ModbusTcpConnection(String hostname, Int32 port = 502) - { - Hostname = hostname; - Port = port; - } - - public override IReadOnlyList Receive(UInt16 bytesToRead) - { - var bytesReceived = 0; - var stream = TcpClient().GetStream(); - - do - { - var maxBytes = Math.Min(bytesToRead, Buffer.Length) - bytesReceived; - var read = stream.Read(Buffer, bytesReceived, maxBytes); - if (read <= 0) - throw new NotConnectedException("The TCP Connection was closed"); - - bytesReceived += read; - } - while (bytesReceived < bytesToRead); - - return new ArraySegment(Buffer, 0, bytesToRead); - } - - public override void Transmit(IEnumerable data) - { - var array = data.ToArray(); - TcpClient().GetStream().Write(array, 0, array.Length); - } - - public override void Open() => TcpClient(); - - private TcpClient TcpClient() - { - return _TcpClient ??= new TcpClient(Hostname, Port); - } - - public override void Close() - { - try - { - _TcpClient?.Dispose(); - } - catch (Exception) - { - // ignored - } - - _TcpClient = null; - } - -} \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Connections/RemoteSerialConnection.cs b/csharp/Lib/Protocols/Modbus/Connections/RemoteSerialConnection.cs deleted file mode 100644 index 7140b62ed..000000000 --- a/csharp/Lib/Protocols/Modbus/Connections/RemoteSerialConnection.cs +++ /dev/null @@ -1,113 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using System.IO.Ports; -using System.Reactive.Linq; -using CliWrap; -using InnovEnergy.Lib.Utils; - -namespace InnovEnergy.Lib.Protocols.Modbus.Connections; - -public class RemoteSerialConnection : ModbusConnection -{ - private readonly Command _Command; - private ObservableProcess? _ObservableProcess; - private Func>>? _Read; - - - public RemoteSerialConnection(SshHost host, - String tty, - Int32 baudRate, - Parity parity, - Int32 stopBits, - Int32 dataBits) - { - tty = tty.EnsureStartsWith("/dev/"); - - var configure = ConfigureTty(tty, baudRate, parity, stopBits, dataBits); - - // https://unix.stackexchange.com/questions/19604/all-about-ssh-proxycommand - - var call = $"{configure}; " + - $"exec 3<>{tty}; " + - $"cat <&3 & cat >&3; " + - $"kill $!"; - - _Command = host - .Command - .AppendArgument(call); - - _Command.WriteLine(); - } - - [SuppressMessage("ReSharper", "StringLiteralTypo")] - private static String ConfigureTty(String tty, Int32 baudRate, Parity parity, Int32 stopBits, Int32 dataBits) - { - var oParity = parity switch - { - Parity.Even => "parenb -parodd", - Parity.Odd => "parenb parodd", - Parity.None => "-parenb", - _ => throw new NotImplementedException() - }; - - var oStopBits = stopBits switch - { - 1 => "-cstopb", - 2 => "cstopb", - _ => throw new NotImplementedException() - }; - - var oDataBits = "cs" + dataBits; - - return $"stty -F {tty} {baudRate} {oDataBits} {oStopBits} {oParity}"; - } - - public override IReadOnlyList Receive(UInt16 bytesToRead) - { - Open(); - - return _Read!(bytesToRead).Result; - } - - public override void Transmit(IEnumerable bytes) - { - Open(); - try - { - _ObservableProcess!.StdIn.OnNext(bytes.ToArray()); - } - catch - { - Close(); - throw; - } - } - - - public override void Open() - { - if (_ObservableProcess is not null) - return; - - _ObservableProcess = new ObservableProcess(_Command); - - _ObservableProcess.Start(); - - _Read = _ObservableProcess - .StdOut - .Select(b => b.ToArray()) - .SelectMany(t => t) - .PushToPull(); - } - - public override void Close() - { - throw new NotImplementedException(); - - // if (_ObservableProcess is null) - // return; - - // https://stackoverflow.com/questions/6960520/when-to-dispose-cancellationtokensource - - - } -} \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Doc/Modbus_Application_Protocol_V1_1b.pdf b/csharp/Lib/Protocols/Modbus/Doc/Modbus_Application_Protocol_V1_1b.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7c458fa6c9444c8df5ca799154538398974a9e55 GIT binary patch literal 328426 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%0AOI(y+esLiy#I4;~uCh^R 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�Y|y81U#C#yp70XU39FjADp|i{|?JLa0y|V zln76;Z1R(racuGu!usBQflBfH0$scX6A7X6GPqOSj)GM|iq6KU-zo@@m@eetS2uM zTwmz=WyIy~V1v%b;|pT*-SWk>I@;Yjd9j7@6hjoj*RkB`vqyJ%gy8{t?v||p3-$+t z;~PRj{biFhl=GRGWfDw%N7`&^#@5rvAYyCl_iQY^S9mGMWt<|chFg4JP^eJ~sV3$K zo32gK-^_jj+Cfl3j5(kk<|#l;3d2Ct0YCJ$wc~`R$@UfF;fZbS@@x=7qNzuqS=Q6c z6{!f+LO$~~DIb@~_pQ0sTO*9!uQEaklyydG_*{o^%~k58{=&m4;Fy(934-N*&%!%4 z;}zN)*!!}F)Q>i57~Du=)2)XutMg6s%o;Hhhm{6>UD@-Vz=$7gW7sbl$00A0<@w6f z&KDXoZ`p~4>!yXect-~O@q#;R&3WjJ>e@xLd(L`> znF|yHnDWiJLgycj3+8(Aal{DORzLwZ{0S6tiEiykKIvvmR?@3KrCUk19- zFKe|ADH4Pp;@9;@uld$1CzSkPq%9$%hxCr`n}1jm7Ot;mA6{wNQB(nX(^!@O^Au9W z04Py$X^bD0v-)CpyoOB0qW(q3VyI4nECYVzZKG*e3u>RawQ;mJD5$GQpq)QL)AFbT z8+iXTUYw`?q*jrnoQ^;NBi4~pSn}DB;nF8h#bUvZLFthySc`i35hTF}qNy_EboI{r zWoNTgaZ%Wl|p|gs+K$+^g0SX5vBkEW0k?;Gkj%* z0YyIBY;9x*fnMfART?4#V^1yGH_bF5QocgAkH~GO#wbi6q%_1Er*_Yt5N7quXf0B3 zI!#|Kt{Y6AJSkM1uSSf5tdf=vk-LuVyepg0Tt^w{)}L_&UIGJRV18Y~pp2*g&J~A5 zPBwer3IjyJ($ulSC^#hc97<0{z4D~lzP*8jCct4z`uPIJNy1$5R}K^WJTL7`TFY&@ zgKCN{y?XVnuTBkI-Hk7uI(g|%u*0AD^fH*KELwGlenf=|iC86EM+)m>>mN*tHJA(~ z4kp{y$`~LN2I&#f^;PX?GsJ8RMXI4HK=^kncuJbAKTSji36V)yN~*nJ%E#v?B>qs> zidbC6jWdw4g>G{eaZB_pzzziH^{W8EA!Q zN71f0J6$;>pi8$UrOelM7Y1yiIz8S-+_HtbwN4JYAJT|c0KVz)&~U%AMNVCkxBClM2H(Bz^=iS{I>o| zFr_0;kJVSwb15axcL)BFFhC`-O&ti=0|!m|MDnBL4pCYPu=f5{rmNG#v6JP43e}XG zNHj~#Cq~R4#EK^nbQ|%HS7DqLlpG`)V_}rIts45VFbFhwp7zt<0Gvo7oSd<*a=c~+ zlS%KO2NV>ELy8W9e@Ulx?FCwO!0|ToXWo0(Z@-u$rij`RKkf@+z0r%fTnN8#2^1jn z9EhJ8rf?pB%fC7IW_)Z9P85|A6))!Kw&k~aXErL39{S7G44iG7Efun+;!?q*Rk0@Wu%;OGXygf!dPQ9x*dHPUaw2AM3 zzEVVROZY(c*t2xv_>$f{_XzeXue*nFELW(}>SDyXDkkW5>=xTO*I~nDJst$oRF{D% zfrU{W!Pfkl?HIe*PrBR|n2aRi^g=*==VT#|u~_4Iqa85p%uwW|xG7Q0R4T=1uvX#=Yt8n%){p_cqfP1yT+%)L^Sle{3A~m} zV_x?!GsU=L))Uw79myDS`3$Dmy#|}}2I~H?3XuHv*k0|U4v0NR&L6W^>tdh^mwHJG zpg*aBp}uzgF1WPe^kAy#*Sez?68+|G_{44={pLpa^k}=Ie~>c*6A##^27IRL$xW5- zEAo`FIvOaD$!kKY%y;!h@CN-r$jOfRKCkh&VBZg3diaZUwt$zcR^(7racP?KhZ&waTo9grcxX%icuECbAV(9VV+goJ-nu;&6x&@Kb4&FS)j zfOEzYwcM`V-aXh;F-#9uY>o$E&8Sy1+Qe7UK)G)u>0wnRO-1tKcQ3;-8huHXZlYy~ zYON#>DSkCXI|9rh_|^p={oJXf`s8YwHBtJREggXyN+Y4stgYyoTu5xw)bAFVAt=mh zD}WqFea8b1+iIRFq+Kdva6uf78Wk?Fk?CmefrK8}>{pmfADk1zK-hf2B_C&jAUC3J z5b4^uR$bqe3uxyUWI;TPs&0GHT{xF5P5~uwphNoS|&DD4GsyDD4^KkhhKv* zQZH-@xYh@GTMGLP>kEz&JGZ;46rp%ibjbxa)A#78ug+3r?-?QaRrj9mrdjrwXBQT? zLC%%Ar=~1vB(b?_^+YpgI~b5zWsE-IHV1WTY#<3LdWU5a#(v&Q(+QLjm!xQ_orf+VUt)BFFP;q!Wymzr#h4ESdn=h8O z{?}2%yc{uo-7?DQ*5B}S7*AD>nR`-HL3g+dr4iNE!8O(c-qgZ*_rMpx&`HqhObWMk zq<%b4KaGQ8EbX9(X66v^h$e{`*C@!qF1pj)Yzf-AR6|B_(|cvdPnke&+^4JQUi~$+)_m)w!~vrxtH1*$M~X)#{*8xW3S9%?=lj3t8ujVSR26P0bP70^Xgh z@9^bt_suY|nEx{tdf0Y#Oub!iiruO12gh=Nfp3#U;8%u3Ao?B%@7=&V^xTd4D?*iw zJ}*ZGoDn1IH?r9eV0D}g6b?{vq`1BYsA~is9DhwWI7e9cRfnjbbgU+MEgF+juojLI z0|jZO360?2nzv8E@Jw46Ur38~703#OX|^G2+P0IFivjHGqaHy&v5( zwhx{Dmbqs3LQ1=TKm|`d;ono9^N*Ap-TW)%+Y#%0mk4TUJS*VZtDC0U-WE0e$vPK~ z+KS*I_M-g4Z7^c?MXtc=yhA`Wqog4;=c-`pJ4};wtVXbO0hP09{i;2)Z=>5VDNS|H z`|0~uJ7bOg-Ay<9>$`*l=yGfz>S%XUZ2?i3_S%XC$l8))a5XEQU^RB}srJD(>bo!) zDI@k|?U7UPCg|-cP7~W>jm4cp7+VM~>*;P_HEo-FcFl}!fN|AuP z=z)NwZ;S^iN2cp|`3k+X-i0Rz%EcHX4SLc60C1WJ=17!iMro;*=GTN6LyYg-HGb#L zq<`Sh-bC`!z%dXYT0^$kfOW7kuhSp-FOUNO8<+NzBi*d2HF<6Vev^=#TdFx^sZ-@y7lSbq-jGJ1S3`L`b%DE0GB6$ zW$R9lsx7C5hDaZug#sZs2AXmA~i8e)Qn_~Fz^~4zCYQW z{|OMaQLGFooGM89hE;QHy&aS(MTss}5un$54)G zoi}{FJLVLNLx|_l@u4StqdKxwM7sT3_ETVR?2@aWsuM!aC3%5`bMEw8+mK(_?z>L+ zU4Z4j>ojYW6oLY(QDGp`*i7c?kJRc(_^5rFlMRJD4Gn2-Oh5Jm5=^Fv%0X3~DcTLh z-$mhx3i)B5$Z#yL3$H5QxmEwsR5-9g1>$>^l1A{VdY~n>M}8+X9(67%wd9ILX6Z!S zXg;j3ht2&~?|ExiYo#x3zFyuxy?&|`)~%;8*0+URRw!7YfBJi^Ka@w7kQ>3pX~%C-WTu2QAgv~%Y~51l)Hs&i~2A27%fnPZsjcjKnPM}au<(Xr0< z25^8~_|pcw{47d3p#Y28wr`x&URAKkF0cl+plXNaomo`pPOTGcs~oXJzF^Rx<6S$W zJmuINr$Ssbc5mbGYuS?)tVGH7`sMR?bNP)geYDT-+eH?yo`W6JPu{|z6?Zl1aa8^` z${GH8B?_0q`eYhXkZd$FKhPFvdI*;Nh^5R`_ht-LhQgsNq2rC5%$C5Gn)2D1nQteD z?s}tjMd*}M!Jr#KDzla~UC_4FIL@%A6N)cdgw8UWqr&u*v6hyJUN*HWD z3#KxPaan~K@UrDll8oSo%#0<;_X=XuPQq4EYN)V_dFNn#xyi0u`F|QZ|CaB>Xpr{V z8obKQl(kk(l#d6A;mpPnPe`ySD`J2gE#~q7zn4nXH{ZZxYEWsWr75>)^1I(_m9(hP zkhyNHcJZf{b-$7Wly=L=w%_$|CogKvY%XU?SBf^gA+TwZ5o+gqmHYFB#+(_+iHWI& zYo1vi%e%c%P_HkXF5-0-xo@|$Fd%h)mL$z5v(_3SHVn~fQQPFxm(rV5N_Us9Kj^z6 zn*UvvpNdWQb;~@r;S8CspJY_XHDpNVJ>wwIZq=i5P4ta?o|gOe@K!TMRp%g{_LegcwyEq(he1=kYD2zBXQcf3)oth%f7lS# z$g_`q+>oxB5qKV%zs5R2-f51IC&mBudG=Q8+vl=?tN0~1awYEZ*Hv)JxS*Yk#ZrwP zmXw!o+4>wTkVX{rE$$L$#V8Igd=Wh=z>Fv@sS-xe$I3sia{obtP%b>n8%dNX0H1X| zdM3#U+LYKOVi!qS_lkz+BXZg!KkMj<- zpMi}&kBjW>BJbrA^fA{2Yw7X)d>&pu;-x`nDMk0lrG4*7Dr*?-himcI?Ax`T(D&7v z-i^m59#k-HS5!Ms$YNnof#pSTCcc`>+rgQ*ltk&I-Da~d0wr=dT!+TJdJvi7+eeLX z-rUg1dqRY#%v6MxyNhIZX3<#heY65Pb*`7S^E#vF8H5AJn07_|)5u`HK4ri9!WRS( zPucIp|7h0zZ|Y0`P=WeSzgLtz<9D*?53!Ib`2k#NltH7;vE(lP_Tpo8?Mrxgnw|x(C#kJrnH#P1#) z>t}@@ONZ}pYtt}hF0_}?h4SP(V*n?@hX~_FQ#$9>WetM>Z{LthC;e>|RRxMqZDq-L zB^z(siNIP4(vq4?i`%jIPE-^vIbnA7WMrw$6XC{@qa7cAbiu5~tF3^4rFp6J`(+i3}#ZNnh$i%_oFJ z4$lY@g95&)gwRF~?|aGHFL=PlzaONkX&+|mKVdV{Tf$9C@V^(=<`1q^RWo%DR7#U| zooT3XE#4e4Rg>>z`i*t`px)V$V%+#wSaHBM*un_fm8_?L-a(J=yqbbf0xZ=zneJA` zIq8ate&{aDWy3aVEm{t)D?0VLb7GZWtSt1J?a$emeALj`Op`<02JxW@F37UiF8h`2 zWK`=K!P5}!vC@sM%|>524m9k`xx*#ebB46p!n4RrHH(*QxY;2bL5@#z)pbn5M^ zT6_Ic=yL4f7}`TDqw>i8>)S>w`oo@h{;_YJRL{#4KlUuVar*I3%)Y1N?loA)-xqtV zr}eV5ofc_UJJnK?$(-{={L)A?<>lG|OTHS?`#F9#avWT7(ZO1oB=dy-s=Q1XY>WY*k zm8V%?YETHA4iTe!Kv?itRG7NHc-~QeE=-#7Fo4e!V2bPJd-G^{E6lt28E3ifqHgMqYobvJ`JhDU{E6Q2~rC3741p$3P!p z>d16oX&~q#`T!Bip38m^^Q+Gh{0AW zH@6?%7}FRw1)dcurYfUlF$%&)${J(x{8-!iZKL+e9x;Uxgu!9G3to1-cpE7iE{zZ; zzf?1)YR<)0J*~O`-Uc#Av>DwfBFlv_&kulpF?z;)VQoH7XgsQ$F}0|dzYq%fJ)kL^ z%nE$8Dwv%`(W(7)Hx5cyck9LB;Ag+N$unP z-lmTR6Ha7H(Qi>hw^|0!|C!TUj1>`FzMmpQH^SA=T3pPAO44 z)r}=ftTtVwwunroRVSRD0WYDE-Y~!C@En|b32X!TNHfAI!Qsx&U%Q&n-$h1Tq9XvsQO!` zk_4n_F~)g1m3NsxT7*E7=~zZL@`)@ydV&J~=WtxI+F_xQ7_mt~p#?~>6Y{wWsXL zYtl$XaZn&3Art{-2GrE}^2*282It&(5cEcbY&Lm+e{g?7&|gEIfNte*f2&#ku z&y_I)o@nL6g{+O0-tdwzbxoOMawjjt$Zng4cK?R?_mEAuO~DQABN20h`>^|<9A%{` z{YUL|OzxN0bdGiFnL)c*WQCFKX+?F)pNwqzBj2FLqzF@YZfVU+E3wcj@~Z^v9$Na) z&94+~-MSMQoFl8-3Qe8!j8)f>nU(vem#1uY)Mn!%>!r#}_vl};Qi*$B>9+K@8Rhp> z%0irC!+704SyN<>Pz2*U++&)W7)4OdSLj8JM?plqLpqY zC2?CUYq~B}8I$n=*wcLJ^89+@Dct!B^aU(q!L0KSz`8bh4`fSmpb9@$Xf&Q7KYL8C zd@!ws$fb<5>(iC7mo*!wh#1rN#Q-fiS@J#s3ih^XV@l)bbPn3ZRa!x8O=F!qZypXW z@O~h5oK-goTF-jzY%(Ui%2nSRV~jf7GkiURyrJOO*?Dl?di@Ml?>v9QGyj_JxL4qB zNW#+w{!;R^v64#RM3o`_@`0J_1vU);*+7u|UC#(yeywdf9lY=+eggk=&72G+0lDQm zR(Uc>HdD%yTxXt+2LR8s<&2g6?1?xIlSPv(DdT&-SDC>nCi zKzqJQtbmI=wV7f6`J{-Ir{V<-xmLPCy2Y}GOeA8_NFfC*rl0PDK!MDuglNmQpk|+F ztXP+2mc8rN+bYIIG;wZ@4gMjyf+iXPn_FK7j%6=)nY{>GXWnF@fvR)dyzywx)tZs?uik`K;o_1W!qe22ab5Cn^d6Qi854 zEUT2DgMUtlH;tfHqFLQhPzbIbx$5gap}DmMIZ%@M2vZ&usL~-&IP7`o1RI zV-M#9{xN7+D(oiWy@Og~I^6PhjA(W;ZquM00TR)o%t!kAnSaatKGw z+KDKfYiLX*PBaz@z;3#Vf;`}b`*8po_gjZZpBVKv&Y7-VZl``E&~GG@(t%0=5#&^h z?oX;dLN#mC-lU_K<8f2MxaM}!=N@U~D-)_8$EZIjeH8h$qJ(tHD&?t6XC^e!k^Y)W zTAl(sLNw7?C6~LmSfaF%_9QzA+3pbp5NzOjEyW^>;jyt4y(fGNBpW3TqXOOSjhUCs zn{t{wbFKN>AXkb3qf}IYKnB$$xzyZGGrT9=1}3{eJ+An4aQt=3g!03bjKw@Mn2x|Y z3Mob^WH)g#N}h1kJ;820uJBl;h8Mz}eU1Mco$WPxVh>P@{cJ9T1PRb=uqr3OsybWmx+Y!A7JD&IHE z)!>k;xXB1eoQAfl9m&7D>lbCyC`UA}_`ebne0avo_b^2H8bwIC@!)&Vj?GvyK|Gfh zBm`;(SVi})JOa+}A0oV=NwC96E^#p*#+NxvYxo}H9IRs5;lR=;vQqk!KNXEbJd#93 zu{gG`4p?QzCEpCB7Q0txXU0@;EMlFRFpsw2%+)P8qtX6CGEwP&4rZFU9@GKZ+o;Nt*6wr`+79u zG4{rF(X9)9BS#_z=?~P|o{%6_ECr0D4K-mLM?RK0J$sd%^jV~dOai6IcwU4^h>suFQp zVkZ^KFC2^^3Su@M;<1>P5bqJ1F)GBPwAm*3v*_7CNyzd-z?Utz6wBu7$T8YoC)lG8 zoLL4*0@ihW^YCs2Vvj|9XU)va$wf220}h{T-~pyTUJU_rtW$(^KHt%=_c9dD4OXBC z5L@0FV!bS-Ci5Ey5NG3Z5`57>?L_{pVhSwG#Gd+Bjp+G$d) z6_c$1)eaE-HDl^k)houT42~%bDa+3)RRBeZGs#q_4zx`N=G#P)Rw9~2a`6o5^TO0q z=5s3vE#0PN_o->!Mwl;odCAR!M$Q#;ZXQJ+ZyW9dG#*?b^`p!Pk{n;!6fV=dv#jpo z!Hkq{uFrI~buWN61{Xr-JZ7yG@}-i)IrngsP>;HFmI#jt=_7PzFKnD21owGKVd5 zqwWXRj4QN1g2ZW`vtrYZs}`H6pA{lAH*Xe4+AP>yLj`h`TLzvyOF!lYb@!EUcl9{B zaphX`y3RW3&N&+wqsEsAZ}{s7kf>68&t1MUE|X%^shqs6DXoEI)EM_=f~wksiQu)B zo|f>OwX5^0yGx--E<{x{L@}}={_)(VLTz>?J_!#JpK+wagTUHERjWNNRNvJHx|d3e zWoi+<#T>@5?y+)&DCUJQ2-=#61=w?#HMr!bw<%|rjAD$U(H)W}@1W(gJwl788OI(Y zKg*K_{`-Q0>KmUluAsfciihqQR7S8Zis|f$mfpjd!?8V=nzPt`1dISQz6=xc7?#N7 z0yOqy{Wfw}2)QeX=2`Dn9Xz>k4A--nPW&Kzy@_ObbEwzRQ~(wDB4{%Rk6l&Eo}PUY zHWN|A0J&JrYQUd%6mH@4S|O+`iqIfc$6wOH^_UTqie)l&PcthF(b=%ap9oT@lvHo* zf`-mq9)0p5jHDUL}h+aW*qPH-D`mbH^iaFmX)Rq^VpAfo!kkGYpWdlWbGX(~axY zg_qk02&}Rq@WcKAIB! zq>mwG=JKiO=ax=BaLkKrzK4cf0XQ7OR>11K6H2htUZiO6OVB|}iDV!r)B_vHx(<~K z3lmcvAI~FZ!}%GK5CSJ?bp6T~JH}{}Mhd#wjo{sT8$i%@n<92e8i`Fls%1`_z%4AM zWU4Mh?RrUqo-=2{2@qDG(w2%8Wp=@~CJA&e_L9pSUE&u-qkAxjVR6inRJjbJmPaiH zdmbU@N}b}jB4pR-gVs$RDra@&9^5&fzs}Ifpe9=>Sp>H4;5r7mK8*?K4R0vCIiam| zdOHh)kgw`SF}2<2Z%89fv7t-fo97m``ey+6^=xQd!1b!2qGjT&C}W&NtO@;H2++~S zmboM;DIVz>8Fw-U(&AP=87nvuw#IpN#83fcl+S+xdw?9cPH#d z`SOGay&#;q^y5)Oh{2gu)H2Fuu&S<6OkDpDao-qZYtt>+woco9+O}=mwt3n-ZQHhO z+qP}n*7W<$or%GXxG@uh{}oYLS@qP8UAb1KJF2080S^8iebe*7MdXGkDkFM7ik+%5 zGdYfq0|wkf&yqC^71Q-xjD zZzOs+Y#mg@F@|bxNG_VfG*Z(ngC#j)Qrg9HoBMS`97$>~fu4|Q9Fjl(i8_r1r%kYg zWBc8-@?C>*j@xipnm4mx!JRoDJe#k7`}AjI=nR6t!bfL=4xC6VFpW>k#d&=>)p@v* zIv)z0(1+Bneh^!I--*Va@q7k3bnb%s%#v+-LbX7i@xVW?Pv%NCW;3XsIHR2z`L7NP zHi;1#;;k8AOoacg6V7Xt0p-v*IpixY{(JbO*jIMv(Ui?_jDQZa5c)LlYC>WgW6xrB z_*VKFoRJ=UX0-40uRRiL&Ms~iX-<-v6wic|63_gp)OeT#%TbwZ$QD6k!V=#{_6F+P z#^?k~?X-cWAUps)X)NzMODM-s4;Ivj43oD>8B&gU zdWV1b;v%n~34hHh`g`a@nInTnvlEvtRfpCQ8#wy3=WXI4zkCy?)ud|I#Ofv94UwPW z5m{p6=W6`}0*$}J*&a{5p#Jl;ayFB=-cv*Ln!2){k|dGS`Q<9>c#+T}W28bD4wWQ)HMk~h)E8SEWM0v}@MTkD&4Pt0bD zcO0(O9jA4xUa+5=Q{|rznTvu?ermuzKO^+;G?yd^%a|jnSac2e{=Qr|dj(pFsSu;*E8kDq1z1UZ3&F7TWB z161EFcyu!=4AnK zm=A%e@K0)}#4_%Qo}K3#K{o5Pf$A)V&At?cft%6MnopM)Pzf#<{i0x6+fK3a=eytHPv zE-Y&b9{X|G1oKu}{;&o=(nW1jw@>-d@SVQ_nVXl!_La4a?M&gY=QVJ#y8lwAFzv{GXSf{ z?#+yandLuzGZT0Dc{A&}SAB?mz-n>_r(>nvH~JWgzYQ71w(90e^&>ixFA(yJjo0N} z#A=&019*t@r$#MnOR6s8`Dq8slyBg#567c{Y~!BNsW3q+N8v}Vv@roe;+JgD$S3|F zipXC?B7mrj3PJpQmW@#XN1)TciEq&b?N!Lli)k?ef!mxu`s3~XxOXi1@Ug4kuCB|R z{t5SaT=VDY{1a81Mx{GdEh11YFiMzMrEZSD%Jlje{?XlGU-nyo{xbkok|H7QzWM!J zws`+8yE-d>aCi~xTpHw0;!~63RT5}$w-#q+ciHmeXYrel+AHe-guEE3!!6>B8lJT{ z1kN(&xjZKk3B7TA+BWlK|28enPX?Xs2;en*a}f#Oaz_5!Z{rpPrL=wQdI1i!ka%cu zd1xS3c{(D+vQkct-(w?Qi$Nplxkk zJPX5yojaVnqsUxuG-!I|cL?|khy3Eiv zF%$}qKi4^?B+TP^iue7{*G5$e!YlWpn!_2DyLf-BbE0+6 z(B?#%{joNX5Ot($c8vMS-e|X*-bIK0aKmPV>@ZEghUh5H;JTSLsDm7%Cm~EQd{7@7 zWruI)L~mw9G)&khI3^!Z1K_V!pd{y zSJkJ$72vkTh1dSha~}A{Bl9mDzbq?-+1*R?JW|t}>mhD`4=wPi{j5IkCuAt2tLK}(r@l%~>FoHY`SRaIX^1hh^=G>C z?Evh9$`ih&PAdDl!AV9L3XTMB)rSL^v&|9riE{ZbyBgX1XfTr$TY`*ZKotI-{A$b6 z2WgYj_*n#mB?4!(X(n_@7(CBPyW)YT0`gfJi>d*Zw%YwSFqG9mDDCh0@Z_3RAz0aJ zZIXGrBt{ZKD$@t`q;Yn5NBW;L64LgmV5Ao1kpa5AVq_N8F#XPyy!hI1FTw6wW9=cc zs(?{m1Eo|%JNV0`Fs})ABQZ?K1AbxgpOZ57b5bbke@+U+q5=k1F~iVK(GJOMcb|9b zT9(DVG+=zH90p#8Y+?(5%T41R`1@fwPdxj8=B)ljYB{Oq3YSx19`I_tjO>)pRwUP? z5!~Y+<2v*sp7>ND@RSLB)RYO#>|Ud$0dtaiXWdaFyM9Fy#?&arRC)}3hWu#;^{H0F zfZCQ!{(`aJF?8w?4ts@_6MRXebsbZtnW{hEqBRS4FaTnArbswuGmxBIG$MP&Cwn_^J}AqX(PBh702Hm zM`xp`tg_mrCvr~}^YM%&E`+j-ss5jusZ>L)(?%q-fFuqfpd|G}rgW*)c4?y(o2m@z z8#f7~QbqexCQ>3P6DRdjNe)+J`cyWi2%@P}$AhY1BaICT#!77jtD_T1@$ALS#-~bs zFxo|G^Lbo=M}Pf_9>vvtB~jQP@AV1OZbK5P-XfN}D6r2jfS9#%L2 zfRm9VC`s8n=!yRp5~eg3wf2Okeg#Ye*W>YJeLyAn0Q=s`dB%fm6JacqpaKaD1b7yr zpFIBhRSu$J`@A+qqkmCKK{tb6K9S?EuFtoKMGdI zSkXQs-?KD6Q0G9D|s2pdLh`prH zH#`xS2ucJwA-=1ujH+cy5Q3qrz2AP3o*?#3KwaW>N={YMkh>}SVp`)9Nr~Oto!zZX zMV{TQMup)kUcC5$h&$ufsitz@59IX;XU|*>4{dF0esQ+>n3smv2-(JZ%zL`sy>#=y z_@TK@2tR3{KEe9d{du*#v^#5thl;2AXG)WDGba@A7s!(~pg{$ho$?7FWVD1UKV_&Z zaqeHtokQY&&`{h8Q*5;+Dnl%@h7zNLLeCw7-rO6p9?j(39pP*0>O8S4Kx~V8yXZW` ziew#WOV|1?SFp?Lj`N)Tgy43W?#qsnuW9$hC$?Ix+3Q!7$5}7^jH=3HvU?&G@-T)2 zKtwkvL{-F>wnY-F@F zHjTbSa7}x%%D%{qKLrgEr%+Q)%+QHW#9}ed+)}D;k|G5AK}c6aQ^Xh zELawdA@_G1FoKB~N~`Nm@8V$FRYiB+%g{L}Z$~~>H@d_H$OFS!@Uo_^voRO$1#QLK zVj!`ai@s>lueB3i52QPg5kNqL^@qu$(XxZqx_J&NceFiY_V~2X!K%(R8DP4lmK^0X zXp)u|pp&R4u|?7+VQvuGKt3^VQA{A$5>Fyk3=u&tgJKNZuBZ-a-Eyi__z`lPs#`0u z=4uX`2ttbSk(7n9uLAC9s=1I9bqJ(Qx#!9x(&5(cyYpRdV0|fLF|zJ)4;yM;-W*0t zx)g{;60lAI&3gAL?wkyTR_=nkP2i=$U{LGPMA&wXDqAWT=-{l=w1ZFfS!~c`;j^V8 zxOfM-`(WpFTsCy^5M@*NrH+UU&vY*tZ(y<%5c@LmR_BVKUfy^5G5I+vP5O*y%B%=C z$i{r;z|ivRwH1?~?aJJ90raZot=Gd_2yJf0V+)l~yYX-hwfN;V8ZQNeSVqlr0;Ky7 z@Ci}Er>>-(T@K@clEGYCmOg&vxhxd?0E$s*d904pbM!6EaFa#kSJ|PwdbYR%0|)_G zsJ=Q5C!GXP2sj|+RAL+C!U(8HrnI8O5rUeJ4TS*<{Dz#(Vp@si1DPkjjgY57l5P9k za#^)9Nq2Rw9WYkEQK3?u@qtzB&1fOk+nS0d!)3(IS!r*rz;=dkWZVMgc(l19buvZ1(@#ip25qWo#_9j~BL1m>y-u^aiM zgq=~|8I<;p^k*;}A89Y}bwvD33TAo>S9L>!AI;-uX_LVKKj|}*)|uDFzpC>l4U6=w zT~)+h*>{zN#f(30kpj)y>cAwx(*5vaXPHUWjJ5#0iAo;KechGwMxmw}=Y9j@UB&e% zpZW8CAzef(xJAV`wsgUYSvjBuHEk=!~XE?I~6kP}xv{~_D6 z(G@5M534`LkQ=b5A)N@O!k2girLj_JVBoGGbB6?veF5K_yR`9Iqlwa-y`9+XX`dTS zn(h?SFvg(9zN}N-i#wL{Yb~eG*}XxLp9;mJdkcr^Sv0zf9!i>R4R~P==*PZ6~NA>tDs$+0j4jMUoqYx2nDj1piY64@A z)D7Z1fM~$x0`adI0A_B@T%B$W}L?J zz#-9{_#1gQ;#;G1)nKNhWog*c1eZjER{H4Wbe_2zQ$Yg&k5=uP&a+Kg&a*957k+l1 zW1Rf0vZJ7Mpj?tQLN3A1KS39Pib`e#UPk3-=-uzHN9mA3pie)-9G2h2y>ywAbT2fE z4{9+aWawIK(fwCj-N&zETAa!ZanUu@%675j0`#6|Roob@<*Sw^iSW3M49RL%VJFiP zAZ6o&w(GmHhIdx?1IS#k+%RuAkX9Nb5M*(d@)MQ9&AwoQ6OK{$n89ghj%-Vtny z@`WqGFI{}@Tra=8$HgPQKQ6XsR|IJwq;*ZC`&K2Id8(5ud`M6vk;=@M#_5DQvg~Z; zW8`BPQ%$5qMNJsQjoeY@4esmb)@uQde(=DY zy}WV$$_+Ax;kZQLDrUu`x&E7ZHyg1=jd?r2e$BX2xrP+G63a^1U8Xm^@9hDahTi;E zZE#K>gB$Eja@E!^nYj@cnFfRe9ARJuFhVV8$R%aLpQWJalcXRQm6HyQsu13T?zx+P zgg7+GxB(%=oenx}0j4WR9n&LR^;hIVVV7QYawgkHFMm;C~csz$(ZVLF6Xt@XeE8{ zOZAZNlay#P1|@tI5|7$f0zd+nkp=_?SBZLWkg%V2SdQNqpF%mI72u(hL&W?9PM6@+ ze8!}JEo6S8)3pA%-Kjj{tKHA3tHFQye6>mWduy_}ez5~Z01`qu{Sv)@e)Z+k{evDU z&%X=+soV}7F#Cpud$~qldIyADaAvS34hV9q40=)6SG^%3iUcF}XVvBYq?=gDAN1LvUkKCl@ z9b$e54pi$6C3ku@rBY^E+4AIYYV5WRYxks13^N3$9mSk4RRF_hW?#m}iT* zPR9boU7hPL8~w2|ZBx?7w)R54x3%kS>8d8RD&DB$7yEh*8kPpjc1>DahNG*27r?uh z9>XrwC5w-d1Qub$2=gY_>LFiTZn^zIB~Js|bnEUp<`GD)=Q~-0m3U&i@vEfS`&$cr ze3Q!Z1Daur!Q+IQ*Q+-Bx-a2}?y~@4z&zL#fC|LHe#?DGw4Gu;ison3#Wb*OsqgM3V+kJh*G6H3_d6Si;-kgKXyOJSIbg4RyxC6B zZW8<6d@28wNoDxV7L11V1NARSb>Adv%nHODsf|v(0KTcmxNqil6)CoHe#yx~7@v!FPeFAXc5>kqdqtqig(KSuU^{5f7y} z%w%0MZbK_?ikfS~UH~WJ!%o6*`}CM4F>-j8o1M*bq=_2gc5gL}y6c|~pTPB!{VWL( zq30RT5$N{UHycUThnUql8#C;_6ZXB5!8#Bo-Lm{#O0K{jj9n%HNtu8|iTt|Aq7NjZ zluoHsDn=emB#8zwogn7Xh=PhYnl!DW|=tU=O8082zyS63- zR1Q#;DbIk2VkhdpwAfFeMif-|Z3|4NB*!!mie*`4xwJ>GRL%^FK9}5$QhLt>tT|y& zg4REkRqWmZ<}Q9{G1Xkxq3H47Gg=(`=pHk z)Gbq0I|?LGY@|G$^`P>h36( zp}j$p@zCu4%>z0w={ce$Q)5S<0!Su(b^IDVh3-fG;tu*1<>5b8Stm6}_YV#j!6}i{ zJXB!`b@)erfz6}V0>0Vb<_!Mzn;s|YhlYfPcR{IV29b+cb*)YA?H4K(!LPJE069b! zod2HQ^}pb)|DW|O!9O;R#x{-)zghpkdF%gQ(7XO8qkU#J*8f=Vl6Jsq{ndG|x+7*C zXb1p20nB;I| zH(hcJU)9ncQk&V`I!=pbi~9OK{1PSVOIv9Vm{SvSk;(n_{OYcMU;lAAd3tr#o5kCq zzEr=dG1dC8ShJD&?~=*f;rLfx_m4SC>c!Up(J?GzxZ4v_j-8#Yron}+-LVN1l6`y4 z5VghYt!u~k?P`5-aj}J(VB@;(IyYdOa|Ru7V8v48jI*ousLDIJ8g-U=?*@QWO&oxZ zY0QO@VZT=m^tu(ulE`A;^i8^pu(1RA<`I@=Q<=5x?8WrOl4hYb-bxx`N7P5w#1%_M;LyqH3B~lX2S2;r8#Jm88<~HzkQZ?>14V4?Mb27KB z3$;=+^2OjWBYyJmmON{(F4mE|M8jfRJ^4klMu`Lyi|^Ur_*+>&!(Sk1d^piCF@+A_ z7g>neASrDmcS~9r0}-k&ay(`QWy)sT15LeLP^?GFXVVO_ueQondQZ=}I*{fJ+3Nh} z*d#=m@OHPvn&$o|P?o$mqCil1`NRbSMZk={E-P2qQX0}|$ zn}_c|?L3+k#@j8QKJM(d@p6_`t(Qj&8y=AOc<H3&}At=`%Ql!qn}=;kKmr1M3k?H z;$0$H+6mWni!w{F#c^sIqGY7RKJg4Nqmhl~9st`36>K|F4YDn+o)a)sk?o+fMcWY| zRHc(-RONdd{shp!z3&=8R-6-!I62lcNx=Qp=^OJ&o4Gskw*D^HYQ+H)USezb!}##W zfU^xX&n@u{8V0Z;0V;9AXx#(4P8K~e>WnCQ( zj~El%gTi~oT8Cx%DEHPZUT8nNOxJ-qyA3~!@7Lecw=zDCV?K6kd9f!?zZ$lI9HL}7 zUvAy8ru-l2%01tEoTLRUp6eW!gZw-H^l9IJj1+W=_Jw5&R!M?^1Q>f?@P4A>{f?UV z8RlryXcu|9Jo?)tuW3DY=}&!tzrtFk!77*!w3imzgvJb5* zCRT12NGl_V@f2Ahii%uJKMACu|MTi0J5;px-ExcN}ZBVZV+4zNKLNs46mLY|sldS+37jJMq4jTGTw0!BI+*uo3 zo1TS&1#C)-ysJ&;+7oN?Mf3f7z4L0YAw&wC`;g>1zi>1Q9^H|=E<*ZnuCwOYT+AAG zQM0~}yo3F{t2nN;CeWyB*X46gSN0B{j!1P;a7+8pdWgotA50VAwTTioxW`7TiC4j^ zwPP2%JbK6PrnGUH_6Y}zs+L6@cR`c-^MWJ!`-~OdC@0}!%Baz9!9f%*qrr?Y(J&xR zI&dZTatxus=mj$Uj}bIQ;gw`ad?V*_9Va1o6jE(3_6FJHAh)DA8eRUeXN1#)xLxhi zUGzRxqmRvC*z1vrAhr8nTd}P;d$DXaRp(@+P{wx^5A?SI{t7ZbcgXI83u5WA-oEkG z;{Ik}=gND$-GkW#hs?TWu1+(b6>s3qEQ-Ml5OjGnPEwW1?X!<0tYz8a2ppUH<%l)r zGMRZyK7HM3f7pOXDA&Rh3evtxF=f#F2E!tnZPKi#dn2BnfT+x$usMFbp z7+kX-NfAs(>LGllU$5$^O=1npt&jCFL`$C^pUw(!ja#`c!W!BOX;qOmx3BASAil4%+dN@fO9BYOE2Qs{`iI!sg!#XKFcDPkseV0ttfVQnDw4cF6|Ba;QMw8- z2PCZk%~=SveYBZp)4+y@s>`8_p*ez5Yzwskg~#~E6(m7NIuh06YYcM4{Qx};n{?Dr z-AG_`8q}tmOw>qQH&)lzsP}R$j%oOQuM+b(OWiXrVkZAcu%*Wxh3SiG5?xbeY()4e z5>Jg}%O^Ns3H69`4VrL0I3Ar4KajWWBD^c%V7kjCcVc@9FWWaDQ5pt~DHEKEzT`~g zBpymQ({t8vvf?&h#Mk!P{AcF}xu{Fv4x!6{8JlCzm})}!P5UppI>EC{N|B@WUT~@86f4O_GJ$blXqy=B0K_N`g6kV~a z0XA@-bk&pwB7pUdS_NP?5;Tt@5`~&V#L)I}0dlB=Am{KFL6itP{t_tHP%CO28I&@M zh5p?bl7W}*PT?{ZOHSQ)(SW)-H>V-=U+5&)oFN!PYbcpDspSu6!gln3`-jg4(t7;1 z&_>c``m8yE^wS2^R&rB|SU77rS4j(C4vfoHC#vCl?4F^ z|0g3BfvCFJbtA~Q0mg|ofR;)r;Fmv{mt9*1@NQtet*8mMR0o2^?oaf)hOuz>Jw=b z!U-~zR_VU10v2pt*|F&1&xQ|lqcL|Rz)oyEd2ACHEKOz+E|nHcf1qSw6FhK@c3bV< zecAxh^nqIE_$ujAX#+1TFl4Je5sao2j2O$zy6{lREXqvHlZLt06v#pcz=FBh`+Os* zLz!1IwH%aOM<)PHz$_emCscNgGqGe{w#)fKeKpsgs{s-+`k?~s5f_=NQOhh(H&k2G z5$tp9XK@b`KZ`T98FOUs-nnow9;edn3_fFj8G5aI+HM!UTfrSLe8pGG3cZ;`@P>%5Oi7!DwCRb`NwG*bedbn zU*DY4#@^M55_X-}m-~7Rs!e6uSmps-Yk1bPAKZUqBZyi0A`uhTi9UXC*B#w{tEh(q z;*I}r zi8^ulM)?pcis||6J*+E%)skSQJ)ViAL@Vr0zT^U)01V0jrRop1Ay7Jsoz51-NF_v;IIYi2l&kSTGYa}Qs0M5ix zqs&?9fVtje_<>$|o19g|tbW((ly+BgR)5A+aS|t^*v>(1!o7w+8{6A7k;1LiE{ zNR<7PlzQtg%PVb$fA5_%bEkBTm}cb&pF5c0Iptf~9Xaz7Ba4I?>`9t?NW4wLw0fd1 z5T61ZKmwQ_z|!V54fEd3J+RL&fTc}}8-v6uW0qf4b8V+vf8E%UNWYyNAuc6i#tg_Q zzcLdy6VcOT6%#cEX|*18YZx%3>z+1aGt;~5Fd$4!W7ERXNE{8VU~aXJW=z#F35#T)G+I`2N>JZQVU0peLLHm*87Aw zc+nwFbNy2S0N?^YIf!Z6KP$X@hNj$>>7HDfh9B59DmU7J4`~P;{qlwe-Xkvs7l8e` zxHLb6(j*A`H!9Ly|a=Wg={#Q^`Q*^uL`r2Tz%phl8$+XUQ`|~uUpXc+ zpnOp)4XtiOQ^Z<>IEdo&OFo}?q(zI-Zm~sA66%@Ec*bk)-}}0>63oTZF~+aPp6bWz z#R5vSbBTT=-0ca<#l+_WG8NZ?@n|%N!W+?#$(KmZk2NJEU7A0CXqHg6_R+4&wx_%e zB=CoF7!gh7IV|)C%~+HOEMPLcW$9RUwq!&tosBet+#d*hr;1qf2geCmR(jZI^#3BM z&Yd6dfW1_h2*u;xa-#QZ*)8R8ceV^c3ydjqV)O7} znt$I-6~H83%TDDrnW=YZ81to+%MsL?nfhN#xkE%P07e1{Su|de*6D5qRg1+Th?tRf zYTUaGZoN*80P<17A_9pus-V~Fa%odsa>qtrFDA3?GLuyWG@# zrs@%rZjn&?&{+N$T;T#%S$oa^N#DVbDnkPXub2+_-UW#$8Tx1@+upDVUIrfsWVlfc ztR^<@-od}e4IP>uuK2P{9jhIGLi!$3?JGHwb?9pgCN_6?V&~Pf7nfDxW0;8B)WU?b zz^g)q6q1}3?gq8fEM0_XG|RGhR*BPs`KxB)fX;{VKv%OLy|t96LBM9iY}I7m9O>0F zl4C+Wd3%OT^PRWnf?zCq47fHe@;O;3cFRF?fXm3-K6~*Yo>Eqth0mA_bl|3qo^LcX z`O^fFYCHoHu)fg{+jMacrJ73~oVH#IBY842@$9G6oP;{K1;kC6V#E9PX4@3ZW<8Zy zlQuFl09y3N&pX{&l1@%)j1y&9$?^Wq-pkirYTrWjef7K=3LWKBU#iQiyG8wOL)`=h z+g57R>d-g--PZx6^pFw`=SmCFRux3B;*#L!jQEv18hBKHEO&Z3w-Y z7nq)bb3~*b9v;-p3(t=Kg6T`aV8E0E%M1bAXP)E=JHdxWV2|o}i;^L~qN9XOr%P`; zx9{mGNT2s;O(f|7X$Anp0~uGy#l&ObV|gfkG7nbL;Hs^PmQxFmH=U_YKftqZVNUZw zGayBvC3}m{M+*w#x%UvE^;h>(9YWS;^xX(t4JWRlSSIjAp&~nQG8W^xzs9U#}#rJ8KYZV=W-w+gpl^+Av@Q0L)y%n44LPWcI>=d=V9aU zm*C|SvWXS|3XUxsR8R96sPn2g*FfPX_4HL*s&Kf$vrgF49Fva$c&Jo;Bk;1CcG<%` zQOh;(F1IxOroqEVZF_>!FKJzab^geu+TzyQDgX?x>N~RJXLv#Sr1@!G^`&MFZ=8q| z-`RQl1vbCBp(wf@Jkm17nmwH&gfw=cxiDkW6s4g!>}7NqP1TA0%Na=v8n{T{k2&ZY zuWh<_rh(JJ3rl#91Qq4&H!ydimcO%_LEXe(aNc(s^S2VFv=n5& zzAl4yVkp1j5(p>-a#efzn`R^2efUbsOMY`lS-jKy)dj!s{GLVgsZCtud{q&xl`JQV zKmJ3S%faByRL(bND#kkfAqrdwS41aXy|L!5j*aABxw!mLS#yDl%4ytBHtytct}Rc z9^{P744(ZJ~RbvB25hu zK5^%J>Ngn4OYn8LIdPJ@`FZfp;`$TAaL!XafFB1 zud$&T_HJ9&nXi`tsRlNxUqYT1eDpfTglNr3rLAJlVNL?2Qjp{cl8%9WuiCUhOh~lY zf=mQ)_y+-)IZDlu@3g$!@r{O{JR0B9%HZTbtHg;C9|C-l@`c5wB2=h7&pjU`2l|Kz z@PUe_CvQZ(-@@7DR2DE|4KXJKG~xhivP$@T?%(}{k^FtwfQW^K8n9>afKc?-22iWfh1`tqy zM*sKJga3svlK)XX`2QA0@_)pijrD)dA7NnskNw#s{}Bv+8f13Zq*4h1{Cg*?l;N5h zB{IgYOsH+_V;piua|e+}bH&Eu?tkJ(c)?=O|Lpm*SK4s3y`RHxqI;$yH1Nll^KKeE z95T7FW@}9zqyJ*km9-7UFrWP!YH|~59(W`RLCD05?>Bhe&7X$HPevaoThWcFwS>(q zt=)v&pSM}?a+-YZ(!H729Nh0*ua&{tkNbJamJxhdBiuay+I^s&&{mIWhgvGBXmFh03f@x@6#YRZ)PYsgLegQmnlFJoSaN8@LOwgRsLP#(%� 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�z0V0Q9-wiIOc>qJiItn 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 literal 0 HcmV?d00001 diff --git a/csharp/Lib/Protocols/Modbus/Modbus.csproj b/csharp/Lib/Protocols/Modbus/Modbus.csproj index 0bcc73c8c..85aaefa65 100644 --- a/csharp/Lib/Protocols/Modbus/Modbus.csproj +++ b/csharp/Lib/Protocols/Modbus/Modbus.csproj @@ -9,7 +9,6 @@ false - @@ -18,7 +17,6 @@ - diff --git a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/Accessors.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/Accessors.cs index 2a2e9e2c5..6c27b7f72 100644 --- a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/Accessors.cs +++ b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/Accessors.cs @@ -6,5 +6,5 @@ public static class Accessors public static MbWord WordAt (this ArraySegment data, Byte i) => new MbWord(data, i); public static MbWords WordsAt (this ArraySegment data, Byte i) => new MbWords(data, i); public static MbBits BitsAt (this ArraySegment data, Byte i) => new MbBits(data, i); - public static MbByte ByteAt(this ArraySegment data,Byte i) where T : struct, IConvertible => new MbByte(data, i); + public static MbByte ByteAt(this ArraySegment data, Byte i) where T : struct, IConvertible => new MbByte(data, i); } \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/Endian.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/Endian.cs new file mode 100644 index 000000000..5ec75397d --- /dev/null +++ b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/Endian.cs @@ -0,0 +1,7 @@ +namespace InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Accessors; + +public enum Endian +{ + Little, + Big +} \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbBits.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbBits.cs index 137c377f3..ac990f5d8 100644 --- a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbBits.cs +++ b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbBits.cs @@ -3,11 +3,15 @@ using InnovEnergy.Lib.Utils; namespace InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Accessors; -public readonly struct MbBits : IReadOnlyList +public readonly struct MbBits : IReadOnlyList, IReadOnlyList { - private readonly ArraySegment _Data; + public readonly ArraySegment RawData; - internal MbBits(ArraySegment data, Byte startIndex) : this(data, startIndex, CountBits(data, startIndex)) + internal MbBits(Int32 bitCount) : this(new Byte[NbRegistersFromNbBits(bitCount)]) + { + } + + internal MbBits(ArraySegment data, Byte startIndex = 0) : this(data, startIndex, CountBits(data, startIndex)) { } @@ -24,23 +28,32 @@ public readonly struct MbBits : IReadOnlyList internal MbBits(Byte[] data, Byte startIndex, UInt16 bitCount) { - _Data = new ArraySegment(data, startIndex, Math.Ceiling(bitCount / 8.0).ConvertTo()); + RawData = new ArraySegment(data, startIndex, NbRegistersFromNbBits(bitCount)); } - internal void Set(IReadOnlyList values) + private static UInt16 NbRegistersFromNbBits(Int32 bitCount) { - for (var i = 0; i < values.Count; i++) - { - SetBit((UInt16)i, values[i]); - } + return Math.Ceiling(bitCount / 8.0).ConvertTo(); } + internal void Set(IReadOnlyCollection values) + { + var i = 0; + foreach (var value in values) + SetBit((UInt16)i++, value); + } - public IEnumerator GetEnumerator() => Enumerable.Range(0, Count).Select(GetBit).GetEnumerator(); + IEnumerator IEnumerable.GetEnumerator() => GetBits() + .OfType() + .GetEnumerator(); + + public IEnumerator GetEnumerator() => GetBits().GetEnumerator(); + + private IEnumerable GetBits() => Enumerable.Range(0, Count).Select(GetBit); IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); - public Int32 Count => _Data.Count * 8; + public Int32 Count => RawData.Count * 8; private Boolean GetBit(Int32 index) @@ -48,10 +61,10 @@ public readonly struct MbBits : IReadOnlyList var byteIndex = index / 8; var bitIndex = index % 8; - return (_Data[byteIndex] & (1 << bitIndex)) != 0; + return (RawData[byteIndex] & (1 << bitIndex)) != 0; } - private void SetBit(UInt16 index, Boolean value) + internal void SetBit(UInt16 index, Boolean value) { var byteIndex = index / 8; var bitIndex = index % 8; @@ -59,12 +72,13 @@ public readonly struct MbBits : IReadOnlyList var mask = 1 << bitIndex; // !! needs the u suffix! if (value) - _Data[byteIndex] |= (Byte)mask; + RawData[byteIndex] |= (Byte)mask; else - _Data[byteIndex] &= (Byte)~mask; + RawData[byteIndex] &= (Byte)~mask; } public Boolean this[Int32 index] => GetBit(index); + IConvertible IReadOnlyList.this[Int32 index] => this[index]; } diff --git a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbData.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbData.cs new file mode 100644 index 000000000..42f4efc9d --- /dev/null +++ b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbData.cs @@ -0,0 +1,232 @@ +using InnovEnergy.Lib.Utils; + +namespace InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Accessors; + +using Float32 = Single; +using Float64 = Double; + +// switch exhaustion +#pragma warning disable CS8524 + +public struct MbData +{ + + //TODO: use System.Buffers.Binary.BinaryPrimitives + // see Decimal class + + private readonly ArraySegment _Data; + private readonly Endian _Endian; + private readonly UInt16 _StartAddress; + + public static MbData Registers(UInt16 startAddress, UInt16 nRegisters) + { + if (nRegisters > Constants.MaxRegs) + throw new ArgumentException(nameof(nRegisters)); + + var nBytes = nRegisters * 2; + var data = new Byte[nBytes]; + return new MbData(data, startAddress, Endian.Big); // endian has no influence on coils + } + + public static MbData Coils(UInt16 startAddress, UInt16 nCoils) + { + if (nCoils > Constants.MaxCoils) + throw new ArgumentException(nameof(nCoils)); + + var nBytes = Math.Ceiling(nCoils / 8.0).ConvertTo(); + var data = new Byte[nBytes]; + return new MbData(data, startAddress, Endian.Big); // endian has no influence on coils + } + + internal MbData(ArraySegment data, UInt16 startAddress, Endian endian) + { + if (endian != Endian.Big && endian != Endian.Little) + throw new ArgumentOutOfRangeException(nameof(endian), endian, null); + + _Endian = endian; + _StartAddress = startAddress; + _Data = data; + } + + #region Coils + + public IReadOnlyList GetCoils() + { + IEnumerable GetBits(Byte b) => 1.Unfold(m => m << 1) + .Take(8) + .Select(m => (b & m) > 0); + + return _Data.SelectMany(GetBits).ToList(); + } + + public Boolean GetInput(UInt16 address) => GetCoil(address); + + public Boolean GetCoil(UInt16 address) + { + var index = address - _StartAddress; + + var byteIndex = index / 8; + var bitIndex = index % 8; + + return (_Data[byteIndex] & (1 << bitIndex)) != 0; + } + + public void SetCoil(UInt16 address, Boolean value) + { + var index = address - _StartAddress; + + var byteIndex = index / 8; + var bitIndex = index % 8; + + _Data[byteIndex] = (Byte)(_Data[byteIndex] | (1 << bitIndex)) ; + } + + #endregion Coils + + #region 16Bit + + public UInt16 GetUInt16(UInt16 address) + { + return GetRegister((address - _StartAddress) * 2); + } + + public Int16 GetInt16(UInt16 address) + { + return (Int16) GetUInt16(address); + } + + public UInt16 SetUInt16(UInt16 address, UInt16 value) + { + var i = (address - _StartAddress) * 2; + + _Data[i ] = (Byte)(value >> 8); + _Data[i + 1] = (Byte)(value & 0xFF); + + return value; + } + + public void SetInt16(UInt16 address, Int16 value) + { + SetUInt16(address, (UInt16)value); + } + + #endregion 16Bit + + #region 32Bit + + public UInt32 GetUInt32(UInt16 address) + { + var hi = (UInt32) GetUInt16(address); + var lo = (UInt32) GetUInt16(++address); + + return _Endian switch + { + Endian.Big => hi << 16 | lo, + Endian.Little => lo << 16 | hi, + }; + } + + public Int32 GetInt32(UInt16 address) => (Int32)GetUInt32(address); + + public void SetUInt32(UInt16 address, UInt32 value) + { + var hi = (UInt16)(value >> 16); + var lo = (UInt16)(value & 0xFF_FF); + + if (_Endian == Endian.Big) + { + SetUInt16(address, hi); + SetUInt16(++address, lo); + } + else + { + SetUInt16(address, lo); + SetUInt16(++address, hi); + } + } + + public void SetInt32(UInt16 address, Int64 value) => SetUInt32(address, (UInt32)value); + + public Float32 GetFloat32(UInt16 address) + { + return address + .Apply(GetUInt32) + .Apply(BitConverter.UInt32BitsToSingle); + } + + public void SetFloat32(UInt16 address, Float32 value) + { + SetUInt32(address, BitConverter.SingleToUInt32Bits(value)); + } + + #endregion 32Bit + + #region 64Bit + + public UInt64 GetUInt64(UInt16 address) + { + var hi = (UInt64) GetUInt32(address); + var lo = (UInt64) GetUInt32(++address); + + return _Endian switch + { + Endian.Big => hi << 32 | lo, + Endian.Little => lo << 32 | hi, + }; + } + + public Int64 GetInt64(UInt16 address) => (Int32)GetUInt64(address); + + public void SetUInt64(UInt16 address, UInt64 value) + { + var hi = (UInt32)(value >> 32); + var lo = (UInt32)(value & 0xFF_FF_FF_FF); + + if (_Endian == Endian.Big) + { + SetUInt32(address, hi); + SetUInt32((UInt16)(address + 2), lo); + } + else + { + SetUInt32(address, lo); + SetUInt32((UInt16)(address + 2), hi); + } + } + + public void SetInt64(UInt16 address, Int64 value) => SetUInt64(address, (UInt64)value); + + public Float64 GetFloat64(UInt16 address) + { + return address + .Apply(GetUInt64) + .Apply(BitConverter.UInt64BitsToDouble); + } + + public void SetFloat64(UInt16 address, Float64 value) + { + SetUInt64(address, BitConverter.DoubleToUInt64Bits(value)); + } + + #endregion 64Bit + + + private UInt16 GetRegister(Int32 i) + { + var hi = _Data[i] << 8; + var lo = _Data[i + 1]; + + return (UInt16)(hi | lo); + } + + public IReadOnlyList GetRegisters() + { + var nRegisters = _Data.Count / 2; + + return Enumerable + .Range(0, nRegisters) + .Select(GetRegister) + .ToArray(nRegisters); + } + +} \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbRegisters.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbRegisters.cs deleted file mode 100644 index 6ff463460..000000000 --- a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbRegisters.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System.Collections; -using InnovEnergy.Lib.Utils; - -namespace InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Accessors; - -using Float32 = Single; - -public struct MbRegisters : IReadOnlyList -{ - private MbWords Words { get; } - private UInt16 StartRegister { get; } - - public MbRegisters(MbWords words, UInt16 startRegister) - { - Words = words; - StartRegister = startRegister; - } - - public IEnumerator GetEnumerator() => Words.GetEnumerator(); - - IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); - - public Int32 Count => Words.Count; - - public UInt16 this[Int32 index] => Words[index]; - - private Byte MapIndex(UInt16 index) - { - var i = index - StartRegister; - if (i is < Byte.MinValue or > Byte.MaxValue) - throw new IndexOutOfRangeException(); - - return (Byte)i; - } - - public UInt16 GetUInt16(UInt16 index) - { - return index - .Apply(MapIndex) - .Apply(Words.GetUInt16); - } - - public void SetUInt16(UInt16 index, UInt16 value) - { - Words.SetUInt16(MapIndex(index), value); - } - - public Int16 GetInt16(UInt16 index) - { - return (Int16) GetUInt16(index); - } - - public void SetUInt16(UInt16 index, Int16 value) - { - SetUInt16(index, (UInt16)value); - } - - public UInt32 GetUInt32(UInt16 index) - { - var i = MapIndex(index); - - var hi = (UInt32) GetUInt16(i); - var lo = (UInt32) GetUInt16(++i); - - return hi << 16 | lo; - } - - // TODO - // public void SetUInt32(UInt32 index, UInt32 value) - - public Int32 GetInt32(UInt16 index) => (Int32)GetUInt32(index); - - // TODO - // public void SetInt32(Int32 index, Int32 value) - - - public Float32 GetFloat32(UInt16 index) - { - return index - .Apply(GetInt32) - .Apply(BitConverter.Int32BitsToSingle); - } - - // TODO - // public void SetFloat32(Float32 index, Float32 value) - - - - -} \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbWords.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbWords.cs index 5511c5c63..5ff9232f9 100644 --- a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbWords.cs +++ b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbWords.cs @@ -3,9 +3,9 @@ using InnovEnergy.Lib.Utils; namespace InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Accessors; -public readonly struct MbWords : IReadOnlyList +public readonly struct MbWords : IReadOnlyList , IReadOnlyList { - internal readonly ArraySegment Data; + public readonly ArraySegment RawData; internal MbWords(ArraySegment data, Byte startIndex = 0) : this(data, startIndex, CountWords(data, startIndex)) @@ -13,7 +13,7 @@ public readonly struct MbWords : IReadOnlyList internal MbWords(ArraySegment data, Byte startIndex, UInt16 wordCount) { - Data = new ArraySegment(data.Array!, startIndex + data.Offset, wordCount * 2); + RawData = new ArraySegment(data.Array!, startIndex + data.Offset, wordCount * 2); } private static UInt16 CountWords(ArraySegment data, Byte startIndex) @@ -24,28 +24,40 @@ public readonly struct MbWords : IReadOnlyList internal IReadOnlyCollection Set(IReadOnlyCollection values) { - if (values.Count != Data.Count / 2) + if (values.Count != RawData.Count / 2) throw new ArgumentException($"Expecting an list of size {values.Count}!", nameof(values)); var i = 0; foreach (var value in values) { - Data[i++] = (Byte) (value >> 8); - Data[i++] = (Byte) (value & 0xFF); + RawData[i++] = (Byte) (value >> 8); + RawData[i++] = (Byte) (value & 0xFF); } return values; } - - public IEnumerator GetEnumerator() + IEnumerator IEnumerable.GetEnumerator() { - var end = Data.Count; + var end = RawData.Count; for (var i = 0; i < end; ) { - var hi = Data[i++] << 8; - var lo = Data[i++]; + var hi = RawData[i++] << 8; + var lo = RawData[i++]; + + yield return (UInt16) (hi | lo); + } + } + + public IEnumerator GetEnumerator() + { + var end = RawData.Count; + + for (var i = 0; i < end; ) + { + var hi = RawData[i++] << 8; + var lo = RawData[i++]; yield return (UInt16) (hi | lo); } @@ -53,7 +65,7 @@ public readonly struct MbWords : IReadOnlyList IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); - public Int32 Count => Data.Count / 2; + public Int32 Count => RawData.Count / 2; public UInt16 this[Int32 index] { @@ -63,8 +75,8 @@ public readonly struct MbWords : IReadOnlyList { var i = index * 2; - var hi = Data[i] << 8; - var lo = Data[i+1]; + var hi = RawData[i] << 8; + var lo = RawData[i+1]; return (UInt16) (hi | lo); } @@ -76,7 +88,9 @@ public readonly struct MbWords : IReadOnlyList public void SetUInt16(Byte index, UInt16 value) { var i = index * 2; - Data[i + 0] = (Byte)(value >> 8); - Data[i + 1] = (Byte)(value & 0xFF); + RawData[i + 0] = (Byte)(value >> 8); + RawData[i + 1] = (Byte)(value & 0xFF); } + + IConvertible IReadOnlyList.this[Int32 index] => this[index]; } \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/ReadCoilsCommandFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/ReadCoilsCommandFrame.cs index edb4548de..e5034f8de 100644 --- a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/ReadCoilsCommandFrame.cs +++ b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/ReadCoilsCommandFrame.cs @@ -1,6 +1,7 @@ using InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Accessors; using InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Replies; using InnovEnergy.Lib.Utils; +using static InnovEnergy.Lib.Protocols.Modbus.Protocol.FunctionCode; namespace InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Commands; @@ -8,8 +9,8 @@ internal class ReadCoilsCommandFrame : ModbusFrame { private const Int32 Size = 6; - private MbWord ReadAddress => Data.WordAt(2); - private MbWord QuantityOfInputs => Data.WordAt(4); + public MbWord ReadAddress => Data.WordAt(2); + public MbWord NumberOfCoils => Data.WordAt(4); public ReadCoilsCommandFrame(Byte slave, UInt16 readAddress, UInt16 nBits) : base(Size) @@ -17,10 +18,10 @@ internal class ReadCoilsCommandFrame : ModbusFrame if (nBits > Constants.MaxCoils) throw new ArgumentOutOfRangeException($"Maximum number of registers ({Constants.MaxCoils}) exceeeded!", nameof(nBits)); - SlaveAddress .Set(slave); - FunctionCode .Set(Protocol.FunctionCode.ReadCoils); - ReadAddress .Set(readAddress); - QuantityOfInputs.Set(nBits); + SlaveAddress .Set(slave); + FunctionCode .Set(ReadCoils); + ReadAddress .Set(readAddress); + NumberOfCoils.Set(nBits); } @@ -29,7 +30,7 @@ internal class ReadCoilsCommandFrame : ModbusFrame if (data.Count != Size) throw new ArgumentException($"Expecting an array of size {Size}", nameof(data)); - AssertFunctionCode(Protocol.FunctionCode.ReadCoils); + AssertFunctionCode(ReadCoils); } public ReadCoilsResponseFrame VerifyResponse(ReadCoilsResponseFrame response) @@ -37,8 +38,8 @@ internal class ReadCoilsCommandFrame : ModbusFrame if (response.SlaveAddress != SlaveAddress) throw new UnexpectedResponseFieldException(nameof(response.SlaveAddress), SlaveAddress.ToString(), response.SlaveAddress); - if (response.Inputs.Count != Math.Ceiling(QuantityOfInputs / 8.0).ConvertTo() * 8) - throw new UnexpectedResponseFieldException(nameof(response.Inputs), QuantityOfInputs.ToString(), response.Inputs.Count); + if (response.Coils.Count != Math.Ceiling(NumberOfCoils / 8.0).ConvertTo() * 8) + throw new UnexpectedResponseFieldException(nameof(response.Coils), NumberOfCoils.ToString(), response.Coils.Count); return response; } diff --git a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/ReadHoldingRegistersCommandFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/ReadHoldingRegistersCommandFrame.cs index 9134b0be9..65b072dc2 100644 --- a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/ReadHoldingRegistersCommandFrame.cs +++ b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/ReadHoldingRegistersCommandFrame.cs @@ -40,12 +40,10 @@ internal class ReadHoldingRegistersCommandFrame : ModbusFrame } - public ReadHoldingRegistersResponseFrame VerifyResponse(ModbusFrame response) + public ReadHoldingRegistersResponseFrame VerifyResponse(ReadHoldingRegistersResponseFrame r) { - if (response.SlaveAddress != SlaveAddress) - throw new UnexpectedResponseFieldException(nameof(response.SlaveAddress), SlaveAddress.ToString(), response.SlaveAddress); - - var r = ReadHoldingRegistersResponseFrame.Parse(response.Data); + if (r.SlaveAddress != SlaveAddress) + throw new UnexpectedResponseFieldException(nameof(r.SlaveAddress), SlaveAddress.ToString(), r.SlaveAddress); if (r.RegistersRead.Count != NbToRead) throw new UnexpectedResponseFieldException(nameof(r.RegistersRead), NbToRead.ToString(), r.RegistersRead.Count); diff --git a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/ReadInputRegistersCommandFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/ReadInputRegistersCommandFrame.cs index a17fe34f8..c873c1d9d 100644 --- a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/ReadInputRegistersCommandFrame.cs +++ b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/ReadInputRegistersCommandFrame.cs @@ -40,7 +40,6 @@ internal class ReadInputRegistersCommandFrame : ModbusFrame if (response.SlaveAddress != SlaveAddress) throw new UnexpectedResponseFieldException(nameof(response.SlaveAddress), SlaveAddress.ToString(), response.SlaveAddress); - if (response.RegistersRead.Count != NbToRead) throw new UnexpectedResponseFieldException(nameof(response.RegistersRead), NbToRead.ToString(), response.RegistersRead.Count); diff --git a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/ReadWriteRegistersCommandFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/ReadWriteRegistersCommandFrame.cs index e280c071d..c11d73563 100644 --- a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/ReadWriteRegistersCommandFrame.cs +++ b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/ReadWriteRegistersCommandFrame.cs @@ -5,7 +5,7 @@ using static InnovEnergy.Lib.Protocols.Modbus.Protocol.FunctionCode; namespace InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Commands; -using UInt16s = IReadOnlyList; +using UInt16s = IReadOnlyCollection; internal class ReadWriteRegistersCommandFrame : ModbusFrame { @@ -21,10 +21,10 @@ internal class ReadWriteRegistersCommandFrame : ModbusFrame public Int32 ExpectedResponseSize => ReadWriteRegistersResponseFrame.ExpectedSize(NbToRead); public ReadWriteRegistersCommandFrame(Byte slave, - UInt16 readAddress, - UInt16 nbToRead, - UInt16 writeAddress, - UInt16s registersToWrite) : base(MinSize + registersToWrite.Count * 2) + UInt16 readAddress, + UInt16 nbToRead, + UInt16 writeAddress, + UInt16s registersToWrite) : base(MinSize + registersToWrite.Count * 2) { if (nbToRead > MaxRegs) throw new ArgumentOutOfRangeException($"Maximum number of registers ({MaxRegs}) exceeeded!", nameof(nbToRead)); diff --git a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/WriteCoilsCommandFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/WriteCoilsCommandFrame.cs index e366616cb..1873fd34b 100644 --- a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/WriteCoilsCommandFrame.cs +++ b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/WriteCoilsCommandFrame.cs @@ -7,7 +7,7 @@ using static InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Constants; namespace InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Commands; -using Booleans = IReadOnlyList; +using Booleans = IReadOnlyCollection; using MbFc = MbByte; public class WriteCoilsCommandFrame : ModbusFrame @@ -17,7 +17,7 @@ public class WriteCoilsCommandFrame : ModbusFrame private MbWord WriteAddress => Data.WordAt(2); private MbWord NbOfCoils => Data.WordAt(4); private MbByte ByteCount => Data.ByteAt(6); - public MbBits CoilsToWrite => Data.BitsAt(7); + private MbBits CoilsToWrite => Data.BitsAt(7); public WriteCoilsCommandFrame(Byte slave, UInt16 writeAddress, Booleans coils) : base(MinSize + NbBytes(coils)) { diff --git a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/WriteRegistersCommandFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/WriteRegistersCommandFrame.cs index b317767c1..e934392c1 100644 --- a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/WriteRegistersCommandFrame.cs +++ b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/WriteRegistersCommandFrame.cs @@ -4,8 +4,8 @@ using static InnovEnergy.Lib.Protocols.Modbus.Protocol.FunctionCode; namespace InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Commands; -using UInt16s = IReadOnlyList; -using MbFc = MbByte; +using UInt16s = IReadOnlyCollection; +using MbFc = MbByte; internal class WriteRegistersCommandFrame : ModbusFrame { diff --git a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadCoilsResponseFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadCoilsResponseFrame.cs index 916bf0d96..8dd78b859 100644 --- a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadCoilsResponseFrame.cs +++ b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadCoilsResponseFrame.cs @@ -7,8 +7,8 @@ public class ReadCoilsResponseFrame : ModbusFrame { private new const Int32 MinSize = 3; - private MbByte ByteCount => Data.ByteAt(2); - public MbBits Inputs => Data.BitsAt(3); + private MbByte ByteCount => Data.ByteAt(2); + internal MbBits Coils => Data.BitsAt(3); public ReadCoilsResponseFrame(Byte slave, IReadOnlyList inputs) : base (inputs.Count) { @@ -17,7 +17,7 @@ public class ReadCoilsResponseFrame : ModbusFrame SlaveAddress .Set(slave); FunctionCode .Set(Protocol.FunctionCode.ReadCoils); ByteCount .Set(nBytes); - Inputs .Set(inputs); + Coils .Set(inputs); } private ReadCoilsResponseFrame(Byte[] data) : this(new ArraySegment(data)) @@ -39,13 +39,7 @@ public class ReadCoilsResponseFrame : ModbusFrame } - public static ReadCoilsResponseFrame Parse(ModbusFrame rawFrame) - { - return new ReadCoilsResponseFrame(rawFrame.Data); - } + public static ReadCoilsResponseFrame Parse(Byte[] data) => new(data); - public static ReadCoilsResponseFrame Parse(ArraySegment data) - { - return new ReadCoilsResponseFrame(data); - } + public static ReadCoilsResponseFrame Parse(ArraySegment data) => new(data); } \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadDiscreteInputsResponseFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadDiscreteInputsResponseFrame.cs index e05234866..7b92fd651 100644 --- a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadDiscreteInputsResponseFrame.cs +++ b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadDiscreteInputsResponseFrame.cs @@ -43,11 +43,11 @@ public class ReadDiscreteInputsResponseFrame : ModbusFrame } - public static ReadDiscreteInputsResponseFrame Parse(ModbusFrame rawFrame) + public static ReadDiscreteInputsResponseFrame Parse(Byte[] data) { - return new ReadDiscreteInputsResponseFrame(rawFrame.Data); + return new ReadDiscreteInputsResponseFrame(data); } - + public static ReadDiscreteInputsResponseFrame Parse(ArraySegment data) { return new ReadDiscreteInputsResponseFrame(data); diff --git a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadHoldingRegistersResponseFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadHoldingRegistersResponseFrame.cs index 7fcd77983..5e594a059 100644 --- a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadHoldingRegistersResponseFrame.cs +++ b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadHoldingRegistersResponseFrame.cs @@ -43,8 +43,7 @@ internal class ReadHoldingRegistersResponseFrame : ModbusFrame throw new ArgumentException(nameof(RegistersRead)); } - - public static ReadHoldingRegistersResponseFrame Parse(ModbusFrame frame) => new ReadHoldingRegistersResponseFrame(frame.Data); + public static ReadHoldingRegistersResponseFrame Parse(Byte[] data) => new ReadHoldingRegistersResponseFrame(data); public static ReadHoldingRegistersResponseFrame Parse(ArraySegment data) => new ReadHoldingRegistersResponseFrame(data); } \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadInputRegistersResponseFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadInputRegistersResponseFrame.cs index 29cebda39..05e8ed3bd 100644 --- a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadInputRegistersResponseFrame.cs +++ b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadInputRegistersResponseFrame.cs @@ -46,9 +46,9 @@ internal class ReadInputRegistersResponseFrame : ModbusFrame - public static ReadInputRegistersResponseFrame Parse(ModbusFrame rawFrame) + public static ReadInputRegistersResponseFrame Parse(Byte[] data) { - return new ReadInputRegistersResponseFrame(rawFrame.Data); + return new ReadInputRegistersResponseFrame(data); } public static ReadInputRegistersResponseFrame Parse(ArraySegment data) diff --git a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/WriteCoilsResponseFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/WriteCoilsResponseFrame.cs index 76518a0e5..dc83498f0 100644 --- a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/WriteCoilsResponseFrame.cs +++ b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/WriteCoilsResponseFrame.cs @@ -33,7 +33,6 @@ public class WriteCoilsResponseFrame : ModbusFrame AssertFunctionCode(WriteMultipleCoils); } - public static WriteCoilsResponseFrame Parse(ArraySegment data) => new WriteCoilsResponseFrame(data); - public static WriteCoilsResponseFrame Parse(Byte[] data) => new WriteCoilsResponseFrame(data); - public static WriteCoilsResponseFrame Parse(ModbusFrame frame) => new WriteCoilsResponseFrame(frame.Data); + public static WriteCoilsResponseFrame Parse(Byte[] data) => new WriteCoilsResponseFrame(data); + } diff --git a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/WriteRegistersResponseFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/WriteRegistersResponseFrame.cs index 76a0a6b7d..f77e7793c 100644 --- a/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/WriteRegistersResponseFrame.cs +++ b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/WriteRegistersResponseFrame.cs @@ -35,5 +35,5 @@ internal class WriteRegistersResponseFrame : ModbusFrame public static WriteRegistersResponseFrame Parse(ArraySegment data) => new WriteRegistersResponseFrame(data); public static WriteRegistersResponseFrame Parse(Byte[] data) => new WriteRegistersResponseFrame(data); - public static WriteRegistersResponseFrame Parse(ModbusFrame frame) => new WriteRegistersResponseFrame(frame.Data); + } \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Reflection/Attributes/AddressOffsetAttribute.cs b/csharp/Lib/Protocols/Modbus/Reflection/Attributes/AddressOffsetAttribute.cs new file mode 100644 index 000000000..48e35cdd0 --- /dev/null +++ b/csharp/Lib/Protocols/Modbus/Reflection/Attributes/AddressOffsetAttribute.cs @@ -0,0 +1,11 @@ + +using static System.AttributeTargets; + +namespace InnovEnergy.Lib.Protocols.Modbus.Reflection.Attributes; + +[AttributeUsage(Class | Struct)] +public class AddressOffsetAttribute : Attribute +{ + public Int32 Offset { get; } + public AddressOffsetAttribute(Int32 offset) => Offset = offset; +} \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Reflection/Attributes/DiscreteInputAttribute.cs b/csharp/Lib/Protocols/Modbus/Reflection/Attributes/DiscreteInputAttribute.cs index 6902b0454..1f5719fdd 100644 --- a/csharp/Lib/Protocols/Modbus/Reflection/Attributes/DiscreteInputAttribute.cs +++ b/csharp/Lib/Protocols/Modbus/Reflection/Attributes/DiscreteInputAttribute.cs @@ -4,5 +4,4 @@ namespace InnovEnergy.Lib.Protocols.Modbus.Reflection.Attributes; public class DiscreteInputAttribute : ModbusBooleanAttribute { public DiscreteInputAttribute(UInt16 address) : base(address) { } - } \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Reflection/Attributes/HoldingRegisterAttribute.cs b/csharp/Lib/Protocols/Modbus/Reflection/Attributes/HoldingRegisterAttribute.cs index 8ecb7f333..5b1d9cf85 100644 --- a/csharp/Lib/Protocols/Modbus/Reflection/Attributes/HoldingRegisterAttribute.cs +++ b/csharp/Lib/Protocols/Modbus/Reflection/Attributes/HoldingRegisterAttribute.cs @@ -2,6 +2,7 @@ namespace InnovEnergy.Lib.Protocols.Modbus.Reflection.Attributes; public class HoldingRegisterAttribute : ModbusRegisterAttribute { - public HoldingRegisterAttribute(UInt16 address) : base(address) { } - -} \ No newline at end of file + public HoldingRegisterAttribute(UInt16 address, TypeCode modbusType = TypeCode.UInt16) : base(address, modbusType) { } +} + + diff --git a/csharp/Lib/Protocols/Modbus/Reflection/Attributes/InputRegisterAttribute.cs b/csharp/Lib/Protocols/Modbus/Reflection/Attributes/InputRegisterAttribute.cs index 6c53233c3..76649a15d 100644 --- a/csharp/Lib/Protocols/Modbus/Reflection/Attributes/InputRegisterAttribute.cs +++ b/csharp/Lib/Protocols/Modbus/Reflection/Attributes/InputRegisterAttribute.cs @@ -3,5 +3,6 @@ namespace InnovEnergy.Lib.Protocols.Modbus.Reflection.Attributes; public class InputRegisterAttribute : ModbusRegisterAttribute { - public InputRegisterAttribute(UInt16 address) : base(address) { } -} \ No newline at end of file + public InputRegisterAttribute(UInt16 address, TypeCode modbusType = TypeCode.UInt16) : base(address, modbusType) { } +} + diff --git a/csharp/Lib/Protocols/Modbus/Reflection/Attributes/ModbusAttribute.cs b/csharp/Lib/Protocols/Modbus/Reflection/Attributes/ModbusAttribute.cs index c67548fe6..057a8e799 100644 --- a/csharp/Lib/Protocols/Modbus/Reflection/Attributes/ModbusAttribute.cs +++ b/csharp/Lib/Protocols/Modbus/Reflection/Attributes/ModbusAttribute.cs @@ -1,8 +1,32 @@ +using static System.AttributeTargets; + namespace InnovEnergy.Lib.Protocols.Modbus.Reflection.Attributes; -[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] -public abstract class ModbusAttribute : Attribute +[AttributeUsage(Field | Property)] +public class ModbusAttribute : Attribute { - public UInt16 Address { get; } - protected ModbusAttribute(UInt16 address) { Address = address; } + public UInt16 Address { get; } + public UInt16 Size { get; } + public TypeCode ModbusType { get; } + + protected ModbusAttribute(UInt16 address, TypeCode modbusType) + { + Address = address; + ModbusType = modbusType; + + Size = modbusType switch + { + TypeCode.Boolean => 1, + TypeCode.Int16 => 1, + TypeCode.UInt16 => 1, + TypeCode.Int32 => 2, + TypeCode.UInt32 => 2, + TypeCode.Single => 2, + TypeCode.Int64 => 4, + TypeCode.UInt64 => 4, + TypeCode.Double => 4, + _ => throw new ArgumentException(nameof(modbusType)) + }; + + } } \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Reflection/Attributes/ModbusBooleanAttribute.cs b/csharp/Lib/Protocols/Modbus/Reflection/Attributes/ModbusBooleanAttribute.cs index df2f55c11..d2a10da79 100644 --- a/csharp/Lib/Protocols/Modbus/Reflection/Attributes/ModbusBooleanAttribute.cs +++ b/csharp/Lib/Protocols/Modbus/Reflection/Attributes/ModbusBooleanAttribute.cs @@ -1,8 +1,9 @@ + namespace InnovEnergy.Lib.Protocols.Modbus.Reflection.Attributes; public class ModbusBooleanAttribute : ModbusAttribute { - protected ModbusBooleanAttribute(UInt16 address) : base(address) + protected ModbusBooleanAttribute(UInt16 address) : base(address, TypeCode.Boolean) { } } \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Reflection/Attributes/ModbusRegisterAttribute.cs b/csharp/Lib/Protocols/Modbus/Reflection/Attributes/ModbusRegisterAttribute.cs index e8e1d8501..1ee6a3907 100644 --- a/csharp/Lib/Protocols/Modbus/Reflection/Attributes/ModbusRegisterAttribute.cs +++ b/csharp/Lib/Protocols/Modbus/Reflection/Attributes/ModbusRegisterAttribute.cs @@ -1,11 +1,30 @@ + + namespace InnovEnergy.Lib.Protocols.Modbus.Reflection.Attributes; public abstract class ModbusRegisterAttribute : ModbusAttribute { - protected ModbusRegisterAttribute(UInt16 address) : base(address) - { - } - public Double Scale { get; init; } = 1; public Double Offset { get; init; } = 0; -} \ No newline at end of file + + protected ModbusRegisterAttribute(UInt16 address, TypeCode modbusType) : base(address, modbusType) + { + if (!SupportedTypes.Contains(modbusType)) + throw new ArgumentException(nameof(modbusType)); + } + + + internal static readonly TypeCode[] SupportedTypes = + { + TypeCode.UInt16, + TypeCode.Int16, + TypeCode.UInt32, + TypeCode.Int32, + TypeCode.UInt64, + TypeCode.Int64, + TypeCode.Single, + TypeCode.Double + }; + +} + diff --git a/csharp/Lib/Protocols/Modbus/Reflection/Batch.cs b/csharp/Lib/Protocols/Modbus/Reflection/Batch.cs new file mode 100644 index 000000000..fee6090ae --- /dev/null +++ b/csharp/Lib/Protocols/Modbus/Reflection/Batch.cs @@ -0,0 +1,115 @@ +using InnovEnergy.Lib.Protocols.Modbus.Clients; +using InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames; +using InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Accessors; +using InnovEnergy.Lib.Protocols.Modbus.Reflection.Attributes; + +namespace InnovEnergy.Lib.Protocols.Modbus.Reflection; + +#pragma warning disable CS8509 + +internal record Batch(Action Read, Action Write); + +public static class Batches +{ + internal static IEnumerable> MakeBatchesFor(this ModbusClient modbusClient, Int32 addressOffset) + { + var members = ModbusMembers + .From(addressOffset) + .OrderBy(m => m.Attribute.GetType().Name) + .ThenBy(m => m.StartAddress) + .ThenBy(m => m.EndAddress); + + return MakeBatches(modbusClient, members); + } + + private static IEnumerable> MakeBatches(ModbusClient mb, IEnumerable modbusMembers) + { + var batchMembers = new List(); + + foreach (var member in modbusMembers) + { + if (CloseBatch(member)) + { + yield return MakeBatch(mb, batchMembers); + batchMembers = new List(); + } + + batchMembers.Add(member); + } + + if (batchMembers.Count > 0) + yield return MakeBatch(mb, batchMembers); + + Boolean CloseBatch(ModbusMember m) + { + if (batchMembers.Count == 0) + return false; + + return m.StartAddress > batchMembers[^1].EndAddress // gap between registers + || m.EndAddress > batchMembers[0].StartAddress + Constants.MaxRegs // max batch size reached + || m.Attribute.GetType() != batchMembers[0].Attribute.GetType(); // different ModbusType + } + } + + + private static Batch MakeBatch(ModbusClient modbusClient, IReadOnlyList members) + { + var startAddress = members[0].StartAddress; + var endAddress = members[^1].EndAddress; + var count = (UInt16)(endAddress - startAddress); + var attribute = members[0].Attribute; + var isWritable = attribute is HoldingRegisterAttribute or CoilAttribute; + + return new Batch(Read(), Write()); + + Action Read() + { + Func readModbus = attribute switch + { + InputRegisterAttribute => () => modbusClient.ReadInputRegisters (startAddress, count), + HoldingRegisterAttribute => () => modbusClient.ReadHoldingRegisters(startAddress, count), + DiscreteInputAttribute => () => modbusClient.ReadDiscreteInputs (startAddress, count), + CoilAttribute => () => modbusClient.ReadCoils (startAddress, count), + }; + + return record => + { + foreach (var member in members) + { + var mbData = readModbus(); + member.ModbusToRecord(mbData, record!); + } + }; + } + + Action Write() + { + if (!isWritable) + return _ => { }; // nop + + Func createMbData = attribute switch + { + HoldingRegisterAttribute => () => MbData.Registers(startAddress, count), + CoilAttribute => () => MbData.Coils (startAddress, count), + }; + + + Action writeModbus = attribute switch + { + HoldingRegisterAttribute => d => modbusClient.WriteRegisters(startAddress, d.GetRegisters()), + CoilAttribute => d => modbusClient.WriteCoils (startAddress, d.GetCoils()), + }; + + + return rec => + { + foreach (var member in members) + { + var mbData = createMbData(); + member.RecordToModbus(rec!, mbData); + writeModbus(mbData); + } + }; + } + } +} \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Reflection/Batches.cs b/csharp/Lib/Protocols/Modbus/Reflection/Batches.cs deleted file mode 100644 index c98cc1aa4..000000000 --- a/csharp/Lib/Protocols/Modbus/Reflection/Batches.cs +++ /dev/null @@ -1,100 +0,0 @@ -using System.Reflection; -using InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames; -using InnovEnergy.Lib.Protocols.Modbus.Reflection.Attributes; -using InnovEnergy.Lib.Utils; -using static System.Reflection.BindingFlags; - -namespace InnovEnergy.Lib.Protocols.Modbus.Reflection; - -using ModbusRegisters = IReadOnlyList; -using ModbusBooleans = IReadOnlyList; -using UInt16s = IReadOnlyList; -using Booleans = IReadOnlyList; - -internal static class Batches -{ - - internal static IEnumerable GetModbusRegisterBatches(this Object statusRecord) where T : ModbusRegisterAttribute - { - var modbusRegisters = from mi in statusRecord.GetDataMembers() - from a in mi.GetCustomAttributes() - select new ModbusRegister(a, mi, statusRecord); - - return modbusRegisters.SplitIntoFrameSizedBatches(); - } - - - internal static IEnumerable GetModbusBooleanBatches(this Object statusRecord) where T : ModbusBooleanAttribute - { - var modbusBooleans = from mi in statusRecord.GetDataMembers() - from a in mi.GetCustomAttributes() - select new ModbusBoolean(a, mi, statusRecord); - - return modbusBooleans.SplitIntoFrameSizedBatches(); - } - - - private static IEnumerable GetDataMembers(this Object statusRecord) - { - const BindingFlags bindingFlags = Instance - | Public - | NonPublic - | FlattenHierarchy; - - var type = statusRecord.GetType(); - - var fields = type.GetFields(bindingFlags); - var props = type.GetProperties(bindingFlags); - - return fields.Concat(props); - } - - - private static IEnumerable SplitIntoFrameSizedBatches(this IEnumerable members) where T : IAddress - { - return members - .OrderBy(m => m.Address) - .GroupWhile((a, b) => b.Address - a.Address > 1) // split when there is a gap between consecutive addresses - .SelectMany(g => g.Chunk(Constants.MaxRegs)); // group cannot be larger than Constants.MaxRegs - } - - - public static IEnumerable SetStatusRecordMembersFromRawModbusValues(this ModbusRegisters modbusBooleans, UInt16s rawRegisterValues) - { - foreach (var modbusBoolean in modbusBooleans) - { - var index = modbusBoolean.Address - modbusBooleans[0].Address; - var rawRegisterValue = rawRegisterValues[index]; - modbusBoolean.SetStatusRecordMemberFromRawModbusValue(rawRegisterValue); - yield return modbusBoolean.Address; - } - } - - - public static UInt16[] GetRawModbusValuesFromControlRecord(this ModbusRegisters modbusBooleans) - { - return modbusBooleans - .Select(v => v.GetRawModbusValueFromControlRecord()) - .ToArray(modbusBooleans.Count); - } - - - public static IEnumerable SetStatusRecordMembersFromRawModbusValues(this ModbusBooleans modbusBooleans, Booleans rawRegisterValues) - { - foreach (var modbusBoolean in modbusBooleans) - { - var index = modbusBoolean.Address - modbusBooleans[0].Address; - var rawRegisterValue = rawRegisterValues[index]; - modbusBoolean.SetStatusRecordMemberFromRawModbusValue(rawRegisterValue); - yield return modbusBoolean.Address; - } - } - - - public static Boolean[] GetRawModbusValuesFromControlRecord(this ModbusBooleans modbusBooleans) - { - return modbusBooleans - .Select(v => v.GetRawModbusValueFromControlRecord()) - .ToArray(modbusBooleans.Count); - } -} \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Reflection/IAddress.cs b/csharp/Lib/Protocols/Modbus/Reflection/IAddress.cs deleted file mode 100644 index 5228d8661..000000000 --- a/csharp/Lib/Protocols/Modbus/Reflection/IAddress.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace InnovEnergy.Lib.Protocols.Modbus.Reflection; - -internal interface IAddress -{ - UInt16 Address { get; } -} \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Reflection/ModbusBoolean.cs b/csharp/Lib/Protocols/Modbus/Reflection/ModbusBoolean.cs deleted file mode 100644 index 0178f681d..000000000 --- a/csharp/Lib/Protocols/Modbus/Reflection/ModbusBoolean.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System.Reflection; -using InnovEnergy.Lib.Protocols.Modbus.Reflection.Attributes; -using InnovEnergy.Lib.Utils; - -namespace InnovEnergy.Lib.Protocols.Modbus.Reflection; - -internal readonly struct ModbusBoolean : IAddress -{ - public UInt16 Address => _Attribute.Address; - - private readonly ModbusBooleanAttribute _Attribute ; - private readonly MemberInfo _MemberInfo ; - private readonly Object _Record; - - [Obsolete] public ModbusBoolean() => throw new Exception("Forbidden"); - - public ModbusBoolean(ModbusBooleanAttribute attribute, MemberInfo memberInfo, Object record) - { - _Attribute = attribute; - _MemberInfo = memberInfo; - _Record = record; - } - - - public UInt16 SetStatusRecordMemberFromRawModbusValue(Boolean rawBooleanValue) - { - if (_MemberInfo is FieldInfo fi) - { - var converted = rawBooleanValue.ConvertTo(fi.FieldType); - fi.SetValue(_Record, converted); - } - else if (_MemberInfo is PropertyInfo pi) - { - var converted = rawBooleanValue.ConvertTo(pi.PropertyType); - pi.SetValue(_Record, converted); - } - - return Address; - } - - public Boolean GetRawModbusValueFromControlRecord() - { - var value = _MemberInfo switch - { - FieldInfo fi => fi.GetValue(_Record)!, - PropertyInfo pi => pi.GetValue(_Record)!, - _ => throw new ArgumentException(nameof(_MemberInfo)) - }; - - return value - .CastTo() - .ConvertTo(); - } -} \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Reflection/ModbusMember.cs b/csharp/Lib/Protocols/Modbus/Reflection/ModbusMember.cs new file mode 100644 index 000000000..cd435a711 --- /dev/null +++ b/csharp/Lib/Protocols/Modbus/Reflection/ModbusMember.cs @@ -0,0 +1,179 @@ +using System.Reflection; +using InnovEnergy.Lib.Protocols.Modbus.Protocol.Frames.Accessors; +using InnovEnergy.Lib.Protocols.Modbus.Reflection.Attributes; +using InnovEnergy.Lib.Utils; +using static System.Reflection.BindingFlags; + +namespace InnovEnergy.Lib.Protocols.Modbus.Reflection; + +#pragma warning disable CS8509 + +internal record ModbusMember +( + UInt16 StartAddress, + UInt16 EndAddress, + ModbusAttribute Attribute, + Action ModbusToRecord, + Action RecordToModbus +); + +internal static class ModbusMembers +{ + private static readonly (Double scale, Double offset) NoTransform = (scale:1, offset:0); + + internal static IEnumerable From(Int32 addressOffset) + { + return GetDataMembers() + .Where(HasAttribute) + .Select(m => m.CreateModbusMember(addressOffset)); + } + + + private static ModbusMember CreateModbusMember(this MemberInfo info, Int32 addressOffset) + { + var attribute = info.GetCustomAttributes().Single(); + var startAddress = (UInt16)(attribute.Address + addressOffset); + var endAddress = (UInt16)(startAddress + attribute.Size); + var modbusType = attribute.ModbusType; + var transform = attribute is ModbusRegisterAttribute mra + ? (mra.Scale, mra.Offset) + : NoTransform; + + var modbusToRecord = info.ModbusToRecord(startAddress, modbusType, transform); + var recordToModbus = info.RecordToModbus(startAddress, modbusType, transform); + + return new ModbusMember + ( + startAddress, + endAddress, + attribute, + modbusToRecord, + recordToModbus + ); + } + + private static Action ModbusToRecord(this MemberInfo info, UInt16 address, TypeCode modbusType, (Double scale, Double offset) transform) + { + var decode = ConvertModbusToRecord(transform); + + Func readFromMbData = modbusType switch + { + TypeCode.Boolean => d => d.GetInput (address), + TypeCode.UInt16 => d => d.GetUInt16 (address), + TypeCode.Int16 => d => d.GetInt16 (address), + TypeCode.UInt32 => d => d.GetUInt32 (address), + TypeCode.Int32 => d => d.GetInt32 (address), + TypeCode.Single => d => d.GetFloat32(address), + TypeCode.UInt64 => d => d.GetUInt64 (address), + TypeCode.Int64 => d => d.GetInt64 (address), + TypeCode.Double => d => d.GetFloat64(address), + _ => throw new ArgumentException(nameof(modbusType)) + }; + + Action set = info switch + { + FieldInfo fi => (rec, value) => fi.SetValue(rec, value.ConvertTo(fi.FieldType)), + PropertyInfo pi => (rec, value) => pi.SetValue(rec, value.ConvertTo(pi.PropertyType)), + }; + + + return (mbData, rec) => + { + var rawModbusValue = readFromMbData(mbData); + var decoded = decode(rawModbusValue); + + set(rec, decoded); + }; + } + + private static Func ConvertModbusToRecord((Double scale, Double offset) transform) + { + if (transform == NoTransform) + return Nop; + + var scale = transform.scale.ConvertTo(); + var offset = transform.offset.ConvertTo(); + + return c => + { + var value = c.ConvertTo(); + + return (value + offset) * scale; + }; + } + + + private static Action RecordToModbus(this MemberInfo info, UInt16 addr, TypeCode modbusType, (Double scale, Double offset) transform) + { + var encode = ConvertRecordToModbus(transform); + + Func get = info switch + { + FieldInfo fi => rec => (IConvertible)fi.GetValue(rec)!, + PropertyInfo pi => rec => (IConvertible)pi.GetValue(rec)!, + }; + + Action writeToMbData = modbusType switch + { + TypeCode.Boolean => (value, mbData) => mbData.SetCoil (addr, value.ConvertTo()), + TypeCode.UInt16 => (value, mbData) => mbData.SetUInt16 (addr, value.ConvertTo()), + TypeCode.Int16 => (value, mbData) => mbData.SetInt16 (addr, value.ConvertTo()), + TypeCode.UInt32 => (value, mbData) => mbData.SetUInt32 (addr, value.ConvertTo()), + TypeCode.Int32 => (value, mbData) => mbData.SetInt32 (addr, value.ConvertTo()), + TypeCode.Single => (value, mbData) => mbData.SetFloat32(addr, value.ConvertTo()), + TypeCode.UInt64 => (value, mbData) => mbData.SetUInt64 (addr, value.ConvertTo()), + TypeCode.Int64 => (value, mbData) => mbData.SetInt64 (addr, value.ConvertTo()), + TypeCode.Double => (value, mbData) => mbData.SetFloat64(addr, value.ConvertTo()), + _ => throw new ArgumentException(nameof(modbusType)) + }; + + return (rec, mbData) => + { + var memberValue = get(rec); + var encoded = encode(memberValue); + + writeToMbData(encoded, mbData); + }; + } + + private static Func ConvertRecordToModbus((Double scale, Double offset) transform) + { + if (transform == NoTransform) + return Nop; + + var scale = transform.scale.ConvertTo(); + var offset = transform.offset.ConvertTo(); + + return c => + { + var value = c.ConvertTo(); + + return value / scale - offset; + }; + } + + + private static T Nop(T c) => c; + + + private static IEnumerable GetDataMembers() + { + var recordType = typeof(R); + + const BindingFlags bindingFlags = Instance + | Public + | NonPublic + | FlattenHierarchy; + + var fields = recordType.GetFields(bindingFlags); + var props = recordType.GetProperties(bindingFlags); + + return fields.Concat(props); + } + + private static Boolean HasAttribute(MemberInfo i) where T : Attribute + { + return i.GetCustomAttributes().Any(); + } +} + \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Reflection/ModbusRegister.cs b/csharp/Lib/Protocols/Modbus/Reflection/ModbusRegister.cs deleted file mode 100644 index 25942638a..000000000 --- a/csharp/Lib/Protocols/Modbus/Reflection/ModbusRegister.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System.Reflection; -using InnovEnergy.Lib.Protocols.Modbus.Reflection.Attributes; -using InnovEnergy.Lib.Utils; - -#pragma warning disable CS8509 - -namespace InnovEnergy.Lib.Protocols.Modbus.Reflection; - -internal readonly struct ModbusRegister : IAddress -{ - - public UInt16 Address => _Attribute.Address; - public Decimal Offset => (Decimal)_Attribute.Offset; - public Decimal Scale => (Decimal)_Attribute.Scale; - - private readonly Object _Record; - private readonly ModbusRegisterAttribute _Attribute; - private readonly MemberInfo _MemberInfo; - - private static readonly Type[] UnsignedTypes = - { - typeof(Byte), - typeof(UInt16), - typeof(UInt32), - typeof(UInt64), - }; - - private Boolean IsUnsigned - { - get - { - var type = _MemberInfo switch - { - FieldInfo fi => fi.FieldType, - PropertyInfo pi => pi.PropertyType - }; - - type = type.IsEnum - ? Enum.GetUnderlyingType(type) - : type; - - return UnsignedTypes.Contains(type); - } - } - - - public ModbusRegister(ModbusRegisterAttribute attribute, MemberInfo memberInfo, Object record) - { - _Record = record; - _Attribute = attribute; - _MemberInfo = memberInfo; - } - - - [Obsolete] public ModbusRegister() => throw new Exception("Forbidden"); - - public UInt16 SetStatusRecordMemberFromRawModbusValue(UInt16 rawRegisterValue) - { - var raw = IsUnsigned - ? (Decimal)rawRegisterValue - : (Int16)rawRegisterValue; // if it is signed we must first reinterpret cast the native UInt16 to Int16 - - var transformed = (raw + Offset) * Scale; - - if (_MemberInfo is FieldInfo fi) - { - var converted = transformed.ConvertTo(fi.FieldType); - fi.SetValue(_Record, converted); - } - else if (_MemberInfo is PropertyInfo pi) - { - var converted = transformed.ConvertTo(pi.PropertyType); - pi.SetValue(_Record, converted); - } - - return Address; - } - - public UInt16 GetRawModbusValueFromControlRecord() - { - var value = _MemberInfo switch - { - FieldInfo fi => fi.GetValue(_Record), - PropertyInfo pi => pi.GetValue(_Record), - _ => throw new ArgumentException(nameof(_MemberInfo)) - }; - - var transformed = value! - .CastTo() - .ConvertTo() / Scale - Offset; - - return IsUnsigned - ? transformed.ConvertTo() - : transformed.ConvertTo().CastTo(); - } - - -} \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Reflection/Record.cs b/csharp/Lib/Protocols/Modbus/Reflection/Record.cs new file mode 100644 index 000000000..da37a95d3 --- /dev/null +++ b/csharp/Lib/Protocols/Modbus/Reflection/Record.cs @@ -0,0 +1,17 @@ +using System.Reflection; +using InnovEnergy.Lib.Protocols.Modbus.Reflection.Attributes; + +#pragma warning disable CS8509 + +namespace InnovEnergy.Lib.Protocols.Modbus.Reflection; + +public static class Record +{ + internal static Int32 GetAddressOffset() + { + return typeof(R) + .GetCustomAttributes() + .Select(a => a.Offset) + .FirstOrDefault(); + } +} \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Slaves/ModbusDevice.cs b/csharp/Lib/Protocols/Modbus/Slaves/ModbusDevice.cs new file mode 100644 index 000000000..b8bf2b2ca --- /dev/null +++ b/csharp/Lib/Protocols/Modbus/Slaves/ModbusDevice.cs @@ -0,0 +1,53 @@ +using InnovEnergy.Lib.Protocols.Modbus.Clients; +using InnovEnergy.Lib.Protocols.Modbus.Reflection; + +namespace InnovEnergy.Lib.Protocols.Modbus.Slaves; + +using Float32 = Single; +using Float64 = Double; + +public class ModbusDevice where R : notnull +{ + private readonly IReadOnlyList> _Batches; + + public ModbusDevice(ModbusClient modbusClient, Int32 addressOffset = 0) + { + var offset = addressOffset + Record.GetAddressOffset(); + _Batches = modbusClient.MakeBatchesFor(offset).ToList(); + } + + public R Read() + { + R r; + + try + { + r = Activator.CreateInstance(); + } + catch (Exception e) + { + throw new Exception + ( + $"type {typeof(R).Name} seems to lack a parameterless constructor. " + + $"Either create one or use the other overload of{nameof(Read)} instead.", + e + ); + } + + return Read(r); + } + + public R Read(R record) + { + foreach (var batch in _Batches) + batch.Read(record); + + return record; + } + + public void Write(R record) + { + foreach (var batch in _Batches) + batch.Write(record); + } +} \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Slaves/ModbusEncoding.cs b/csharp/Lib/Protocols/Modbus/Slaves/ModbusEncoding.cs new file mode 100644 index 000000000..7e749cb3b --- /dev/null +++ b/csharp/Lib/Protocols/Modbus/Slaves/ModbusEncoding.cs @@ -0,0 +1,7 @@ +namespace InnovEnergy.Lib.Protocols.Modbus.Slaves; + +public enum ModbusEncoding +{ + Binary, + Ascii +} \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Slaves/ModbusProtocol.cs b/csharp/Lib/Protocols/Modbus/Slaves/ModbusProtocol.cs new file mode 100644 index 000000000..74ec6c3c3 --- /dev/null +++ b/csharp/Lib/Protocols/Modbus/Slaves/ModbusProtocol.cs @@ -0,0 +1,7 @@ +namespace InnovEnergy.Lib.Protocols.Modbus.Slaves; + +public enum ModbusProtocol +{ + Rtu, + Tcp +} \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Slaves/ModbusSlave.cs b/csharp/Lib/Protocols/Modbus/Slaves/ModbusSlave.cs new file mode 100644 index 000000000..3b1870058 --- /dev/null +++ b/csharp/Lib/Protocols/Modbus/Slaves/ModbusSlave.cs @@ -0,0 +1,55 @@ +using InnovEnergy.Lib.Protocols.Modbus.Channels; +using InnovEnergy.Lib.Protocols.Modbus.Clients; + +namespace InnovEnergy.Lib.Protocols.Modbus.Slaves; + +public static class ModbusSlave +{ + + public static Func ModbusTcp(this Channel channel) + { + ModbusTcpClient SlaveId(Byte slaveId) => new ModbusTcpClient(channel, slaveId); + return SlaveId; + } + + public static Func ModbusRtu(this Channel channel) + { + ModbusRtuClient SlaveId(Byte slaveId) => new ModbusRtuClient(channel, slaveId); + return SlaveId; + } + + + public static Func ModbusTcp(this Channel channel) where R : notnull, new() + { + ModbusTcpClient SlaveId(Byte slaveId) + { + return new ModbusTcpClient(channel, slaveId); + } + + return SlaveId; + } + + public static Func ModbusRtu(this Channel channel) where R : notnull, new() + { + ModbusRtuClient SlaveId(Byte slaveId) => new ModbusRtuClient(channel, slaveId); + return SlaveId; + } + + public static ModbusDevice TcpSlave(this Channel channel, Byte slaveId) where T : notnull, new() + { + var client = new ModbusTcpClient(channel, slaveId); + return new ModbusDevice(client); + } + + public static ModbusDevice RtuSlave(this Channel channel, Byte slaveId) where T : notnull, new() + { + var client = new ModbusRtuClient(channel, slaveId); + return new ModbusDevice(client); + } + + public static ModbusDevice Slave(this ModbusClient modbusClient) where T : notnull, new() + { + return new ModbusDevice(modbusClient); + } + +} \ No newline at end of file diff --git a/csharp/Lib/Protocols/Modbus/Util/ArraySegmentExtensions.cs b/csharp/Lib/Protocols/Modbus/Util/ArraySegmentExtensions.cs index 1e0217ff6..82b1e4de4 100644 --- a/csharp/Lib/Protocols/Modbus/Util/ArraySegmentExtensions.cs +++ b/csharp/Lib/Protocols/Modbus/Util/ArraySegmentExtensions.cs @@ -1,17 +1,15 @@ +using InnovEnergy.Lib.Utils; + namespace InnovEnergy.Lib.Protocols.Modbus.Util; public static class ArraySegmentExtensions { - public static ArraySegment ToArraySegment(this IEnumerable enumerable) + public static ArraySegment ToArraySegment(this IEnumerable enumerable) => enumerable switch { - if (enumerable is T[] array) - return new ArraySegment(array); - - if (enumerable is ArraySegment arraySegment) - return arraySegment; // already an ArraySegment, doh! - - return new ArraySegment(enumerable.ToArray()); - } + ArraySegment ars => ars, + IReadOnlyList rol => rol.ToArray(), + _ => enumerable.ToArray() + }; public static ArraySegment Skip(this ArraySegment seg, Int32 count) {