Ejemplo n.º 1
0
        public void AcquireOutstationConfiguration()
        {
            string configPath = Directory.GetCurrentDirectory() + "..\\..\\..\\OustationConfiguration\\open_dnp3_slave.xml";

            XDocument  document = XDocument.Load(configPath);
            XNamespace ns       = document.Root.GetDefaultNamespace();

            UniversalConfigurationParser configParser;

            switch (ns.NamespaceName)
            {
            case "http://www.dnp3.org/DNP3/DeviceProfile/Jan2010":

                configParser = new DNP3DeviceProfileJan2010Parser(document);
                ((DNP3DeviceProfileJan2010Parser)configParser).Parse();

                lock (Database.lockObject)
                {
                    foreach (AnalogInputPoint analog in ((DNP3DeviceProfileJan2010Parser)configParser).Configuration.DataPointsListConfiguration.AnalogInputPoints)
                    {
                        AnalogInputPoint analogInputPoint = null;
                        if (Database.AnalogInputPoints.TryGetValue(analog.Index, out analogInputPoint))
                        {
                            analogInputPoint.Name        = analog.Name;
                            analogInputPoint.Description = analog.Description;
                            analogInputPoint.Units       = analog.Units;
                            analogInputPoint.ScaleFactor = analog.ScaleFactor;
                            analogInputPoint.ScaleOffset = analog.ScaleOffset;

                            Database.IsConfigAck = true;

                            publisher.AnalogInputChange(analogInputPoint, Database.IsConfigAck);
                        }
                    }
                }

                break;
            }
        }
Ejemplo n.º 2
0
        static void Main(string[] args)
        {
            Console.Title = "SCADA";

            // to do: srediti kasnije, staviti fajlove u neki resource folder ili slicno
            // ako je druga platforma npr. x86 mozda nije dobra putanja!
            string pcConfig         = "RtuConfiguration.xml";
            string scadaConfig      = "ScadaModel.xml";
            string basePath         = Directory.GetParent(System.IO.Directory.GetCurrentDirectory()).Parent.Parent.Parent.FullName;
            string acqComConfigPath = Path.Combine(basePath, scadaConfig);

            CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
            CancellationToken       cancellationToken;
            Task requestsConsumer, answersConsumer, acqRequestsProducer;

            var path = Directory.GetCurrentDirectory() + "..\\..\\..\\DNP3ConfigFiles\\";

            Dictionary <string, UniversalNetworkConfiguration> universalConfigurations  = new Dictionary <string, UniversalNetworkConfiguration>();
            Dictionary <string, DataPointsListConfiguration>   dataPointsConfigurations = new Dictionary <string, DataPointsListConfiguration>();

            foreach (string directory in Directory.GetDirectories(path))
            {
                XDocument  document = XDocument.Load(directory + "\\open_dnp3_slave.xml");
                XNamespace ns       = document.Root.GetDefaultNamespace();

                switch (ns.NamespaceName)
                {
                case "http://www.dnp3.org/DNP3/DeviceProfile/Jan2010":

                    DNP3DeviceProfileJan2010Parser parser = new DNP3DeviceProfileJan2010Parser(document);
                    parser.Parse();
                    parser.Configuration.NetworkConfiguration.Version = ns.NamespaceName;

                    universalConfigurations.Add(parser.Configuration.DeviceConfiguration.DeviceName, parser.Configuration.NetworkConfiguration);
                    dataPointsConfigurations.Add(parser.Configuration.DeviceConfiguration.DeviceName, parser.Configuration.DataPointsListConfiguration);
                    break;
                }
            }

            PCCommunicationEngine PCCommEng = new PCCommunicationEngine();

            PCCommEng.ConfigureEngine(basePath, pcConfig);

            PCCommEng.ConfigureEngine(universalConfigurations);

            while (true)
            {
                if (!PCCommEng.CreateChannels())
                {
                    Console.WriteLine("\nStart the simulator then press any key to continue the application.\n");
                    Console.ReadKey();
                    continue;
                }
                break;
            }

            CommandingAcquisitionEngine AcqEngine = new CommandingAcquisitionEngine();

            if (AcqEngine.ConfigureEngine(acqComConfigPath))
            {
                AcqEngine.ConfigureEngine(dataPointsConfigurations);

                AcqEngine.InitializeSimulator();
                cancellationToken = cancellationTokenSource.Token;

                // to do: for IO bound operation you <await an operation which returns a task inside of an async method>
                // await yields control to the caller of the method thet performed await

                TimeSpan consumeReqTime = TimeSpan.FromMilliseconds(10000); // it should be at least twice than acquisition timeout
                requestsConsumer = Task.Factory.StartNew(() => ProcessRequests(PCCommEng, consumeReqTime, cancellationToken),
                                                         TaskCreationOptions.LongRunning);

                TimeSpan consumeAnswTime = TimeSpan.FromMilliseconds(10000);
                answersConsumer = Task.Factory.StartNew(() => ProcessAnswers(AcqEngine, consumeReqTime, cancellationToken),
                                                        TaskCreationOptions.LongRunning);

                // give simulator some time, and when everything is ready start acquisition
                Thread.Sleep(3000);

                acqRequestsProducer = Task.Factory.StartNew(() => AcqEngine.Acquisition());

                try
                {
                    Console.WriteLine("\n....");
                    SCADAService ss = new SCADAService();
                    ss.Start();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    Console.WriteLine("SCADA service failed.");
                    Console.WriteLine(ex.StackTrace);
                    Console.ReadLine();
                    return;
                }
            }
            else
            {
                Console.WriteLine("Configuration of scada failed.");
            }

            Console.WriteLine("Press <Enter> to stop the service.");
            Console.ReadKey();
            if (cancellationToken.CanBeCanceled)
            {
                // ako nisu bili ni pokrenuti, vrednost taskova je ovde null..
                cancellationTokenSource.Cancel();
            }

            // to do:
            // wait tasks
            AcqEngine.Stop();
            PCCommEng.Stop();
        }