// In this example we use predefined structures to setup synchrophasor style metadata. This is only for setup simplification of // the initial target uses cases that interact with IEEE C37.118. Technically the publisher can create its own metadata sets. private void DefineMetadata() { // This sample just generates random Guid measurement and device identifiers - for a production system, // these Guid values would need to persist between runs defining a permanent association between the // defined metadata and the identifier... DeviceMetadata device1Metadata = new DeviceMetadata(); DateTime timestamp = DateTime.UtcNow; // Add a device device1Metadata.Name = "Test PMU"; device1Metadata.Acronym = device1Metadata.Name.Replace(" ", "").ToUpper(); device1Metadata.UniqueID = Guid.NewGuid(); device1Metadata.Longitude = 300; device1Metadata.Latitude = 200; device1Metadata.FramesPerSecond = 30; device1Metadata.ProtocolName = "STTP"; device1Metadata.UpdatedOn = timestamp; m_deviceMetadata.Add(device1Metadata); string pointTagPrefix = device1Metadata.Acronym + "."; string measurementSource = "PPA:"; int runtimeIndex = 1; // Add a frequency measurement MeasurementMetadata measurement1Metadata = new MeasurementMetadata(); measurement1Metadata.ID = $"{measurementSource}{runtimeIndex++}"; measurement1Metadata.PointTag = pointTagPrefix + "FREQ"; measurement1Metadata.SignalID = Guid.NewGuid(); measurement1Metadata.DeviceAcronym = device1Metadata.Acronym; measurement1Metadata.Reference.Acronym = device1Metadata.Acronym; measurement1Metadata.Reference.Kind = SignalKind.Frequency; measurement1Metadata.Reference.Index = 0; measurement1Metadata.PhasorSourceIndex = 0; measurement1Metadata.UpdatedOn = timestamp; // Add a dF/dt measurement MeasurementMetadata measurement2Metadata = new MeasurementMetadata(); measurement2Metadata.ID = $"{measurementSource}{runtimeIndex++}"; measurement2Metadata.PointTag = pointTagPrefix + "DFDT"; measurement2Metadata.SignalID = Guid.NewGuid(); measurement2Metadata.DeviceAcronym = device1Metadata.Acronym; measurement2Metadata.Reference.Acronym = device1Metadata.Acronym; measurement2Metadata.Reference.Kind = SignalKind.DfDt; measurement2Metadata.Reference.Index = 0; measurement2Metadata.PhasorSourceIndex = 0; measurement2Metadata.UpdatedOn = timestamp; // Add a phase angle measurement MeasurementMetadata measurement3Metadata = new MeasurementMetadata(); measurement3Metadata.ID = $"{measurementSource}{runtimeIndex++}"; measurement3Metadata.PointTag = pointTagPrefix + "VPHA"; measurement3Metadata.SignalID = Guid.NewGuid(); measurement3Metadata.DeviceAcronym = device1Metadata.Acronym; measurement3Metadata.Reference.Acronym = device1Metadata.Acronym; measurement3Metadata.Reference.Kind = SignalKind.Angle; measurement3Metadata.Reference.Index = 1; // First phase angle measurement3Metadata.PhasorSourceIndex = 1; // Match to Phasor.SourceIndex = 1 measurement3Metadata.UpdatedOn = timestamp; // Add a phase magnitude measurement MeasurementMetadata measurement4Metadata = new MeasurementMetadata(); measurement4Metadata.ID = $"{measurementSource}{runtimeIndex++}"; measurement4Metadata.PointTag = pointTagPrefix + "VPHM"; measurement4Metadata.SignalID = Guid.NewGuid(); measurement4Metadata.DeviceAcronym = device1Metadata.Acronym; measurement4Metadata.Reference.Acronym = device1Metadata.Acronym; measurement4Metadata.Reference.Kind = SignalKind.Magnitude; measurement4Metadata.Reference.Index = 1; // First phase magnitude measurement4Metadata.PhasorSourceIndex = 1; // Match to Phasor.SourceIndex = 1 measurement4Metadata.UpdatedOn = timestamp; m_measurementMetadata.Add(measurement1Metadata); m_measurementMetadata.Add(measurement2Metadata); m_measurementMetadata.Add(measurement3Metadata); m_measurementMetadata.Add(measurement4Metadata); // Add a phasor PhasorMetadata phasor1Metadata = new PhasorMetadata(); phasor1Metadata.DeviceAcronym = device1Metadata.Acronym; phasor1Metadata.Label = device1Metadata.Name + " Voltage Phasor"; phasor1Metadata.Type = "V"; // Voltage phasor phasor1Metadata.Phase = "+"; // Positive sequence phasor1Metadata.SourceIndex = 1; // Phasor number 1 phasor1Metadata.UpdatedOn = timestamp; m_phasorMetadata.Add(phasor1Metadata); m_metadataVersion++; // Pass meta-data to publisher instance for proper conditioning base.DefineMetadata(m_deviceMetadata, m_measurementMetadata, m_phasorMetadata, m_metadataVersion); }
internal static global::System.Runtime.InteropServices.HandleRef getCPtr(PhasorMetadata obj) { return((obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr); }