Ejemplo n.º 1
0
        private void processStructDAType(NodeBase DOCn, string type, XmlNodeList DATypeNodes)
        {
            foreach (XmlNode DATypeNode in DATypeNodes)
            {
                if (type == getStringAttribute(DATypeNode, "id"))
                {
                    foreach (XmlNode DATypeNodeCn in DATypeNode.ChildNodes)
                    {
                        if (DATypeNodeCn.Name == "BDA")
                        {
                            NodeData Nd = new NodeData(getStringAttribute(DATypeNodeCn, "name"));
                            Nd.DataType = getVarDataType(getStringAttribute(DATypeNodeCn, "bType"));
                            NodeBase DACn = DOCn.AddChildNode(Nd);

                            if (Nd.DataType == scsm_MMS_TypeEnum.structure)
                            {
                                processStructDAType(DACn, getStringAttribute(DATypeNodeCn, "type"), DATypeNodes);
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
        int recursiveReadData(NodeBase nd, GOOSE_ASN1_Model.Data t, NodeBase ndcn, int id, DateTime captureTime)
        {
            int _id = id;

            if (t == null)
            {
                return(-1);
            }

            if (t.Array != null)
            {
                if (nd != null)
                {
                    (nd as NodeGData).CaptureTime = captureTime;
                    (nd as NodeGData).DataType    = scsm_MMS_TypeEnum.array;
                    return(0);
                }
                else if (ndcn != null)
                {
                    NodeBase nb = new NodeGData("Array_" + _id.ToString());
                    (nb as NodeGData).CaptureTime = captureTime;
                    (nb as NodeGData).DataType    = scsm_MMS_TypeEnum.array;
                    (nb as NodeGData).DataValue   = t.Array;
                    ndcn.AddChildNode(nb);
                    return(++_id);
                }
                else
                {
                    return(-1);
                }
            }
            else if (t.Binarytime != null)
            {
                if (nd != null)
                {
                    (nd as NodeGData).CaptureTime = captureTime;
                    (nd as NodeGData).DataType    = scsm_MMS_TypeEnum.array;
                    (nd as NodeGData).DataValue   = t.Binarytime;
                    return(0);
                }
                else if (ndcn != null)
                {
                    NodeBase nb = new NodeGData("Binarytime_" + _id.ToString());
                    (nb as NodeGData).CaptureTime = captureTime;
                    (nb as NodeGData).DataType    = scsm_MMS_TypeEnum.binary_time;
                    (nb as NodeGData).DataValue   = t.Binarytime;
                    ndcn.AddChildNode(nb);
                    return(++_id);
                }
                else
                {
                    return(-1);
                }
            }
            else if (t.Bitstring != null)
            {
                if (nd != null)
                {
                    (nd as NodeGData).CaptureTime = captureTime;
                    (nd as NodeGData).DataType    = scsm_MMS_TypeEnum.bit_string;
                    (nd as NodeGData).DataValue   = t.Bitstring.Value;
                    (nd as NodeGData).DataParam   = t.Bitstring.TrailBitsCnt;
                    return(0);
                }
                else if (ndcn != null)
                {
                    NodeBase nb = new NodeGData("Bitstring_" + _id.ToString());
                    (nb as NodeGData).CaptureTime = captureTime;
                    (nb as NodeGData).DataType    = scsm_MMS_TypeEnum.bit_string;
                    (nb as NodeGData).DataValue   = t.Bitstring.Value;
                    (nb as NodeGData).DataParam   = t.Bitstring.TrailBitsCnt;
                    ndcn.AddChildNode(nb);
                    return(++_id);
                }
                else
                {
                    return(-1);
                }
            }
            else if (t.isBooleanSelected())
            {
                if (nd != null)
                {
                    (nd as NodeGData).CaptureTime = captureTime;
                    (nd as NodeGData).DataType    = scsm_MMS_TypeEnum.boolean;
                    (nd as NodeGData).DataValue   = t.Boolean;
                    return(0);
                }
                else if (ndcn != null)
                {
                    NodeBase nb = new NodeGData("Boolean_" + _id.ToString());
                    (nb as NodeGData).CaptureTime = captureTime;
                    (nb as NodeGData).DataType    = scsm_MMS_TypeEnum.boolean;
                    (nb as NodeGData).DataValue   = t.Boolean;
                    ndcn.AddChildNode(nb);
                    return(++_id);
                }
                else
                {
                    return(-1);
                }
            }
            else if (t.BooleanArray != null)
            {
                return(0);
            }
            else if (t.Floatingpoint != null)
            {
                if (nd != null)
                {
                    (nd as NodeGData).CaptureTime = captureTime;
                    (nd as NodeGData).DataType    = scsm_MMS_TypeEnum.floating_point;
                    (nd as NodeGData).DataValue   = t.Floatingpoint;
                    return(0);
                }
                else if (ndcn != null)
                {
                    NodeBase nb = new NodeGData("Floatingpoint_" + _id.ToString());
                    (nb as NodeGData).CaptureTime = captureTime;
                    (nb as NodeGData).DataType    = scsm_MMS_TypeEnum.floating_point;
                    (nb as NodeGData).DataValue   = t.Floatingpoint;
                    ndcn.AddChildNode(nb);
                    return(++_id);
                }
                else
                {
                    return(-1);
                }
            }
            else if (t.Generalizedtime != null)
            {
                if (nd != null)
                {
                    (nd as NodeGData).CaptureTime = captureTime;
                    (nd as NodeGData).DataType    = scsm_MMS_TypeEnum.generalized_time;
                    (nd as NodeGData).DataValue   = t.Generalizedtime;
                    return(0);
                }
                else if (ndcn != null)
                {
                    NodeBase nb = new NodeGData("Generalizedtime_" + _id.ToString());
                    (nb as NodeGData).CaptureTime = captureTime;
                    (nb as NodeGData).DataType    = scsm_MMS_TypeEnum.generalized_time;
                    (nb as NodeGData).DataValue   = t.Generalizedtime;
                    ndcn.AddChildNode(nb);
                    return(++_id);
                }
                else
                {
                    return(-1);
                }
            }
            else if (t.isIntegerSelected())
            {
                if (nd != null)
                {
                    (nd as NodeGData).CaptureTime = captureTime;
                    (nd as NodeGData).DataType    = scsm_MMS_TypeEnum.integer;
                    (nd as NodeGData).DataValue   = t.Integer;
                    return(0);
                }
                else if (ndcn != null)
                {
                    NodeBase nb = new NodeGData("Integer_" + _id.ToString());
                    (nb as NodeGData).CaptureTime = captureTime;
                    (nb as NodeGData).DataType    = scsm_MMS_TypeEnum.integer;
                    (nb as NodeGData).DataValue   = t.Integer;
                    ndcn.AddChildNode(nb);
                    return(++_id);
                }
                else
                {
                    return(-1);
                }
            }
            else if (t.MMSString != null)
            {
                if (nd != null)
                {
                    (nd as NodeGData).CaptureTime = captureTime;
                    (nd as NodeGData).DataType    = scsm_MMS_TypeEnum.mMSString;
                    (nd as NodeGData).DataValue   = t.MMSString;
                    return(0);
                }
                else if (ndcn != null)
                {
                    NodeBase nb = new NodeGData("MMSString_" + _id.ToString());
                    (nb as NodeGData).CaptureTime = captureTime;
                    (nb as NodeGData).DataType    = scsm_MMS_TypeEnum.mMSString;
                    (nb as NodeGData).DataValue   = t.MMSString;
                    ndcn.AddChildNode(nb);
                    return(++_id);
                }
                else
                {
                    return(-1);
                }
            }
            else if (t.Octetstring != null)
            {
                if (nd != null)
                {
                    (nd as NodeGData).CaptureTime = captureTime;
                    (nd as NodeGData).DataType    = scsm_MMS_TypeEnum.octet_string;
                    (nd as NodeGData).DataValue   = t.Octetstring;
                    return(0);
                }
                else if (ndcn != null)
                {
                    NodeBase nb = new NodeGData("Octetstring_" + _id.ToString());
                    (nb as NodeGData).CaptureTime = captureTime;
                    (nb as NodeGData).DataType    = scsm_MMS_TypeEnum.octet_string;
                    (nb as NodeGData).DataValue   = t.Octetstring;
                    ndcn.AddChildNode(nb);
                    return(++_id);
                }
                else
                {
                    return(-1);
                }
            }
            else if (t.Structure != null)
            {
                if (nd != null)
                {
                    (nd as NodeGData).CaptureTime = captureTime;
                    (nd as NodeGData).DataType    = scsm_MMS_TypeEnum.structure;

                    NodeBase[] nd1 = nd.GetChildNodes();

                    int i = 0;
                    int j = 0;

                    foreach (GOOSE_ASN1_Model.Data data in t.Structure.Value)
                    {
                        j = recursiveReadData(nd1[i++], data, null, j, captureTime);
                    }

                    return(0);
                }
                else if (ndcn != null)
                {
                    NodeBase nb = new NodeGData("Structure_" + _id.ToString());
                    (nb as NodeGData).CaptureTime = captureTime;
                    (nb as NodeGData).DataType    = scsm_MMS_TypeEnum.structure;
                    NodeBase nb1 = ndcn.AddChildNode(nb);
                    int      i   = 0;
                    foreach (GOOSE_ASN1_Model.Data data in t.Structure.Value)
                    {
                        i = recursiveReadData(null, data, nb1, i, captureTime);
                    }

                    return(++_id);
                }
                else
                {
                    return(-1);
                }
            }
            else if (t.isUnsignedSelected())
            {
                if (nd != null)
                {
                    (nd as NodeGData).CaptureTime = captureTime;
                    (nd as NodeGData).DataType    = scsm_MMS_TypeEnum.unsigned;
                    (nd as NodeGData).DataValue   = t.Unsigned;
                    return(0);
                }
                else if (ndcn != null)
                {
                    NodeBase nb = new NodeGData("Unsigned_" + _id.ToString());
                    (nb as NodeGData).CaptureTime = captureTime;
                    (nb as NodeGData).DataType    = scsm_MMS_TypeEnum.unsigned;
                    (nb as NodeGData).DataValue   = t.Unsigned;
                    ndcn.AddChildNode(nb);
                    return(++_id);
                }
                else
                {
                    return(-1);
                }
            }
            else if (t.Utctime != null)
            {
                if (nd != null)
                {
                    (nd as NodeGData).CaptureTime = captureTime;
                    (nd as NodeGData).DataType    = scsm_MMS_TypeEnum.utc_time;
                    return(0);
                }
                else if (ndcn != null)
                {
                    NodeBase nb = new NodeGData("Utctime_" + _id.ToString());
                    (nb as NodeGData).CaptureTime = captureTime;
                    (nb as NodeGData).DataType    = scsm_MMS_TypeEnum.utc_time;
                    ndcn.AddChildNode(nb);
                    return(++_id);
                }
                else
                {
                    return(-1);
                }
            }
            else if (t.Visiblestring != null)
            {
                if (nd != null)
                {
                    (nd as NodeGData).CaptureTime = captureTime;
                    (nd as NodeGData).DataType    = scsm_MMS_TypeEnum.visible_string;
                    (nd as NodeGData).DataValue   = t.Visiblestring;
                    return(0);
                }
                else if (ndcn != null)
                {
                    NodeBase nb = new NodeGData("Utctime_" + _id.ToString());
                    (nb as NodeGData).CaptureTime = captureTime;
                    (nb as NodeGData).DataType    = scsm_MMS_TypeEnum.visible_string;
                    (nb as NodeGData).DataValue   = t.Visiblestring;
                    return(++_id);
                }
                else
                {
                    return(-1);
                }
            }
            else
            {
                return(-1);
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Reads through a report subtree and creates a report from it
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="nodeName"></param>
        /// <param name="deviceName"></param>
        /// <returns> a RP node </returns>

        private void CreateReports(NodeBase lnode, IEnumerable <XElement> elements, XNamespace ns)
        {
            if (lnode == null || elements == null || lnode.Parent == null || lnode.Parent.Parent == null)
            {
                Logger.getLogger().LogError("CreateReports: Something is null");
            }

            // We are at the LN level, up 2 levels is an ied
            Iec61850Model _dataModel = (lnode.Parent.Parent as NodeIed).Model;

            foreach (XElement el in elements)
            {
                List <NodeRCB> nodeRCBs = new List <NodeRCB>();

                XAttribute a        = el.Attribute("buffered");
                bool       buffered = a != null ? (a.Value.ToLower() == "true") : false;
                string     fc       = buffered ? "BR" : "RP";

                a = el.Attribute("indexed");
                bool     indexed       = a != null ? (a.Value.ToLower() == "true") : true; // default true???
                uint     maxRptEnabled = 1;
                XElement xeRptEnabled  = el.Element(ns + "RptEnabled");
                if (xeRptEnabled != null)
                {
                    a = xeRptEnabled.Attribute("max");
                    try { maxRptEnabled = uint.Parse(a.Value); }
                    catch { }
                }
                // correction necessary???
                if (!indexed)
                {
                    maxRptEnabled = 1;
                }
                if (maxRptEnabled < 1)
                {
                    maxRptEnabled = 1;
                }
                if (maxRptEnabled > 99)
                {
                    maxRptEnabled = 99;
                }

                for (int i = 0; i < maxRptEnabled; i++)
                {
                    nodeRCBs.Add(new NodeRCB(el.Attribute("name").Value + (indexed ? (i + 1).ToString("D2") : "")));
                    lnode.AddChildNode(nodeRCBs[i]);
                    nodeRCBs[i].isBuffered = buffered;
                }

                // rptID
                NodeData RptId = new NodeData("RptID");
                RptId.SCL_FCDesc = fc;
                RptId.DataType   = scsm_MMS_TypeEnum.visible_string;
                a = el.Attribute("rptID");
                RptId.DataValue = a != null ? a.Value : "";

                // datSet
                NodeData DatSet = new NodeData("DatSet");
                DatSet.SCL_FCDesc = fc;
                DatSet.DataType   = scsm_MMS_TypeEnum.visible_string;
                a = el.Attribute("datSet");
                DatSet.DataValue = a != null ? a.Value : null; // null accepted

                // confRev
                NodeData ConfRev = new NodeData("ConfRev");
                ConfRev.SCL_FCDesc = fc;
                ConfRev.DataType   = scsm_MMS_TypeEnum.unsigned;
                a = el.Attribute("confRev");
                try
                {
                    ConfRev.DataValue = uint.Parse(a.Value);
                }
                catch
                {
                    ConfRev.DataValue = (uint)1;
                }

                // bufTime
                NodeData BufTm = new NodeData("BufTm");
                BufTm.SCL_FCDesc = fc;
                BufTm.DataType   = scsm_MMS_TypeEnum.unsigned;
                a = el.Attribute("bufTime");
                try
                {
                    BufTm.DataValue = uint.Parse(a.Value);
                }
                catch
                {
                    BufTm.DataValue = (uint)0;
                }

                // intgPd
                NodeData IntgPd = new NodeData("IntgPd");
                IntgPd.SCL_FCDesc = fc;
                IntgPd.DataType   = scsm_MMS_TypeEnum.unsigned;
                a = el.Attribute("intgPd");
                try
                {
                    IntgPd.DataValue = uint.Parse(a.Value);
                }
                catch
                {
                    IntgPd.DataValue = (uint)0;
                }

                // <TrgOps dchg="true" qchg="false" dupd="false" period="true" />
                NodeData TrgOps = new NodeData("TrgOps");
                TrgOps.SCL_FCDesc = fc;
                TrgOps.DataType   = scsm_MMS_TypeEnum.integer;
                IEC61850.Common.TriggerOptions trgOptions = IEC61850.Common.TriggerOptions.NONE;
                XElement xeTrgOps = el.Element(ns + "TrgOps");
                if (xeTrgOps != null)
                {
                    a = xeTrgOps.Attribute("dchg");
                    if ((a != null ? a.Value : "false").ToLower() == "true")
                    {
                        trgOptions |= IEC61850.Common.TriggerOptions.DATA_CHANGED;
                    }
                    a = xeTrgOps.Attribute("qchg");
                    if ((a != null ? a.Value : "false").ToLower() == "true")
                    {
                        trgOptions |= IEC61850.Common.TriggerOptions.QUALITY_CHANGED;
                    }
                    a = xeTrgOps.Attribute("dupd");
                    if ((a != null ? a.Value : "false").ToLower() == "true")
                    {
                        trgOptions |= IEC61850.Common.TriggerOptions.DATA_UPDATE;
                    }
                    a = xeTrgOps.Attribute("period");
                    if ((a != null ? a.Value : "false").ToLower() == "true")
                    {
                        trgOptions |= IEC61850.Common.TriggerOptions.INTEGRITY;
                    }
                    a = xeTrgOps.Attribute("gi");
                    if ((a != null ? a.Value : "true").ToLower() == "true") // default true
                    {
                        trgOptions |= IEC61850.Common.TriggerOptions.GI;
                    }
                }
                TrgOps.DataValue = trgOptions;

                // <OptFields seqNum="true" timeStamp="true" dataSet="true" reasonCode="true" dataRef="false" entryID="true" configRef="true" bufOvfl="true" />
                NodeData OptFlds = new NodeData("OptFlds");
                OptFlds.SCL_FCDesc = fc;
                OptFlds.DataType   = scsm_MMS_TypeEnum.integer;
                IEC61850.Common.ReportOptions rptOptions = IEC61850.Common.ReportOptions.NONE;
                XElement xeOptFields = el.Element(ns + "OptFields");
                if (xeOptFields != null)
                {
                    a = xeOptFields.Attribute("seqNum");
                    if ((a != null ? a.Value : "false").ToLower() == "true")
                    {
                        rptOptions |= IEC61850.Common.ReportOptions.SEQ_NUM;
                    }
                    a = xeOptFields.Attribute("timeStamp");
                    if ((a != null ? a.Value : "false").ToLower() == "true")
                    {
                        rptOptions |= IEC61850.Common.ReportOptions.TIME_STAMP;
                    }
                    a = xeOptFields.Attribute("dataSet");
                    if ((a != null ? a.Value : "false").ToLower() == "true")
                    {
                        rptOptions |= IEC61850.Common.ReportOptions.DATA_SET;
                    }
                    a = xeOptFields.Attribute("reasonCode");
                    if ((a != null ? a.Value : "false").ToLower() == "true")
                    {
                        rptOptions |= IEC61850.Common.ReportOptions.REASON_FOR_INCLUSION;
                    }
                    a = xeOptFields.Attribute("dataRef");
                    if ((a != null ? a.Value : "false").ToLower() == "true")
                    {
                        rptOptions |= IEC61850.Common.ReportOptions.DATA_REFERENCE;
                    }
                    a = xeOptFields.Attribute("entryID");
                    if ((a != null ? a.Value : "false").ToLower() == "true")
                    {
                        rptOptions |= IEC61850.Common.ReportOptions.ENTRY_ID;
                    }
                    a = xeOptFields.Attribute("configRef");
                    if ((a != null ? a.Value : "false").ToLower() == "true")
                    {
                        rptOptions |= IEC61850.Common.ReportOptions.CONF_REV;
                    }
                    a = xeOptFields.Attribute("bufOvfl");
                    if ((a != null ? a.Value : "false").ToLower() == "true")
                    {
                        rptOptions |= IEC61850.Common.ReportOptions.BUFFER_OVERFLOW;
                    }
                }
                OptFlds.DataValue = rptOptions;

                for (int i = 0; i < maxRptEnabled; i++)
                {
                    nodeRCBs[i].AddChildNode(RptId);
                    nodeRCBs[i].AddChildNode(DatSet);
                    nodeRCBs[i].AddChildNode(ConfRev);
                    nodeRCBs[i].AddChildNode(OptFlds);
                    nodeRCBs[i].AddChildNode(BufTm);
                    nodeRCBs[i].AddChildNode(TrgOps);
                    nodeRCBs[i].AddChildNode(IntgPd);
                }
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Creates a DA node from parsed XML
        /// </summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        private void CreateDataAttributes(NodeBase root, IEnumerable <XElement> elements, XNamespace ns)
        {
            foreach (XElement el in elements)
            {
                if (el.Attribute("name") != null)
                {
                    NodeData data = new NodeData(el.Attribute("name").Value);
                    if (el.Attribute("fc") != null)
                    {
                        data.SCL_FCDesc = el.Attribute("fc").Value;
                    }
                    else if (root is NodeData && !(root is NodeDO))
                    {
                        data.SCL_FCDesc = (root as NodeData).SCL_FCDesc;
                    }
                    var bType = el.Attribute("bType");
                    if (bType == null)
                    {
                        XElement en = el.Element(ns + "Val");
                        if (en != null)
                        {
                            data.DataValue = en.Value;
                        }
                        // Inheritance
                        if (root is NodeData && !(root is NodeDO))
                        {
                            data.SCL_BType = (root as NodeData).SCL_BType;
                        }
                    }
                    else
                    {
                        data.SCL_BType = bType.Value;
                        if (data.SCL_BType.Equals("Struct") && null != el.Attribute("type"))
                        {
                            data.SCL_Type = el.Attribute("type").Value;
                        }
                        else if (data.SCL_BType.Equals("Enum"))
                        {
                            data.SCL_BType = String.Concat(data.SCL_BType, " (Integer)");
                            if (null != el.Attribute("type"))
                            {
                                data.SCL_Type = el.Attribute("type").Value;
                            }
                        }
                    }
                    IEC61850.Common.TriggerOptions trgOptions = IEC61850.Common.TriggerOptions.NONE;
                    XAttribute a = el.Attribute("dchg");
                    if ((a != null ? a.Value : "false").ToLower() == "true")
                    {
                        trgOptions |= IEC61850.Common.TriggerOptions.DATA_CHANGED;
                    }
                    a = el.Attribute("qchg");
                    if ((a != null ? a.Value : "false").ToLower() == "true")
                    {
                        trgOptions |= IEC61850.Common.TriggerOptions.QUALITY_CHANGED;
                    }
                    a = el.Attribute("dupd");
                    if ((a != null ? a.Value : "false").ToLower() == "true")
                    {
                        trgOptions |= IEC61850.Common.TriggerOptions.DATA_UPDATE;
                    }
                    data.SCL_TrgOps = (byte)trgOptions;
                    // Inheritance
                    if ((root is NodeData && !(root is NodeDO)) && trgOptions == IEC61850.Common.TriggerOptions.NONE)
                    {
                        data.SCL_TrgOps = (root as NodeData).SCL_TrgOps;
                    }
                    int cnt = 0;
                    if (el.Attribute("count") != null)
                    {
                        int.TryParse(el.Attribute("count").Value, out cnt);
                    }
                    data.SCL_ArraySize = cnt;

                    root.AddChildNode(data);
                }
            }
        }
Ejemplo n.º 5
0
        private void CreateSDO_DA(NodeBase dataObject, NodeBase doType)
        {
            // for each DA in the DOType
            foreach (var dataAttribute in doType.GetChildNodes())
            {
                if (dataAttribute is NodeDO)
                {
                    // SDO (sub Data Object)
                    NodeBase subDoType = null;
                    try
                    {
                        subDoType = _dataObjectTypes.Single(dot => dot.Name.Equals((dataAttribute as NodeDO).SCL_Type));
                    }
                    catch (Exception e)
                    {
                        logger.LogError("SCL Parser: SDO type template not found: " + (dataAttribute as NodeDO).SCL_Type + ", for DO type: " + doType.Name + ", for LN type: " + doType.Parent.Name + ", in node: " + dataObject.Parent.Name + ", Exception: " + e.Message);
                        continue;
                    }
                    NodeDO subDataObject = new NodeDO(dataAttribute.Name);
                    subDataObject.SCL_ArraySize = (dataAttribute as NodeDO).SCL_ArraySize;

                    dataObject.AddChildNode(subDataObject);
                    if (subDataObject.SCL_ArraySize > 0)
                    {
                        for (int i = 0; i < subDataObject.SCL_ArraySize; i++)
                        {
                            NodeDO arrDataObject = new NodeDO("[" + i.ToString() + "]");
                            subDataObject.AddChildNode(arrDataObject);
                            arrDataObject.SCL_UpperDOName = dataObject.Name;

                            foreach (var dataAttribute2 in subDoType.GetChildNodes())
                            {
                                if (dataAttribute2 is NodeDO)
                                {
                                    CreateSDO_DA(arrDataObject, subDoType);
                                }
                                else
                                {
                                    CreateDataAttributesIEC(arrDataObject, dataAttribute2);
                                }
                            }
                        }
                    }
                    else
                    {
                        foreach (var dataAttribute2 in subDoType.GetChildNodes())
                        {
                            if (dataAttribute2 is NodeDO)
                            {
                                CreateSDO_DA(subDataObject, subDoType);
                            }
                            else
                            {
                                CreateDataAttributesIEC(subDataObject, dataAttribute2);
                            }
                        }
                    }
                }
                if (dataAttribute is NodeData && !(dataAttribute is NodeDO))
                {
                    CreateDataAttributesIEC(dataObject, dataAttribute);
                }
            }
        }
Ejemplo n.º 6
0
 void makeIedModelFromIecModel(Iec61850Model model, NodeBase iec)
 {
     foreach (NodeBase child in iec.GetChildNodes())
     {
         if ((child is NodeData && !(child is NodeDO)) || child is NodeVLM)
         {
             // First DataAttribute child
             // Create the whole path down to Ied
             List <NodeBase> path = new List <NodeBase>();
             NodeBase        nb   = child.Parent;
             while (nb != null && !(nb is NodeIed))
             {
                 path.Add(nb);
                 nb = nb.Parent;
             }
             NodeBase subtree = model.ied;
             string   fc      = "";
             if (child is NodeData && !(child is NodeDO))
             {
                 fc = (child as NodeData).SCL_FCDesc;
                 if (String.IsNullOrEmpty(fc))
                 {
                     logger.LogError("FC is empty for DataAttribute: " + child.IecAddress);
                     continue;
                 }
             }
             path.Reverse();
             foreach (NodeBase pnb in path)
             {
                 if (pnb is NodeLD)
                 {
                     subtree = subtree.AddChildNode(new NodeLD(pnb.Name));
                 }
                 else if (pnb is NodeLN)
                 {
                     subtree = subtree.AddChildNode(new NodeLN(pnb.Name));
                     // Inserting the FC level
                     if (!String.IsNullOrEmpty(fc))  // due to VLM
                     {
                         subtree = subtree.AddChildNode(new NodeFC(fc));
                     }
                 }
                 else if (pnb is NodeDO)
                 {
                     subtree = subtree.AddChildNode(new NodeDO(pnb.Name));
                 }
                 else if (pnb is NodeRCB)
                 {
                     subtree = subtree.AddChildNode(new NodeRCB(pnb.Name));
                     (subtree as NodeRCB).isBuffered = (pnb as NodeRCB).isBuffered;
                     if ((pnb as NodeRCB).isBuffered)
                     {
                         model.brcbs.AddChildNode(new NodeLD(path[0].Name)).LinkChildNodeByName(subtree);
                     }
                     else
                     {
                         model.urcbs.AddChildNode(new NodeLD(path[0].Name)).LinkChildNodeByName(subtree);
                     }
                 }
                 else if (pnb is NodeVL)
                 {
                     //subtree = subtree.AddChildNode(new NodeVL(pnb.Name));
                     model.lists.AddChildNode(new NodeLD(path[0].Name)).LinkChildNodeByName(pnb);
                 }
             }
             if (!(child is NodeVLM))
             {
                 subtree.LinkChildNodeByName(child);
             }
             else
             {
                 // Fill the gap -> find the link for VLM nodes
                 (child as NodeVLM).LinkedNode = model.iec.FindSubNode(child.Name);
                 if ((child as NodeVLM).LinkedNode == null)
                 {
                     logger.LogWarning("DataSet " + child.Parent.IecAddress + ": node " + child.Name + " not found in the model!");
                 }
             }
         }
         else
         {
             // Recursive call
             makeIedModelFromIecModel(model, child);
         }
     }
 }
Ejemplo n.º 7
0
        private void processReportControl(XmlNode LNNodeCn, NodeBase LNNb)
        {
            NodeBase lnfc = LNNb.AddChildNode(new NodeFC("RP"));

            string[] rptIDSplit = LNNodeCn.Attributes.GetNamedItem("rptID").Value.ToString().Split('$');

            NodeBase lnfccn = lnfc.AddChildNode(new NodeData(rptIDSplit[rptIDSplit.Length - 1]));

            foreach (XmlAttribute Attr in LNNodeCn.Attributes)
            {
                NodeBase nd = null;

                switch (Attr.Name.ToLower())
                {
                case "rptid":
                    nd = new NodeData("RptId");
                    (nd as NodeData).DataType    = scsm_MMS_TypeEnum.visible_string;
                    (nd as NodeData).StringValue = Attr.Value;
                    lnfccn.AddChildNode(nd);
                    break;

                case "confrev":
                    nd = new NodeData("ConfRev");
                    (nd as NodeData).DataType  = scsm_MMS_TypeEnum.unsigned;
                    (nd as NodeData).DataValue = Attr.Value;
                    lnfccn.AddChildNode(nd);
                    break;

                case "intgpd":
                    nd = new NodeData("IntgPd");
                    (nd as NodeData).DataType  = scsm_MMS_TypeEnum.unsigned;
                    (nd as NodeData).DataValue = Attr.Value;
                    lnfccn.AddChildNode(nd);
                    break;

                case "datset":
                    nd = new NodeData("DatSet");
                    (nd as NodeData).DataType    = scsm_MMS_TypeEnum.visible_string;
                    (nd as NodeData).StringValue = Attr.Value;
                    lnfccn.AddChildNode(nd);
                    break;

                case "buftime":
                    nd = new NodeData("BufTm");
                    (nd as NodeData).DataType  = scsm_MMS_TypeEnum.unsigned;
                    (nd as NodeData).DataValue = Attr.Value;
                    lnfccn.AddChildNode(nd);
                    break;
                }
            }

            foreach (XmlNode LNNodeCnCn in LNNodeCn.ChildNodes)
            {
                NodeBase nd = null;

                switch (LNNodeCnCn.Name.ToLower())
                {
                case "trgops":
                    nd = new NodeData("TrgOps");
                    (nd as NodeData).DataType = scsm_MMS_TypeEnum.bit_string;
                    lnfccn.AddChildNode(nd);
                    break;

                case "optfields":
                    nd = new NodeData("OptFlds");
                    (nd as NodeData).DataType = scsm_MMS_TypeEnum.bit_string;
                    lnfccn.AddChildNode(nd);
                    break;

                case "rptenabled":
                    nd = new NodeData("RprEna");
                    (nd as NodeData).DataType  = scsm_MMS_TypeEnum.boolean;
                    (nd as NodeData).DataValue = LNNodeCnCn.Value;
                    lnfccn.AddChildNode(nd);
                    break;
                }
            }
        }
Ejemplo n.º 8
0
        private void processGSEControl(XmlNode LNNodeCn, NodeBase LNNb, XmlNodeList DataSets, XmlNodeList GSE)
        {
            NodeBase LNFc = LNNb.AddChildNode(new NodeFC("GO"));
            NodeBase DO   = LNFc.AddChildNode(new NodeData(getStringAttribute(LNNodeCn, "name")));

            NodeBase Nd = new NodeData("GoID");

            (Nd as NodeData).DataType  = scsm_MMS_TypeEnum.visible_string;
            (Nd as NodeData).DataValue = getStringAttribute(LNNodeCn, "appID");
            DO.AddChildNode(Nd);

            Nd = new NodeData("DatSet");
            (Nd as NodeData).DataType  = scsm_MMS_TypeEnum.visible_string;
            (Nd as NodeData).DataValue = LNNb.IecAddress + "$" + getStringAttribute(LNNodeCn, "datSet");
            DO.AddChildNode(Nd);

            if (GSE.Count > 0)
            {
                foreach (XmlNode GSENode in GSE)
                {
                    if (GSENode.Name == "GSE" && getStringAttribute(LNNodeCn, "name") == getStringAttribute(GSENode, "cbName"))
                    {
                        foreach (XmlNode GSENodeCn in GSENode.ChildNodes)
                        {
                            if (GSENodeCn.Name == "Address")
                            {
                                Nd = new NodeData("DstAddress");
                                (Nd as NodeData).DataType = scsm_MMS_TypeEnum.structure;
                                NodeBase DA = DO.AddChildNode(Nd);

                                foreach (XmlNode GSENodeCnCn in GSENodeCn.ChildNodes)
                                {
                                    switch (getStringAttribute(GSENodeCnCn, "type"))
                                    {
                                    case "MAC-Address":
                                        Nd = new NodeData("Addr");
                                        (Nd as NodeData).DataType  = scsm_MMS_TypeEnum.visible_string;
                                        (Nd as NodeData).DataValue = GSENodeCnCn.InnerText;
                                        DA.AddChildNode(Nd);
                                        break;

                                    case "APPID":
                                        Nd = new NodeData("APPID");
                                        (Nd as NodeData).DataType  = scsm_MMS_TypeEnum.visible_string;
                                        (Nd as NodeData).DataValue = Convert.ToUInt32(GSENodeCnCn.InnerText).ToString();
                                        DA.AddChildNode(Nd);
                                        break;

                                    case "VLAN-PRIORITY":
                                        Nd = new NodeData("PRIORITY");
                                        (Nd as NodeData).DataType  = scsm_MMS_TypeEnum.visible_string;
                                        (Nd as NodeData).DataValue = GSENodeCnCn.InnerText;
                                        DA.AddChildNode(Nd);
                                        break;
                                    }
                                }
                            }
                            break;
                        }
                    }
                }
            }
        }
Ejemplo n.º 9
0
        private void processDOI(string LNNodeLnType, string LNNodeCnName, XmlNode LNNodeCn, NodeBase LNNb, XmlNodeList LNodeTypeNodes, XmlNodeList DOTypeNodes, XmlNodeList DATypeNodes)
        {
            // Process Instantiated Data Object
            foreach (XmlNode LNNodeTypeNodesNd in LNodeTypeNodes)
            {
                foreach (XmlNode LNNodeTypeNodesNdCn in LNNodeTypeNodesNd.ChildNodes)
                {
                    if (LNNodeCnName == getStringAttribute(LNNodeTypeNodesNdCn, "name") && LNNodeLnType == getStringAttribute(LNNodeTypeNodesNd, "id"))
                    {
                        foreach (XmlNode DOTypeNodesNd in DOTypeNodes)
                        {
                            if (getStringAttribute(LNNodeTypeNodesNdCn, "type") == getStringAttribute(DOTypeNodesNd, "id"))
                            {
                                foreach (XmlNode DOTypeNodesNdCn in DOTypeNodesNd.ChildNodes)
                                {
                                    if (DOTypeNodesNdCn.Name == "DA")
                                    {
                                        NodeBase LNFC   = LNNb.AddChildNode(new NodeFC(getStringAttribute(DOTypeNodesNdCn, "fc")));
                                        NodeBase LNFCCn = LNFC.AddChildNode(new NodeData(getStringAttribute(LNNodeTypeNodesNdCn, "name")));
                                        NodeData Nd     = new NodeData(getStringAttribute(DOTypeNodesNdCn, "name"));
                                        Nd.DataType = getVarDataType(getStringAttribute(DOTypeNodesNdCn, "bType"));

                                        NodeBase DOCn = LNFCCn.AddChildNode(Nd);

                                        if (Nd.DataType == scsm_MMS_TypeEnum.structure)
                                        {
                                            processStructDAType(DOCn, getStringAttribute(DOTypeNodesNdCn, "type"), DATypeNodes);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            foreach (XmlNode LNNodeCnNd in LNNodeCn.ChildNodes)
            {
                if (LNNodeCnNd.Name == "DAI")
                {
                    if (getStringAttribute(LNNodeCnNd, "name") == "d")
                    {
                        foreach (XmlNode LNNodeCnNdCn in LNNodeCnNd)
                        {
                            if (LNNodeCnNdCn.Name == "Val")
                            {
                                NodeBase FCNb = LNNb.FindChildNode("DC");
                                if (FCNb != null)
                                {
                                    NodeBase[] FCNbCn = FCNb.GetChildNodes();
                                    if (FCNbCn.Length > 0)
                                    {
                                        foreach (NodeBase DO in FCNbCn)
                                        {
                                            if (DO.Name == LNNodeCnName)
                                            {
                                                NodeBase[] DOCn = DO.GetChildNodes();

                                                if (DOCn.Length > 0)
                                                {
                                                    foreach (NodeBase DA in DOCn)
                                                    {
                                                        if (DA.Name == "d")
                                                        {
                                                            (DA as NodeData).DataValue = LNNodeCnNdCn.InnerText;
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }

                                int i = 0;
                            }
                        }
                    }
                }
            }
        }