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