/// <summary> /// Constructor of Dacs7Client /// </summary> /// <param name="address">The address of the plc [IP or Hostname]:[Rack],[Slot] where as rack and slot ar optional default is Rack = 0, Slot = 2</param> /// <param name="connectionType">The <see cref="PlcConnectionType"/> for the connection.</param> public Dacs7Client(string address, PlcConnectionType connectionType = PlcConnectionType.Pg) { var addressPort = address.Split(':'); var portRackSlot = addressPort.Length > 1 ? addressPort[1].Split(',').Select(x => Int32.Parse(x)).ToArray() : new int[] { 102, 0, 2 }; _config = new ClientSocketConfiguration { Hostname = addressPort[0], ServiceName = portRackSlot.Length > 0 ? portRackSlot[0] : 102 }; _context = new Rfc1006ProtocolContext { DestTsap = Rfc1006ProtocolContext.CalcRemoteTsap((ushort)connectionType, portRackSlot.Length > 1 ? portRackSlot[1] : 0, portRackSlot.Length > 2 ? portRackSlot[2] : 2) }; _s7Context = new SiemensPlcProtocolContext { }; _protocolHandler = new ProtocolHandler(_config, _context, _s7Context, UpdateConnectionState); }
private Task <bool> DetectAndReceive(Memory <byte> payload) { if (SiemensPlcProtocolContext.TryDetectDatagramType(payload, out var s7DatagramType)) { return(S7DatagramReceived(s7DatagramType, payload)); } return(Task.FromResult(false)); }
public ProtocolHandler(ClientSocketConfiguration config, Rfc1006ProtocolContext rfcContext, SiemensPlcProtocolContext s7Context, Action <ConnectionState> connectionStateChanged) { _context = rfcContext; _s7Context = s7Context; _connectionStateChanged = connectionStateChanged; _socket = new ClientSocket(config) { OnRawDataReceived = OnRawDataReceived, OnConnectionStateChanged = OnConnectionStateChanged }; }
public ProtocolHandler(Transport transport, SiemensPlcProtocolContext s7Context, Action <ConnectionState> connectionStateChanged, ILoggerFactory loggerFactory) { _logger = loggerFactory?.CreateLogger <ProtocolHandler>(); _transport = transport; _s7Context = s7Context; _connectionStateChanged = connectionStateChanged; _logger?.LogDebug("S7Protocol-Timeout is {0} ms", _s7Context.Timeout); SetupTransport(transport, loggerFactory); }
public ProtocolHandler(Transport transport, SiemensPlcProtocolContext s7Context, Action <ProtocolHandler, ConnectionState> connectionStateChanged, ILoggerFactory loggerFactory, Action <Socket> newSocketConnected = null, IPlcDataProvider provider = null) { _logger = loggerFactory?.CreateLogger <ProtocolHandler>(); _transport = transport; _s7Context = s7Context; _connectionStateChanged = connectionStateChanged; _loggerFactory = loggerFactory; _newSocketConnected = newSocketConnected; _provider = provider; _logger?.LogDebug("S7Protocol-Timeout is {0} ms", _s7Context.Timeout); SetupTransport(transport, loggerFactory); }
private static IEnumerable <ReadPackage> CreateReadPackages(SiemensPlcProtocolContext s7Context, IEnumerable <ReadItem> vars) { var result = new List <ReadPackage>(); foreach (var item in vars.OrderByDescending(x => x.NumberOfItems).ToList()) { var currentPackage = result.FirstOrDefault(package => package.TryAdd(item)); if (currentPackage == null) { if (item.NumberOfItems > s7Context.ReadItemMaxLength) { var bytesToRead = item.NumberOfItems; ushort processed = 0; while (bytesToRead > 0) { var slice = Math.Min(s7Context.ReadItemMaxLength, bytesToRead); var child = ReadItem.CreateChild(item, (item.Offset + processed), slice); if (slice < s7Context.ReadItemMaxLength) { currentPackage = result.FirstOrDefault(package => package.TryAdd(child)); } if (currentPackage == null) { currentPackage = new ReadPackage(s7Context.PduSize); if (currentPackage.TryAdd(child)) { if (currentPackage.Full) { yield return(currentPackage.Return()); if (currentPackage.Handled) { currentPackage = null; } } else { result.Add(currentPackage); } } else { ThrowHelper.ThrowCouldNotAddPackageException(nameof(ReadPackage)); } } processed += slice; bytesToRead -= slice; } } else { currentPackage = new ReadPackage(s7Context.PduSize); result.Add(currentPackage); if (!currentPackage.TryAdd(item)) { ThrowHelper.ThrowCouldNotAddPackageException(nameof(ReadPackage)); } } } if (currentPackage != null) { if (currentPackage.Full) { yield return(currentPackage.Return()); } if (currentPackage.Handled) { result.Remove(currentPackage); } } } foreach (var package in result) { yield return(package.Return()); } }
private IEnumerable <WritePackage> CreateWritePackages(SiemensPlcProtocolContext s7Context, IEnumerable <WriteItem> vars) { var result = new List <WritePackage>(); foreach (var item in vars.ToList().OrderByDescending(x => x.Length)) { var currentPackage = result.FirstOrDefault(package => package.TryAdd(item)); if (currentPackage == null) { if (item.Length > s7Context.WriteItemMaxLength) { ushort bytesToWrite = item.Length; ushort processed = 0; while (bytesToWrite > 0) { var slice = Math.Min(_s7Context.WriteItemMaxLength, bytesToWrite); var child = WriteItem.CreateChild(item, (ushort)(item.Offset + processed), slice); if (slice < _s7Context.WriteItemMaxLength) { currentPackage = result.FirstOrDefault(package => package.TryAdd(child)); } if (currentPackage == null) { currentPackage = new WritePackage(s7Context.PduSize); if (currentPackage.TryAdd(child)) { if (currentPackage.Full) { yield return(currentPackage.Return()); if (currentPackage.Handled) { currentPackage = null; } } else { result.Add(currentPackage); } } else { throw new InvalidOperationException(); } } processed += slice; bytesToWrite -= slice; } } else { currentPackage = new WritePackage(s7Context.PduSize); result.Add(currentPackage); if (!currentPackage.TryAdd(item)) { throw new InvalidOperationException(); } } } if (currentPackage != null) { if (currentPackage.Full) { yield return(currentPackage.Return()); } if (currentPackage.Handled) { result.Remove(currentPackage); } } } foreach (var package in result) { yield return(package.Return()); } }