Пример #1
0
        void createData(NodeBase dt, ModelNode mn)
        {
            ModelNode newmn = null;
            NodeBase  iter  = null;
            bool      isArr = false;

            if (dt is NodeDO)
            {
                NodeDO dO = (dt as NodeDO);
                isArr = dO.SCL_ArraySize > 0;
                newmn = new DataObject(dt.Name, mn, dO.SCL_ArraySize);
            }
            else if (dt is NodeData && !(dt is NodeDO))
            {   // dt is NodeDA
                NodeData dA = (NodeData)dt;
                isArr = dA.SCL_ArraySize > 0;
                FunctionalConstraint fc             = DataAttribute.fcFromString(dA.SCL_FCDesc);
                IEC61850.Server.DataAttributeType t = DataAttribute.typeFromSCLString(dA.SCL_BType);
                newmn = new DataAttribute(dt.Name, mn, t, fc, dA.SCL_TrgOps, dA.SCL_ArraySize, 0);
                logger.LogDebug("DataAttribute " + dt.IecAddress + " TrgOps:" + dA.SCL_TrgOps.ToString());
            }
            dt.SCLServerModelObject = newmn;
            if (isArr)
            {
                iter = dt.GetChildNode(0);
            }
            else
            {
                iter = dt;
            }
            foreach (NodeBase nb in iter.GetChildNodes())
            {
                // Recursion
                createData(nb, newmn);
            }
        }
Пример #2
0
        /// <summary>
        /// Reads through the specified SCL file and creates a logical tree
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="env"></param>
        /// <returns>IECS tree state to be displayed</returns>
        public List <Iec61850Model> CreateTree(String fileName) //, Env env)
        {
            // Model [0] is a master for types etc.
            _dataModels.Add(new Iec61850State().DataModel);
            _nodeTypes          = new List <NodeBase>();
            _dataObjectTypes    = new List <NodeBase>();
            _dataAttributeTypes = new List <NodeBase>();
            int i = 0;

            logger.LogInfo("Reading SCL file " + fileName);
            XDocument  doc = XDocument.Load(fileName);
            XNamespace ns  = doc.Root.Name.Namespace;

            GetTypes(doc, ns);
            _dataModels[0].enums.SortImmediateChildren();

            //logger.LogInfo("Reading XML tree.");
            foreach (XElement ied in doc.Root.Elements(ns + "IED"))
            {
                // Create model. Model 0 (master model) is already created above
                if (i > 0)
                {
                    _dataModels.Add(new Iec61850State().DataModel);
                }
                XAttribute a = ied.Attribute("name");
                if (a != null)
                {
                    _dataModels[i].ied = new NodeIed(a.Value, _dataModels[i]);
                }
                else
                {
                    continue;   // cannot proceed
                }
                if (a != null)
                {
                    _dataModels[i].iec = new NodeIed(a.Value, _dataModels[i]);
                }
                else
                {
                    continue;   // cannot proceed
                }
                _dataModels[i].iec.IsIecModel = true;
                a = ied.Attribute("manufacturer");
                if (a != null)
                {
                    _dataModels[i].ied.VendorName = a.Value;
                }
                if (a != null)
                {
                    _dataModels[i].iec.VendorName = a.Value;
                }
                a = ied.Attribute("type");
                if (a != null)
                {
                    _dataModels[i].ied.ModelName = a.Value;
                }
                if (a != null)
                {
                    _dataModels[i].iec.ModelName = a.Value;
                }
                a = ied.Attribute("revision");
                if (a != null)
                {
                    _dataModels[i].ied.Revision = a.Value;
                }
                if (a != null)
                {
                    _dataModels[i].iec.Revision = a.Value;
                }

                int ldidx = 0;
                // IEC 61850 Tree
                CreateLogicalDevicesIEC(_dataModels[i].iec, ied.Descendants(ns + "LDevice"), ns);

                ldidx = 0;
                foreach (XElement ld in ied.Descendants(ns + "LDevice"))
                {
                    NodeBase ldroot            = _dataModels[i].iec.GetChildNode(ldidx++);
                    int      lnidx             = 0;
                    IEnumerable <XElement> lns = (from el in ld.Elements() where el.Name.LocalName.StartsWith("LN") select el);
                    int cnt = lns.Count();
                    foreach (XElement ln in lns)
                    {
                        NodeBase lnroot = ldroot.GetChildNode(lnidx++);
                        ReadDataInstanceValues(lnroot, ln.Elements(ns + "DOI"), ns);
                    }
                }
                // Ied Tree
                makeIedModelFromIecModel(_dataModels[i], _dataModels[i].iec);
                i++;
            }

            return(_dataModels);
        }