Beispiel #1
0
        static void Main(string[] args)
        {
            Console.WriteLine("GTosPMU to Data for openPDC Test");
            // Create a new protocol parser
            parser = new MultiProtocolFrameParser();

            // Attach to desired events
            parser.ConnectionAttempt          += parser_ConnectionAttempt;
            parser.ConnectionEstablished      += parser_ConnectionEstablished;
            parser.ConnectionException        += parser_ConnectionException;
            parser.ParsingException           += parser_ParsingException;
            parser.ReceivedConfigurationFrame += parser_ReceivedConfigurationFrame;
            parser.ReceivedDataFrame          += parser_ReceivedDataFrame;

            // Define the connection string
            parser.ConnectionString = "phasorProtocol=IeeeC37_118V1; transportProtocol=Serial; accessID=2; "
                                      + "port=COM1; baudrate=115200; parity=None; stopbits=One; databits=8; "
                                      + "dtrenable=False; rtsenable=False; autoStartDataParsingSequence = false;";

            // Start frame parser
            parser.AutoStartDataParsingSequence = true;
            parser.Start();

            // Hold the console open until the operator hits the <Enter> key
            Console.ReadLine();
        }
Beispiel #2
0
        /// <summary>
        /// Creates a new <see cref="ProxyConnectionEditor"/> instance.
        /// </summary>
        public ProxyConnectionEditor()
        {
            InitializeComponent();

            m_udpDestinations = new List <TextBox>();
            m_udpDestinations.Add(textBoxUdpRebroadcast0);

            m_frameParser = new MultiProtocolFrameParser();

            // Initialize phasor protocol selection list
            foreach (object protocol in Enum.GetValues(typeof(PhasorProtocol)))
            {
                comboBoxProtocol.Items.Add(((PhasorProtocol)protocol).GetFormattedProtocolName());
            }

            comboBoxProtocol.SelectedIndex = DefaultPhasorProtocol;

            transparentPanel.Top     = 0;
            transparentPanel.Left    = 0;
            transparentPanel.Width   = Width;
            transparentPanel.Height  = Height;
            transparentPanel.Visible = false;

            RegisterControls();
        }
        private void GetConfigFrame()
        {
            if (m_Files.Count == 0)
            {
                m_ConfigFrameSource.SetResult(null);
            }

            if (m_ConfigFrameSource.Task.IsCompleted)
            {
                return;
            }

            MultiProtocolFrameParser parser = new MultiProtocolFrameParser();

            parser.PhasorProtocol    = PhasorProtocol.IEEEC37_Pdat;
            parser.TransportProtocol = Gemstone.Communication.TransportProtocol.File;
            parser.ConnectionString  = $"file={m_Files.First().Value}";

            parser.ReceivedConfigurationFrame += RecievedConfigFrame;
            parser.Start();

            m_ConfigFrameSource.Task.ContinueWith((t) => {
                parser.Stop();
            });
            return;
        }
        private void GenerateReader(List <string> files, Tuple <Channel <IDataFrame>, int, string> reader, CancellationToken cancellationToken)
        {
            Task.Run(() => {
                n_files = files.Count();

                for (int i = 0; i < files.Count; i++)
                {
                    if (cancellationToken.IsCancellationRequested)
                    {
                        break;
                    }
                    MultiProtocolFrameParser parser = new MultiProtocolFrameParser();
                    ManualResetEvent fileComplete   = new ManualResetEvent(false);
                    parser.PhasorProtocol           = PhasorProtocol.IEEEC37_Pdat;
                    parser.TransportProtocol        = Gemstone.Communication.TransportProtocol.File;
                    parser.ConnectionString         = $"file={files[i]}";
                    LogInfo($"reading File: {files[i]}");
                    parser.CompletedFileParsing += (object sender, EventArgs <int> conf) => { fileComplete.Set(); };
                    parser.ReceivedDataFrame    += (object sender, EventArgs <IDataFrame> conf) => {
                        reader.Item1.Writer.TryWrite(conf.Argument);
                    };
                    parser.DefinedFrameRate  = 10000000;
                    parser.DisconnectAtEOF   = true;
                    parser.ParsingException += ParsingException;
                    parser.Start();
                    WaitHandle.WaitAny(new WaitHandle[] { fileComplete, cancellationToken.WaitHandle }, 5000);
                    parser.Stop();
                    LogInfo($"Reading File {files[i]} complete");
                }
                reader.Item1.Writer.Complete();
            }, cancellationToken);
        }
Beispiel #5
0
        public static void Main(string[] args)
        {
            m_definedMeasurements = new ConcurrentDictionary <string, MeasurementMetadata>();
            m_definedDevices      = new ConcurrentDictionary <ushort, ConfigurationCell>();

            if (WriteLogs)
            {
                m_exportFile = new StreamWriter(FilePath.GetAbsolutePath("InputTimestamps.csv"));
            }

            if (TestConcentrator)
            {
                // Create a new concentrator
                concentrator = new Concentrator(WriteLogs, FilePath.GetAbsolutePath("OutputTimestamps.csv"));
                concentrator.TimeResolution  = 333000;
                concentrator.FramesPerSecond = 30;
                concentrator.LagTime         = 3.0D;
                concentrator.LeadTime        = 9.0D;
                concentrator.PerformTimestampReasonabilityCheck = false;
                concentrator.ProcessByReceivedTimestamp         = true;
                concentrator.Start();
            }

            // Create a new protocol parser
            parser = new MultiProtocolFrameParser();
            parser.AllowedParsingExceptions = 500;
            parser.ParsingExceptionWindow   = 5;

            // Attach to desired events
            parser.ConnectionAttempt          += parser_ConnectionAttempt;
            parser.ConnectionEstablished      += parser_ConnectionEstablished;
            parser.ConnectionException        += parser_ConnectionException;
            parser.ParsingException           += parser_ParsingException;
            parser.ReceivedConfigurationFrame += parser_ReceivedConfigurationFrame;
            parser.ReceivedDataFrame          += parser_ReceivedDataFrame;
            parser.ReceivedFrameBufferImage   += parser_ReceivedFrameBufferImage;
            parser.ConnectionTerminated       += parser_ConnectionTerminated;

            // Define the connection string
            //parser.ConnectionString = @"phasorProtocol=IeeeC37_118V1; transportProtocol=UDP; localport=5000; server=233.123.123.123:5000; interface=0.0.0.0";
            //parser.ConnectionString = @"phasorProtocol=Ieee1344; transportProtocol=File; file=D:\Projects\Applications\openPDC\Synchrophasor\Current Version\Build\Output\Debug\Applications\openPDC\Sample1344.PmuCapture";
            //parser.ConnectionString = @"phasorProtocol=Macrodyne; accessID=1; transportProtocol=File; skipDisableRealTimeData = true; file=C:\Users\Ritchie\Desktop\Development\Macrodyne\ING.out; iniFileName=C:\Users\Ritchie\Desktop\Development\Macrodyne\BCH18Aug2011.ini; deviceLabel=ING1; protocolVersion=G";
            //parser.ConnectionString = @"phasorProtocol=Iec61850_90_5; accessID=1; transportProtocol=UDP; skipDisableRealTimeData = true; localPort=102; interface=0.0.0.0; commandChannel={transportProtocol=TCP; server=172.21.1.201:4712; interface=0.0.0.0}";
            //parser.ConnectionString = @"phasorProtocol=FNET; transportProtocol=TCP; server=172.21.4.100:4001; interface=0.0.0.0; isListener=false";
            //parser.ConnectionString = @"phasorProtocol=Macrodyne; transportProtocol=Serial; port=COM6; baudrate=38400; parity=None; stopbits=One; databits=8; dtrenable=False; rtsenable=False;";
            //parser.ConnectionString = @"phasorProtocol=SelFastMessage; transportProtocol=Serial; port=COM5; baudrate=57600; parity=None; stopbits=One; databits=8; dtrenable=False; rtsenable=False;";
            //parser.ConnectionString = @"phasorProtocol=IEEEC37_118v1; transportProtocol=File; file=C:\Users\Ritchie\Desktop\MTI_Test_3phase.PmuCapture; checkSumValidationFrameTypes=DataFrame,HeaderFrame,CommandFrame";
            //parser.ConnectionString = @"phasorProtocol=IEEEC37_118V1; transportProtocol=tcp; accessID=105; server=172.31.105.135:4712; interface=0.0.0.0; isListener=false";
            parser.ConnectionString = @"phasorProtocol=IEEEC37_118V1; transportProtocol=Serial; port=COM6; baudRate=115200; dataBits=8; stopBits=One; parity=None; dtrEnable=false; rtsEnable=false; autoStartDataParsingSequence=false; disableRealTimeDataOnStop=false";

            Dictionary <string, string> settings = parser.ConnectionString.ParseKeyValuePairs();
            string setting;

            // TODO: These should be optional picked up from connection string inside of MPFP
            // Apply other settings as needed
            if (settings.TryGetValue("accessID", out setting))
            {
                parser.DeviceID = ushort.Parse(setting);
            }

            if (settings.TryGetValue("simulateTimestamp", out setting))
            {
                parser.InjectSimulatedTimestamp = setting.ParseBoolean();
            }

            if (settings.TryGetValue("allowedParsingExceptions", out setting))
            {
                parser.AllowedParsingExceptions = int.Parse(setting);
            }

            if (settings.TryGetValue("parsingExceptionWindow", out setting))
            {
                parser.ParsingExceptionWindow = Ticks.FromSeconds(double.Parse(setting));
            }

            if (settings.TryGetValue("autoStartDataParsingSequence", out setting))
            {
                parser.AutoStartDataParsingSequence = setting.ParseBoolean();
            }

            if (settings.TryGetValue("skipDisableRealTimeData", out setting))
            {
                parser.SkipDisableRealTimeData = setting.ParseBoolean();
            }

            if (settings.TryGetValue("disableRealTimeDataOnStop", out setting))
            {
                parser.DisableRealTimeDataOnStop = setting.ParseBoolean();
            }

            // When connecting to a file based resource you may want to loop the data
            //parser.AutoRepeatCapturedPlayback = true;

            Console.WriteLine("ConnectionString: {0}", parser.ConnectionString);

            parser.Start();

            Console.WriteLine("Press <enter> to terminate application...");
            Console.ReadLine();

            parser.Stop();

            // Stop concentrator
            if (TestConcentrator)
            {
                concentrator.Stop();
            }

            if (WriteLogs)
            {
                m_exportFile.Close();
            }
        }
        private void ExecuteScan(ScanParameters scanParams, CancellationToken cancellationToken)
        {
            // Create wait handles to use to wait for configuration frame
            m_configurationWaitHandle ??= new ManualResetEventSlim(false);
            m_bytesReceivedWaitHandle ??= new ManualResetEventSlim(false);

            // Create a new phasor protocol frame parser used to dynamically request device configuration frames
            // and return them to remote clients so that the frame can be used in system setup and configuration
            if (m_frameParser is null)
            {
                m_frameParser = new MultiProtocolFrameParser();

                // Attach to events on new frame parser reference
                m_frameParser.ConnectionAttempt                 += m_frameParser_ConnectionAttempt;
                m_frameParser.ConnectionEstablished             += m_frameParser_ConnectionEstablished;
                m_frameParser.ConnectionException               += m_frameParser_ConnectionException;
                m_frameParser.ConnectionTerminated              += m_frameParser_ConnectionTerminated;
                m_frameParser.ExceededParsingExceptionThreshold += m_frameParser_ExceededParsingExceptionThreshold;
                m_frameParser.ParsingException           += m_frameParser_ParsingException;
                m_frameParser.ReceivedConfigurationFrame += m_frameParser_ReceivedConfigurationFrame;
                m_frameParser.BufferParsed += m_frameParser_BufferParsed;

                // We only want to try to connect to device and retrieve configuration as quickly as possible
                m_frameParser.MaximumConnectionAttempts = 1;
                m_frameParser.SourceName = Name;
                m_frameParser.AutoRepeatCapturedPlayback   = false;
                m_frameParser.AutoStartDataParsingSequence = false;
                m_frameParser.SkipDisableRealTimeData      = true;
            }

            Task.Run(() =>
            {
                ClearFeedback();
                UpdateFeedback();

                Ticks scanStartTime = DateTime.UtcNow.Ticks;

                try
                {
                    SetControlEnabledState(buttonScan, false);

                    TableOperations <Device> deviceTable = scanParams.DeviceTable;
                    ushort[] comPorts  = scanParams.ComPorts;
                    ushort[] idCodes   = scanParams.IDCodes;
                    bool rescan        = scanParams.Rescan;
                    int scannedIDCodes = 0;
                    HashSet <ushort> configuredPorts   = new();
                    HashSet <ushort> configuredIDCodes = new();
                    HashSet <ushort> idCodeSettings    = new(idCodes);
                    int discoveredDevices = 0;
                    long totalComScanTime = 0L;
                    long totalComScans    = 0L;

                    ShowUpdateMessage("Reading existing configuration...");
                    Device[] devices = deviceTable.QueryRecordsWhere("IsConcentrator = 0").ToArray();

                    // If re-scanning all ports, we will not skip pre-configured ports and ID codes
                    if (rescan)
                    {
                        ShowUpdateMessage($"{Tab1}Discovered {devices.Length:N0} existing devices{Environment.NewLine}");
                    }
                    else
                    {
                        foreach (Device device in devices)
                        {
                            if (device is null)
                            {
                                continue;
                            }

                            Dictionary <string, string> settings = device.ConnectionString.ParseKeyValuePairs();

                            if (settings.TryGetValue("port", out string portVal) && ushort.TryParse(portVal.Substring(3), out ushort port))
                            {
                                configuredPorts.Add(port);
                            }

                            configuredIDCodes.Add((ushort)device.AccessID);
                        }

                        ShowUpdateMessage($"{Tab1}Discovered {devices.Length:N0} existing devices, {configuredPorts.Count:N0} configured COM ports and {configuredIDCodes.Count:N0} unique ID codes{Environment.NewLine}");
                    }

                    // Hold onto to device list, useful when saving configurations later (no need to re-query)
                    scanParams.Devices = devices;

                    // Only control progress bar for manual (non-import) scans
                    if (buttonImport.Enabled)
                    {
                        SetProgressBarMinMax(0, idCodes.Length);
                        UpdateProgressBar(0);
                    }

                    foreach (ushort idCode in idCodes)
                    {
                        cancellationToken.ThrowIfCancellationRequested();

                        if (configuredIDCodes.Contains(idCode))
                        {
                            ShowUpdateMessage($"Skipping scan for already configured ID code {idCode}...");
                        }
                        else
                        {
                            Ticks idScanStartTime = DateTime.UtcNow.Ticks;

                            try
                            {
                                ShowUpdateMessage($"Starting scan for ID code {idCode}...");
                                int processedComPorts = 0;
                                bool found            = false;

                                HashSet <ushort> unprocessedComPorts = new(comPorts);
                                unprocessedComPorts.ExceptWith(configuredPorts);
                                comPorts = unprocessedComPorts.ToArray();

                                foreach (ushort comPort in comPorts)
                                {
                                    cancellationToken.ThrowIfCancellationRequested();

                                    Ticks comScanStartTime = DateTime.UtcNow.Ticks;
                                    bool scanned           = true;

                                    try
                                    {
                                        if (configuredPorts.Contains(comPort))
                                        {
                                            ShowUpdateMessage($"Skipping scan for already configured COM{comPort}...");
                                            scanned = false;
                                            continue;
                                        }

                                        if (!ScanPortWithIDCode(comPort, idCode, scanParams, cancellationToken))
                                        {
                                            continue;
                                        }

                                        // Shorten COM port scan list as new devices are detected
                                        configuredPorts.Add(comPort);
                                        UpdateFeedback(null, ++discoveredDevices);
                                        found = true;
                                        break;
                                    }
                                    finally
                                    {
                                        Ticks comScanTime = DateTime.UtcNow.Ticks - comScanStartTime;
                                        ShowUpdateMessage($"{Environment.NewLine}>> Scan time for COM{comPort} for ID code {idCode}: {comScanTime.ToElapsedTimeString(3)}.{Environment.NewLine}");

                                        processedComPorts++;
                                        totalComScanTime += comScanTime.Value;

                                        if (scanned)
                                        {
                                            totalComScans++;

                                            long remainingTimeEstimate =
                                                (idCodes.Length - configuredIDCodes.Count - scannedIDCodes) * comPorts.Length;

                                            if (!found)
                                            {
                                                remainingTimeEstimate += comPorts.Length - processedComPorts;
                                            }

                                            remainingTimeEstimate *= (long)(totalComScanTime / (double)totalComScans);
                                            UpdateFeedback(new Ticks(remainingTimeEstimate).ToElapsedTimeString(0));
                                        }
                                    }
                                }

                                ShowUpdateMessage($"Completed scan for ID code {idCode}.");
                            }
                            finally
                            {
                                ShowUpdateMessage($"{Environment.NewLine}>>>> Scan time for ID code {idCode}: {(DateTime.UtcNow.Ticks - idScanStartTime).ToElapsedTimeString(3)}.{Environment.NewLine}");
                            }
                        }

                        scannedIDCodes++;

                        // Only control progress bar for manual (non-import) scans
                        if (buttonImport.Enabled)
                        {
                            UpdateProgressBar(scannedIDCodes);
                        }

                        // Serialize reduced ID code list
                        try
                        {
                            // In case app needs to restart do not rescan existing ID codes
                            if (Settings.AutoRemoveIDs && idCodeSettings.Remove(idCode))
                            {
                                Settings.IDCodes = idCodeSettings.ToArray();
                                Settings.Save();
                            }
                        }
                        catch (Exception ex)
                        {
                            m_log.Publish(MessageLevel.Error, "UpdateIDCodes", "Failed while reducing ID code list", exception: ex);
                        }
                    }

                    ShowUpdateMessage($"Completed scan for {scannedIDCodes:N0} ID codes over {comPorts.Length:N0} COM ports.{Environment.NewLine}");
                    UpdateFeedback("None -- Operation Complete");
                }
                catch (OperationCanceledException)
                {
                    ShowUpdateMessage($"{Environment.NewLine}Serial port scan cancelled.{Environment.NewLine}");
                    UpdateFeedback("None -- Operation Cancelled");
                }
                catch (Exception ex)
                {
                    ShowUpdateMessage($"{Environment.NewLine}ERROR: Failed during serial port scan: {ex.Message}");
                    UpdateFeedback("None -- Operation Failed");
                }
                finally
                {
                    ShowUpdateMessage($">>>>>> Total scan time: {(DateTime.UtcNow.Ticks - scanStartTime).ToElapsedTimeString(3)}.{Environment.NewLine}");
                    SetControlEnabledState(buttonScan, true);
                    m_scanExecutionComplete.Set();
                }
            },
                     cancellationToken);
        }
Beispiel #7
0
        public static void Main(string[] args)
        {
            m_definedMeasurements = new ConcurrentDictionary <string, IMeasurement>();
            m_definedDevices      = new ConcurrentDictionary <ushort, ConfigurationCell>();

            if (WriteLogs)
            {
                m_exportFile = new StreamWriter(FilePath.GetAbsolutePath("InputTimestamps.csv"));
            }

            if (TestConcentrator)
            {
                // Create a new concentrator
                concentrator = new Concentrator(WriteLogs, FilePath.GetAbsolutePath("OutputTimestamps.csv"));
                concentrator.TimeResolution  = 333000;
                concentrator.FramesPerSecond = 30;
                concentrator.LagTime         = 3.0D;
                concentrator.LeadTime        = 9.0D;
                concentrator.PerformTimestampReasonabilityCheck = false;
                concentrator.ProcessByReceivedTimestamp         = true;
                concentrator.Start();
            }

            // Create a new protocol parser
            parser = new MultiProtocolFrameParser();
            parser.AllowedParsingExceptions = 500;
            parser.ParsingExceptionWindow   = 5;

            // Attach to desired events
            parser.ConnectionAttempt          += parser_ConnectionAttempt;
            parser.ConnectionEstablished      += parser_ConnectionEstablished;
            parser.ConnectionException        += parser_ConnectionException;
            parser.ParsingException           += parser_ParsingException;
            parser.ReceivedConfigurationFrame += parser_ReceivedConfigurationFrame;
            parser.ReceivedDataFrame          += parser_ReceivedDataFrame;

            // Define the connection string
            //parser.ConnectionString = @"phasorProtocol=IeeeC37_118V1; transportProtocol=UDP; localport=5000; server=233.123.123.123:5000; interface=0.0.0.0";
            //parser.ConnectionString = @"phasorProtocol=Ieee1344; transportProtocol=File; file=D:\Projects\Applications\openPDC\Synchrophasor\Current Version\Build\Output\Debug\Applications\openPDC\Sample1344.PmuCapture";
            //parser.ConnectionString = @"phasorProtocol=Macrodyne; accessID=1; transportProtocol=File; skipDisableRealTimeData = true; file=C:\Users\Ritchie\Desktop\Development\Macrodyne\ING.out; iniFileName=C:\Users\Ritchie\Desktop\Development\Macrodyne\BCH18Aug2011.ini; deviceLabel=ING1; protocolVersion=G";
            //parser.ConnectionString = @"phasorProtocol=Iec61850_90_5; accessID=1; transportProtocol=UDP; skipDisableRealTimeData = true; localPort=102; interface=0.0.0.0; commandChannel={transportProtocol=TCP; server=172.21.1.201:4712; interface=0.0.0.0}";
            //parser.ConnectionString = @"phasorProtocol=FNET; transportProtocol=TCP; server=172.21.4.100:4001; interface=0.0.0.0; isListener=false";
            //parser.ConnectionString = @"phasorProtocol=Macrodyne; transportProtocol=Serial; port=COM6; baudrate=38400; parity=None; stopbits=One; databits=8; dtrenable=False; rtsenable=False;";
            //parser.ConnectionString = @"phasorProtocol=SelFastMessage; transportProtocol=Serial; port=COM5; baudrate=57600; parity=None; stopbits=One; databits=8; dtrenable=False; rtsenable=False;";
            //parser.ConnectionString = @"phasorProtocol=IEEEC37_118v1; transportProtocol=File; file=C:\Users\Ritchie\Desktop\MTI_Test_3phase.PmuCapture; checkSumValidationFrameTypes=DataFrame,HeaderFrame,CommandFrame";
            parser.ConnectionString = @"phasorProtocol=IEEEC37_118V1; transportProtocol=tcp; server=172.21.4.100:4001; interface=0.0.0.0; isListener=false";

            // When connecting to a file based resource you may want to loop the data
            parser.AutoRepeatCapturedPlayback = true;

            // Start frame parser
            parser.AutoStartDataParsingSequence = true;
            parser.Start();

            // To keep the console open while receiving live data with AutoRepeatCapturedPlayback = false, uncomment the following line of code:
            Console.ReadLine();

            // Stop concentrator
            if (TestConcentrator)
            {
                concentrator.Stop();
            }

            if (WriteLogs)
            {
                m_exportFile.Close();
            }
        }