public static IModbusMaster CreateIpMaster(this IModbusFactory factory, IpSettings ipSettings) { switch (ipSettings.ModbusType) { case ModbusType.Tcp: return(factory.CreateMaster( new TcpClient(ipSettings.Hostname, ipSettings.Port))); case ModbusType.Udp: return(factory.CreateMaster( new UdpClient(ipSettings.Hostname, ipSettings.Port))); case ModbusType.RtuOverTcp: return(factory.CreateRtuMaster( new TcpClientAdapter( new TcpClient(ipSettings.Hostname, ipSettings.Port)))); case ModbusType.RtuOverUdp: return(factory.CreateRtuMaster( new UdpClientAdapter( new UdpClient(ipSettings.Hostname, ipSettings.Port)))); default: throw new ArgumentException( "Ip settings must be of type Tcp, Udp, RtuOverTcp, or RtuOverUdp."); } }
/// <summary> /// Gets modbus master object from cache or create new one. /// </summary> /// <param name="factory"></param> /// <param name="frameType"></param> /// <param name="connectionSource"></param> /// <returns></returns> public IModbusMaster Get(IModbusFactory factory, FrameType frameType, ConnectionSourceAbstract connectionSource) { if (factory == default) { throw new ArgumentException("argument 'factory' is mandatory"); } if (connectionSource == default) { throw new ArgumentException("argument 'connectionSource' is mandatory"); } if ((connectionSource == _connectionSource) && (_connectionSource.IsOpen) && (modbusMaster != default) && (modbusMaster?.Transport?.StreamResource?.IsOpen ?? false)) { return(modbusMaster); } _connectionSource = connectionSource; var streamResource = _connectionSource.Get(); if (frameType == FrameType.Ip) { modbusMaster = factory.CreateIpMaster(streamResource); } if (frameType == FrameType.Rtu) { var t = factory.CreateRtuTransport(streamResource); modbusMaster = factory.CreateMaster(t); } if (frameType == FrameType.Ascii) { var t = factory.CreateAsciiTransport(streamResource); modbusMaster = factory.CreateMaster(t); } return(modbusMaster); }
public IModbusMaster CreateMaster() { IModbusRtuTransport transport = CreateTransport(); return(ModbusFactory.CreateMaster(transport)); }