Example #1
0
        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);
                                }
                            }
                        }
                    }
                }
            }
        }
Example #2
0
        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;
        }
Example #3
0
        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);
        }