private static void SetCommunication(XElement root, XNamespace ns, GseControl gseControl) { var communication = root.Element(ns + "Communication"); if (communication != null) { var subnetwork = communication.Element(ns + "SubNetwork"); if (subnetwork != null) { var connectedAP = subnetwork.Elements(ns + "ConnectedAP").FirstOrDefault(x => x.Attribute("iedName").Value == gseControl.IED.Name); if (connectedAP != null) { var gse = connectedAP.Elements(ns + "GSE").FirstOrDefault(x => x.Attribute("cbName").Value == gseControl.Name); if (gse != null) { var address = gse.Element(ns + "Address"); if (address != null) { var mac = address.Elements(ns + "P").FirstOrDefault(x => x.Attribute("type").Value == "MAC-Address"); if (mac != null) { gseControl.DestinationMACAddress = mac.Value.Replace('-', ':'); } var appId = address.Elements(ns + "P").FirstOrDefault(x => x.Attribute("type").Value == "APPID"); if (appId != null) { gseControl.AppId = int.Parse(appId.Value, System.Globalization.NumberStyles.HexNumber); } } } } } } }
public void LoadGseControl(GseControl gse) { headerLabel.Text = $"{gse.IED.Name} - GOOSE - {gse.LogicalDevice} - {gse.LogicalNode} - {gse.Name}"; gooseControlReference.Text = gse.GseControlReference; destMacAddress.Text = gse.DestinationMACAddress; appId.Text = gse.AppId.ToString(); gooseId.Text = gse.GooseId; datasetReference.Text = gse.DataSetReference; configurationRevision.Text = gse.ConfRev; dataGrid.DataSource = gse.Dataset.FCDAs; }
public static List <IED> Parse(string filePath) { List <IED> list = new List <IED>(); XDocument doc = XDocument.Load(filePath); var ns = doc.Root.GetDefaultNamespace(); var iedNodes = doc.Root.Elements(ns + "IED"); foreach (var node in iedNodes) { string mrid = string.Empty; var mridNode = node.Elements(ns + "Private").FirstOrDefault(x => x.Attribute("type").Value == "mRID"); if (mridNode != null) { mrid = mridNode.Value; } else { mrid = Guid.NewGuid().ToString().ToLower(); } IED ied = new IED() { Name = node.Attribute("name").Value, MRID = mrid }; // Access point LDO //var accessPoint = node.Elements(ns + "AccessPoint").FirstOrDefault(x => x.Attribute("name").Value == "LD0"); var accessPoint = GetAccessPoint(node, ns); if (accessPoint != null) { // Server var server = accessPoint.Element(ns + "Server"); if (server != null) { // LD0 //var ld0 = server.Elements(ns + "LDevice").FirstOrDefault(x => x.Attribute("inst").Value == "LD0"); var ld0 = GetLD0(server, ns); if (ld0 != null) { // LN0 var ln0 = ld0.Element(ns + "LN0"); if (ln0 != null) { // GSEControl var gseControls = ln0.Elements(ns + "GSEControl"); if (gseControls != null && gseControls.Count() > 0) { // Found GOOSE control blocks list.Add(ied); foreach (var gseControlNode in gseControls) { GseControl gseControl = new GseControl() { IED = ied, LogicalDevice = "LD0", LogicalNode = ln0.Attribute("lnClass").Value, Name = gseControlNode.Attribute("name").Value, GooseId = gseControlNode.Attribute("appID").Value, ConfRev = gseControlNode.Attribute("confRev").Value, Dataset = new DataSet() { Name = gseControlNode.Attribute("datSet").Value } }; SetCommunication(doc.Root, ns, gseControl); ied.GseControls.Add(gseControl); var dataSetNode = ln0.Elements(ns + "DataSet").FirstOrDefault(x => x.Attribute("name").Value == gseControl.Dataset.Name); if (dataSetNode != null) { // FCDAs foreach (var fcdaNode in dataSetNode.Elements(ns + "FCDA")) { FCDA fcda = new FCDA() { LDInst = fcdaNode.Attribute("ldInst").Value, Prefix = fcdaNode.Attribute("prefix")?.Value, LnClass = fcdaNode.Attribute("lnClass").Value, LnInst = Convert.ToInt32(fcdaNode.Attribute("lnInst").Value), DoName = fcdaNode.Attribute("doName").Value, DaName = fcdaNode.Attribute("daName").Value }; var logicalDevice = server.Elements(ns + "LDevice").FirstOrDefault(x => x.Attribute("inst").Value == fcda.LDInst); //Get lnType var ln = logicalDevice.Elements(ns + "LN"). FirstOrDefault(x => x.Attribute("prefix")?.Value == fcda.Prefix && x.Attribute("lnClass")?.Value == fcda.LnClass && x.Attribute("inst")?.Value == fcda.LnInst.ToString()); fcda.LnTypeId = ln.Attribute("lnType")?.Value; SetDataTypeForFCDA(doc.Root, ns, fcda); gseControl.Dataset.FCDAs.Add(fcda); } } } } } } } } } return(list); }