Пример #1
0
        /// <summary>
        /// Creates an ASCII slave network.
        /// </summary>
        /// <param name="factory"></param>
        /// <param name="streamResource"></param>
        /// <returns></returns>
        public static IModbusSlaveNetwork CreateAsciiSlaveNetwork(this IModbusFactory factory,
                                                                  IStreamResource streamResource)
        {
            IModbusAsciiTransport transport = factory.CreateAsciiTransport(streamResource);

            return(factory.CreateSlaveNetwork(transport));
        }
Пример #2
0
        public static IModbusMaster CreateSerialMaster(this IModbusFactory factory, SerialSettings settings)
        {
            SerialPort serialPort = new SerialPort()
            {
                PortName  = settings.PortName,
                BaudRate  = settings.BaudRate,
                DataBits  = settings.DataBits,
                Parity    = settings.Parity,
                StopBits  = settings.StopBits,
                Handshake = settings.Handshake
            };

            var adapter = new SerialPortAdapter(serialPort);

            serialPort.Open();

            switch (settings.ModbusType)
            {
            case ModbusType.Rtu:
                return(factory.CreateRtuMaster(adapter));

            case ModbusType.Ascii:
                return(factory.CreateAsciiMaster(adapter));

            default:
                throw new ArgumentException("Serial Settings must be either of type Rtu or Ascii.");
            }
        }
Пример #3
0
        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.");
            }
        }
Пример #4
0
 internal ModbusRtuOverTcpTransport(IStreamResource streamResource, IModbusFactory modbusFactory, IModbusLogger logger)
     : base(streamResource, modbusFactory, logger)
 {
     if (streamResource == null)
     {
         throw new ArgumentNullException(nameof(streamResource));
     }
 }
Пример #5
0
 internal ModbusIpTransport(IStreamResource streamResource, IModbusFactory modbusFactory)
     : base(streamResource, modbusFactory)
 {
     if (streamResource == null)
     {
         throw new ArgumentNullException(nameof(streamResource));
     }
 }
 public TcpDeviceService(
     ILogger <TcpDeviceService> logger,
     IModbusFactory factory,
     ModbusConfiguration configuration,
     IObservable <PwsObservationsResponse> source)
     : base(logger, factory, configuration, source)
 {
 }
Пример #7
0
 internal ModbusRtuTransport(IStreamResource streamResource, IModbusFactory modbusFactory, IModbusLogger logger)
     : base(streamResource, modbusFactory, logger)
 {
     if (modbusFactory == null)
     {
         throw new ArgumentNullException(nameof(modbusFactory));
     }
     Debug.Assert(streamResource != null, "Argument streamResource cannot be null.");
 }
Пример #8
0
        public static IModbusSlave CreateSlaveProxy(
            this IModbusFactory factory,
            byte unitId,
            IModbusMaster master)
        {
            var dataStore = new ProxyDataStore(unitId, master);

            return(factory.CreateSlave(unitId, dataStore));
        }
Пример #9
0
        internal ModbusTcpSlaveNetwork(TcpListener tcpListener, IModbusFactory modbusFactory, IModbusLogger logger)
            : base(new EmptyTransport(modbusFactory), modbusFactory, logger)
        {
            if (tcpListener == null)
            {
                throw new ArgumentNullException(nameof(tcpListener));
            }

            _server = tcpListener;
        }
Пример #10
0
 protected DeviceService(
     ILogger logger,
     IModbusFactory factory,
     ModbusConfiguration configuration,
     IObservable <PwsObservationsResponse> source)
 {
     Logger        = logger;
     Factory       = factory;
     Configuration = configuration;
     _source       = source;
 }
Пример #11
0
 public DeviceController(IRedisConnectionFactory redisConnectionFactory,
                         IDataAccess mysql_dataAccess,
                         IModbusFactory modbusFactory, ILoggerFactory loggerFactory)
 {
     redis_ai      = redisConnectionFactory.Connection().GetDatabase(1);
     redis_di      = redisConnectionFactory.Connection().GetDatabase();
     modbus        = modbusFactory;
     modbus_master = modbus.GetModbusMaster();
     logger        = loggerFactory.CreateLogger <DeviceController>();
     dataAccess    = mysql_dataAccess;
 }
Пример #12
0
 public ModbusMasterRtuOverTcpConnection(TcpClient client, IModbusSlaveNetwork slaveNetwork, IModbusFactory modbusFactory)
     : base(new ModbusRtuTransport(new TcpClientAdapter(client), modbusFactory))
 {
     //Logger = logger ?? throw new ArgumentNullException(nameof(logger));
     TcpClient           = client ?? throw new ArgumentNullException(nameof(client));
     EndPoint            = client.Client.RemoteEndPoint.ToString();
     Stream              = client.GetStream();
     _slaveNetwork       = slaveNetwork ?? throw new ArgumentNullException(nameof(slaveNetwork));
     _modbusFactory      = modbusFactory ?? throw new ArgumentNullException(nameof(modbusFactory));
     _requestHandlerTask = Task.Run((Func <Task>)HandleRequestAsync);
 }
Пример #13
0
 public ControlSubscribeWorker(IModbusFactory modbus_factory,
                               IRedisConnectionFactory redisFactory,
                               IConfiguration configuration, ModbusSystem modbusSystem)
 {
     config        = configuration;
     modbusFactory = modbus_factory;
     SiteId        = configuration.GetSection("SiteId").Get <int>();
     DeviceIndex   = configuration.GetSection("DeviceIndex").Get <int>();
     modbus        = modbusSystem;
     redisDb       = redisFactory.Connection().GetDatabase(1);
     CancelToken   = Program.CancellationTokenSource.Token;
     this.Initialize();
 }
Пример #14
0
        public static IModbusFunctionService GetFunctionServiceOrThrow(this IModbusFactory factory, byte functionCode)
        {
            IModbusFunctionService service = factory.GetFunctionService(functionCode);

            if (service == null)
            {
                string msg = $"Function code {functionCode} not supported.";
                factory.Logger.Warning(msg);

                throw new NotImplementedException(msg);
            }

            return(service);
        }
Пример #15
0
 public ModbusBackgroundService(ILoggerFactory loggerFactory, IModbusFactory modbus_factory,
                                MqttClientProxyCollection mqttClientProxies, IRedisConnectionFactory redisFactory,
                                IConfiguration configuration, ModbusSystem modbusSystem)
 {
     logger        = loggerFactory.CreateLogger <ModbusBackgroundService>();
     config        = configuration;
     modbusFactory = modbus_factory;
     mqtt_clients  = mqttClientProxies;
     mqtt_config   = configuration.GetSection("MQTTBrokers").Get <MqttConfig>();
     SiteId        = configuration.GetSection("SiteId").Get <int>();
     DeviceIndex   = configuration.GetSection("DeviceIndex").Get <int>();
     modbus        = modbusSystem;
     redis         = redisFactory.Connection().GetDatabase(1);
 }
Пример #16
0
        public static IModbusMessage CreateModbusRequest(this IModbusFactory factory, byte[] frame)
        {
            if (frame.Length < MinRequestFrameLength)
            {
                string msg = $"Argument 'frame' must have a length of at least {MinRequestFrameLength} bytes.";
                throw new FormatException(msg);
            }

            byte functionCode = frame[1];

            var functionService = factory.GetFunctionService(functionCode);

            return(functionService.CreateRequest(frame));
        }
 public ModbusDigitalProcessingService(Microsoft.Extensions.Logging.ILoggerFactory loggerFactory,
                                       IDataAccess mysql_dataAccess, IRedisConnectionFactory redisFactory,
                                       IModbusFactory modbus_factory, IConfiguration configuration, EventPublisherWorker worker, EventMap map,
                                       ModbusSystem modbusSystem)
 {
     logger               = loggerFactory.CreateLogger <ModbusBackgroundService>();
     config               = configuration;
     modbusFactory        = modbus_factory;
     eventPublisherWorker = worker;
     UpdatePeriod         = configuration.GetSection("EventPollInterval").Get <TimeSpan>();
     modbus               = modbusSystem;
     SiteId               = configuration.GetSection("SiteId").Get <short>();
     redis       = redisFactory.Connection().GetDatabase();
     DeviceIndex = configuration.GetSection("DeviceIndex").Get <int>();
     dbAccess    = mysql_dataAccess;
     event_map   = map;
 }
Пример #18
0
        /// <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);
        }
Пример #19
0
 internal ModbusAsciiTransport(IStreamResource streamResource, IModbusFactory modbusFactory)
     : base(streamResource, modbusFactory)
 {
     Debug.Assert(streamResource != null, "Argument streamResource cannot be null.");
 }
Пример #20
0
        public static IModbusSerialMaster CreateRtuMaster(this IModbusFactory factory, SerialPort serialPort)
        {
            var adapter = new SerialPortAdapter(serialPort);

            return(factory.CreateRtuMaster(adapter));
        }
Пример #21
0
        public static IModbusSlaveNetwork CreateAsciiSlaveNetwork(this IModbusFactory factory, SerialPort serialPort)
        {
            var adapter = new SerialPortAdapter(serialPort);

            return(factory.CreateAsciiSlaveNetwork(adapter));
        }
Пример #22
0
        public static IModbusAsciiTransport CreateAsciiTransport(this IModbusFactory factory, SerialPort serialPort)
        {
            var adapter = new SerialPortAdapter(serialPort);

            return(factory.CreateAsciiTransport(adapter));
        }
Пример #23
0
 protected ModbusSlaveNetwork(IModbusTransport transport, IModbusFactory modbusFactory)
     : base(transport)
 {
     ModbusFactory = modbusFactory;
     //_Logger = logger ?? throw new ArgumentNullException(nameof(logger));
 }
Пример #24
0
 public TcpDeviceService(ILogger <TcpDeviceService> logger, IModbusFactory factory, DeviceConfiguration configuration)
     : base(logger, factory, configuration)
 {
 }
Пример #25
0
        public PVBackgroundService(Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, IModbusFactory modbus_factory,
                                   MqttClientProxyCollection mqttClientProxies, IRedisConnectionFactory redisFactory,
                                   IConfiguration configuration)
        {
            logger       = loggerFactory.CreateLogger <PVBackgroundService>();
            config       = configuration;
            mqtt_clients = mqttClientProxies;
            mqtt_config  = configuration.GetSection("MQTTBrokers").Get <MqttConfig>();
            SiteId       = configuration.GetSection("SiteId").Get <int>();
            string mssql_conn = configuration.GetConnectionString("mssql");

            redis          = redisFactory.Connection().GetDatabase(1);
            DeviceName     = configuration.GetSection("Modbus:DeviceName").Get <string>();
            DeviceName     = DeviceName.Substring(0, DeviceName.Length - 1);
            sessionFactory = new MsSqlAccessManager().CreateSessionFactory(mssql_conn);
        }
Пример #26
0
        /// <summary>
        /// Creates an ASCII master.
        /// </summary>
        /// <param name="factory"></param>
        /// <param name="streamResource"></param>
        /// <returns></returns>
        public static IModbusSerialMaster CreateAsciiMaster(this IModbusFactory factory, IStreamResource streamResource)
        {
            IModbusAsciiTransport transport = factory.CreateAsciiTransport(streamResource);

            return(new ModbusSerialMaster(transport));
        }
Пример #27
0
 public EmptyTransport(IModbusFactory modbusFactory)
     : base(modbusFactory, NullModbusLogger.Instance)
 {
 }
 protected DeviceService(ILogger logger, IModbusFactory factory, DeviceConfiguration configuration)
 {
     Logger        = logger;
     Factory       = factory;
     Configuration = configuration;
 }
Пример #29
0
 public EmptyTransport(IModbusFactory modbusFactory)
     : base(modbusFactory)
 {
 }
Пример #30
0
 internal ModbusRtuOverIpTransport(IStreamResource streamResource, IModbusFactory modbusFactory, IModbusLogger logger)
     : base(streamResource, modbusFactory, logger)
 {
 }