|
|
|
|
/*
|
|
|
|
|
* Copyright 2013-2025 Michael Zillgith, MZ Automation GmbH
|
|
|
|
|
*
|
|
|
|
|
* This file is part of MZ Automation IEC 61850 SDK
|
|
|
|
|
*
|
|
|
|
|
* All rights reserved.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
using System;
|
|
|
|
|
using System.Xml;
|
|
|
|
|
|
|
|
|
|
namespace IEC61850.SCL
|
|
|
|
|
{
|
|
|
|
|
public class SclSMVControl
|
|
|
|
|
{
|
|
|
|
|
internal XmlNode xmlNode;
|
|
|
|
|
private XmlDocument xmlDocument;
|
|
|
|
|
private SclSmvOpts smvOpts = null;
|
|
|
|
|
|
|
|
|
|
public SclSMVControl(SclDocument SclxmlDocument, XmlNode xmlNode, XmlNamespaceManager nsManager)
|
|
|
|
|
{
|
|
|
|
|
this.xmlNode = xmlNode;
|
|
|
|
|
xmlDocument = SclxmlDocument.XmlDocument;
|
|
|
|
|
|
|
|
|
|
XmlAttribute nameAttr = xmlNode.Attributes["name"];
|
|
|
|
|
|
|
|
|
|
if (nameAttr == null)
|
|
|
|
|
SclxmlDocument.AddIssue(xmlNode, "ERROR", "Model integrity", "SMVControl has no name attribute", this, "MissingName");
|
|
|
|
|
|
|
|
|
|
XmlNode smvOptsNode = xmlNode.SelectSingleNode("scl:SmvOpts", nsManager);
|
|
|
|
|
|
|
|
|
|
if (smvOptsNode != null)
|
|
|
|
|
smvOpts = new SclSmvOpts(xmlDocument, smvOptsNode);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public SclSmvOpts SclSmvOpts
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return smvOpts;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public string Name
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return XmlHelper.GetAttributeValue(xmlNode, "name");
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "name", value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public string Desc
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return XmlHelper.GetAttributeValue(xmlNode, "desc");
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "desc", value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public string DataSet
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return XmlHelper.GetAttributeValue(xmlNode, "datSet");
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "datSet", value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public int ConfRev
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
string valStr = XmlHelper.GetAttributeValue(xmlNode, "confRev");
|
|
|
|
|
|
|
|
|
|
if (valStr != null)
|
|
|
|
|
{
|
|
|
|
|
int retVal = -1;
|
|
|
|
|
Int32.TryParse(valStr, out retVal);
|
|
|
|
|
|
|
|
|
|
return (retVal);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return (-1);
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "confRev", value.ToString());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public string SmvID
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return XmlHelper.GetAttributeValue(xmlNode, "smvID");
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "smvID", value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool Multicast
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return XmlHelper.ParseBooleanAttribute(xmlNode, "multicast", false);
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
XmlHelper.SetBooleanAttributeCreateIfNotExists(xmlDocument, xmlNode, "multicast", value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int SmpRate
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
string valStr = XmlHelper.GetAttributeValue(xmlNode, "smpRate");
|
|
|
|
|
|
|
|
|
|
if (valStr != null)
|
|
|
|
|
{
|
|
|
|
|
int retVal = -1;
|
|
|
|
|
Int32.TryParse(valStr, out retVal);
|
|
|
|
|
|
|
|
|
|
return (retVal);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return (-1);
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "smpRate", value.ToString());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int NofASDU
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
string valStr = XmlHelper.GetAttributeValue(xmlNode, "nofASDU");
|
|
|
|
|
|
|
|
|
|
if (valStr != null)
|
|
|
|
|
{
|
|
|
|
|
int retVal = -1;
|
|
|
|
|
Int32.TryParse(valStr, out retVal);
|
|
|
|
|
|
|
|
|
|
return (retVal);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return (-1);
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "nofASDU", value.ToString());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public string SmpMod
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return XmlHelper.GetAttributeValue(xmlNode, "smpMod");
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "smpMod", value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public string SecurityEnabled
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return XmlHelper.GetAttributeValue(xmlNode, "securityEnabled");
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
XmlHelper.SetAttributeCreateIfNotExists(xmlDocument, xmlNode, "securityEnabled", value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class SclSmvOpts
|
|
|
|
|
{
|
|
|
|
|
internal XmlNode xmlNode = null;
|
|
|
|
|
private XmlDocument xmlDocument;
|
|
|
|
|
|
|
|
|
|
public bool RefreshTime
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return XmlHelper.ParseBooleanAttribute(xmlNode, "refreshTime", false); ;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
XmlHelper.SetBooleanAttributeCreateIfNotExists(xmlDocument, xmlNode, "refreshTime", value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool SampleRate
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return XmlHelper.ParseBooleanAttribute(xmlNode, "sampleRate", false);
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
XmlHelper.SetBooleanAttributeCreateIfNotExists(xmlDocument, xmlNode, "sampleRate", value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool DataSet
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return XmlHelper.ParseBooleanAttribute(xmlNode, "dataSet", false); ;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
XmlHelper.SetBooleanAttributeCreateIfNotExists(xmlDocument, xmlNode, "dataSet", value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool Security
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return XmlHelper.ParseBooleanAttribute(xmlNode, "security", false);
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
XmlHelper.SetBooleanAttributeCreateIfNotExists(xmlDocument, xmlNode, "security", value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool SynchSourceId
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return XmlHelper.ParseBooleanAttribute(xmlNode, "synchSourceId", false); ;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
XmlHelper.SetBooleanAttributeCreateIfNotExists(xmlDocument, xmlNode, "synchSourceId", value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool DataRef
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return XmlHelper.ParseBooleanAttribute(xmlNode, "dataRef", false); ;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
XmlHelper.SetBooleanAttributeCreateIfNotExists(xmlDocument, xmlNode, "dataRef", value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool SampleSynchronized
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return XmlHelper.ParseBooleanAttribute(xmlNode, "sampleSynchronized", false); ;
|
|
|
|
|
}
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
XmlHelper.SetBooleanAttributeCreateIfNotExists(xmlDocument, xmlNode, "sampleSynchronized", value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int GetIntValue()
|
|
|
|
|
{
|
|
|
|
|
int intValue = 0;
|
|
|
|
|
|
|
|
|
|
if (RefreshTime) intValue += 1;
|
|
|
|
|
if (SampleSynchronized) intValue += 2;
|
|
|
|
|
if (SampleRate) intValue += 4;
|
|
|
|
|
if (DataSet) intValue += 8;
|
|
|
|
|
if (Security) intValue += 16;
|
|
|
|
|
|
|
|
|
|
return intValue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public SclSmvOpts(XmlDocument xmlDocument, XmlNode xmlNode)
|
|
|
|
|
{
|
|
|
|
|
this.xmlNode = xmlNode;
|
|
|
|
|
this.xmlDocument = xmlDocument;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|