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(); }
/// <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); }
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); }
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(); } }