Skip to content

Commit

Permalink
Update xml reader
Browse files Browse the repository at this point in the history
  • Loading branch information
caprican committed Jan 27, 2025
1 parent 618a619 commit c26e196
Show file tree
Hide file tree
Showing 14 changed files with 390 additions and 156 deletions.
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
# SimaticML
SIMATIC Markup Language (SimaticML) is a Siemens standard based on XML for the exchange of software data in TIA Portal. The standard is used by TIA Portal Openness when exporting and importing software data such as program blocks or HMI screens.
>**_REF:_** ([Siemens industry](https://support.industry.siemens.com/))
# AML
Automation Markup Language (AML) is an open standard based on XML for exchanging hardware (CAx) data. The CAx data import in TIA Portal uses TIA Portal Openness to generate the hardware configuration and networks.
>**_REF:_** [AutomationML](https://www.automationml.org/)
## Documentation
You can find further documentation and help in the following links:
- [TIA Portal Openness V16: System manual](https://support.industry.siemens.com/cs/document/109773802/simatic-tia-portal-openness-automating-creation-of-projects?dti=0&lc=en-WW)
Expand Down
22 changes: 14 additions & 8 deletions SimaticML.Demo/Program.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,7 @@
// See https://aka.ms/new-console-template for more information
using System.Xml.Serialization;
using System.Xml.Serialization;
using System.Xml;

Console.WriteLine("Hello, World!");

//var fileName = @"C:\Users\capri\OneDrive\Documents\Automation\TIA069\UserFiles\Export\N100_Defauts.xml";
//var fileName = @"C:\Users\capri\OneDrive\Documents\Automation\TIA069\UserFiles\Export\LSKF_Motor.xml";
//var fileName = @"C:\Users\capri\OneDrive\Documents\Automation\TIA069\UserFiles\Export\TMA_R1_AlarmesAvertissements.xml";
var fileName = @"C:\Users\capri\OneDrive\Documents\Automation\TIA069\UserFiles\Export\N100.xml";
var fileName = @"C:\.xml";

var settings = new XmlReaderSettings
{
Expand All @@ -27,9 +21,21 @@
{
switch (document[0])
{
case SimaticML.SW.Blocks.OB ob:
break;
case SimaticML.SW.Blocks.FC fc:
break;
case SimaticML.SW.Blocks.FB fb:
break;
case SimaticML.SW.Blocks.GlobalDB globalDB:
//var item = globalDB.AttributeList.Interface.Sections[0];//.Member[0];
break;
case SimaticML.SW.Blocks.ArrayDB arrayDB:
break;
case SimaticML.SW.Blocks.InstanceDB instanceDB:
break;

case SimaticML.SW.Types.PlcStruct plcStruct:
break;
}
}
Expand Down
2 changes: 2 additions & 0 deletions SimaticML/Document.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ public void ReadXml(XmlReader reader)
break;

case "SW.Tags.PlcTagTable":
throw new NotImplementedException();
break;

case "SW.Types.PlcStruct":
Expand All @@ -114,6 +115,7 @@ public void ReadXml(XmlReader reader)
break;

case "SW.WatchAndForceTables.PlcWatchTable":
throw new NotImplementedException();
break;
}
}
Expand Down
7 changes: 6 additions & 1 deletion SimaticML/SW/Interface/SW_Interface_Snapshot.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public class SnapshotValues_T : Object_G

public override void ReadXml(XmlReader reader)
{
reader.MoveToContent();
if (!reader.IsEmptyElement)
{
reader.Read();
Expand All @@ -31,9 +32,12 @@ public override void ReadXml(XmlReader reader)
}
}
if (values.Count > 0) Value = values.ToArray();
}

if (reader.IsStartElement())
reader.Read();
else
reader.ReadEndElement();
}
}

public override void WriteXml(XmlWriter writer)
Expand Down Expand Up @@ -70,6 +74,7 @@ public override void ReadXml(XmlReader reader)
}
}
reader.MoveToContent();

Value = reader.ReadInnerXml();
}

Expand Down
1 change: 1 addition & 0 deletions SimaticML/SW/InterfaceSections/StartValue_T.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ public override void ReadXml(XmlReader reader)
break;
}
}

reader.MoveToContent();
Value = reader.ReadInnerXml();
}
Expand Down
28 changes: 17 additions & 11 deletions SimaticML/SW/PlcBlocks/Access/AbsoluteOffset_T.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ namespace SimaticML.SW.PlcBlocks.Access
/// </list>
/// </remarks>
[Serializable]
[XmlRoot("AbsoluteOffset", Namespace = "", IsNullable = false)]
[XmlRoot("AbsoluteOffset", IsNullable = false)]
public class AbsoluteOffset_T : Object_G
{
/// <summary>
Expand All @@ -29,17 +29,23 @@ public class AbsoluteOffset_T : Object_G

public override void ReadXml(XmlReader reader)
{
_ = int.TryParse(reader.GetAttribute("BitOffset"), out var bitOffset);
BitOffset = bitOffset;
while (reader.MoveToNextAttribute())
{
switch (reader.LocalName)
{
case nameof(BitOffset):
BitOffset = reader.ReadContentAsInt();
break;
case nameof(Type):
Type = reader.ReadContentAsString();
break;
}
}

Type = reader.GetAttribute("Type");

//if (!reader.IsEmptyElement)
//{
// reader.Read();

//}
reader.ReadEndElement();
if (reader.IsStartElement())
reader.Read();
else
reader.ReadEndElement();
}

public override void WriteXml(XmlWriter writer)
Expand Down
102 changes: 67 additions & 35 deletions SimaticML/SW/PlcBlocks/Access/Address_T.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,30 +47,40 @@ public class Address_T : Object_G

public override void ReadXml(XmlReader reader)
{
_ = Enum.TryParse<Area_TE>(reader.GetAttribute("Area"), out var area);
Area = area;

Type = reader.GetAttribute("Type");

BlockNumberSpecified = int.TryParse(reader.GetAttribute("BlockNumber"), out var blockNumber);
if (BlockNumberSpecified) BlockNumber = blockNumber;

BitOffsetSpecified = int.TryParse(reader.GetAttribute("BitOffset"), out var bitOffset);
if (BitOffsetSpecified) BitOffset = bitOffset;

_ = bool.TryParse(reader.GetAttribute("Informative"), out var informative);
Informative = informative;

if (!reader.IsEmptyElement)
while (reader.MoveToNextAttribute())
{
reader.Read();
switch (reader.LocalName)
{
case nameof(Area):
Enum.TryParse<Area_TE>(reader.ReadContentAsString(), out var area);
Area = area;
break;
case nameof(Type):
Type = reader.ReadContentAsString();
BlockNumberSpecified = true;
break;
case nameof(BlockNumber):
BlockNumber = reader.ReadContentAsInt();
break;
case nameof(BitOffset):
BitOffset = reader.ReadContentAsInt();
BitOffsetSpecified = true;
break;
case nameof(Informative):
Informative = reader.ReadContentAsBoolean();
break;
}
}

if (reader.IsStartElement())
reader.Read();
else
reader.ReadEndElement();
}
}

public override void WriteXml(XmlWriter writer)
{
throw new NotImplementedException();
}
}

Expand All @@ -88,7 +98,7 @@ public override void WriteXml(XmlWriter writer)
public class Address_T_v2 : Address_T
{
[XmlElement("BooleanAttribute")]
public Common.BooleanAttribute_T_v2[] Items { get; set; }
public Common.BooleanAttribute_T_v2[] Attributes { get; set; }

[XmlAttribute]
public int? UId { get; set; } = null;
Expand All @@ -97,23 +107,36 @@ public class Address_T_v2 : Address_T

public override void ReadXml(XmlReader reader)
{
_ = Enum.TryParse<Area_TE>(reader.GetAttribute("Area"), out var area);
Area = area;

Type = reader.GetAttribute("Type");

BlockNumberSpecified = int.TryParse(reader.GetAttribute("BlockNumber"), out var blockNumber);
if (BlockNumberSpecified) BlockNumber = blockNumber;

BitOffsetSpecified = int.TryParse(reader.GetAttribute("BitOffset"), out var bitOffset);
if (BitOffsetSpecified) BitOffset = bitOffset;

_ = bool.TryParse(reader.GetAttribute("Informative"), out var informative);
Informative = informative;

UIdSpecified = int.TryParse(reader.GetAttribute("UId"), out var uId);
if (UIdSpecified) UId = uId;
while (reader.MoveToNextAttribute())
{
switch (reader.LocalName)
{
case nameof(Area):
Enum.TryParse<Area_TE>(reader.ReadContentAsString(), out var area);
Area = area;
break;
case nameof(Type):
Type = reader.ReadContentAsString();
BlockNumberSpecified = true;
break;
case nameof(BlockNumber):
BlockNumber = reader.ReadContentAsInt();
break;
case nameof(BitOffset):
BitOffset = reader.ReadContentAsInt();
BitOffsetSpecified = true;
break;
case nameof(Informative):
Informative = reader.ReadContentAsBoolean();
break;
case nameof(UId):
UId = reader.ReadContentAsInt();
UIdSpecified = true;
break;
}
}

reader.MoveToContent();
if (!reader.IsEmptyElement)
{
reader.Read();
Expand All @@ -127,15 +150,24 @@ public override void ReadXml(XmlReader reader)
booleanAttr.ReadXml(reader);
items.Add(booleanAttr);
break;
default:
reader.Skip();
break;
}
}
if (items.Count > 0) Items = items.ToArray();
if (items.Count > 0) Attributes = items.ToArray();
reader.ReadEndElement();
}

if (reader.IsStartElement())
reader.Read();
else
reader.ReadEndElement();
}

public override void WriteXml(XmlWriter writer)
{
throw new NotImplementedException();
}
}
}
Loading

0 comments on commit c26e196

Please sign in to comment.