/// <summary> /// Create a single component from XML data /// </summary> /// <param name="node">XML node containing component data</param> /// <returns>Created Component</returns> private static ComponentBase CreateComponent(XmlNode node) { ComponentBase component; switch (node.LocalName) { #region Basic case "Coil": Coil coil = new Coil(); coil.Mode = node.Attributes["Mode"].Value.ToEnum <Coil.CoilMode>(); coil.Type = node.Attributes["Type"].Value.ToEnum <Coil.CoilType>(); component = coil; break; case "Contact": Contact contact = new Contact(); contact.IsClosed = node.Attributes["IsClosed"].Value.ToBool(); contact.IsInverted = node.Attributes["IsInverted"].Value.ToBool(); contact.Type = node.Attributes["Type"].Value.ToEnum <Contact.ContactType>(); component = contact; break; case "SC": component = new SC(); break; case "OSF": component = new OSF(); break; case "OSR": component = new OSR(); break; #endregion Basic #region Compare Components case "EQU": component = new EQU(); break; case "GEQ": component = new GEQ(); break; case "GRT": component = new GRT(); break; case "LEG": component = new LEG(); break; case "LES": component = new LES(); break; case "NEQ": component = new NEQ(); break; #endregion Compare Components #region Counter Components case "CTC": component = new CTC(); break; case "CTD": component = new CTD(); break; case "CTU": component = new CTU(); break; case "RES": component = new RES(); break; #endregion Counter Components #region Math Components case "ADD": component = new ADD(); break; case "DIV": component = new DIV(); break; case "MUL": component = new MUL(); break; case "SUB": component = new SUB(); break; case "MOV": component = new MOV(); break; #endregion Math Components #region Analog Components case "ADC": ADC adc = new ADC(); adc.Destination = node.Attributes["Destination"].Value; component = adc; break; case "PWM": PWM pwm = new PWM(); pwm.DudyCycle = node.Attributes["DudyCycle"].Value; component = pwm; break; #endregion Analog Components #region Function Components case "ELF": ELF elf = new ELF(); elf.Name = node.Attributes["Name"].Value; elf.Code = node.InnerText; component = elf; break; #endregion Function Components default: throw new ArgumentException("Unknow Component", "node"); } component.Comment = node.Attributes["Comment"].Value; #region Extra Processing based on Components Base Class if (component is NameableComponent) { (component as NameableComponent).Name = node.Attributes["Name"].Value; } if (component is CompareComponent) { (component as CompareComponent).VarA = node.Attributes["VarA"].Value; (component as CompareComponent).VarB = node.Attributes["VarB"].Value; } else if (component is CounterComponent) { (component as CounterComponent).Limit = node.Attributes["Limit"].Value; } else if (component is MathComponent) { (component as MathComponent).Destination = node.Attributes["Destination"].Value; (component as MathComponent).VarA = node.Attributes["VarA"].Value; (component as MathComponent).VarB = node.Attributes["VarB"].Value; } #endregion Extra Processing based on Components Base Class return(component); }
public void Compare() { #region Startup var TestTable = new LadderDataTable(); Node PowerRail = new Node(); EQU equ = new EQU(); equ.LeftLide = PowerRail; equ.VarA = "VarA"; equ.VarB = "VarB"; equ.DataTable = TestTable; GEQ geq = new GEQ(); geq.LeftLide = PowerRail; geq.VarA = "VarA"; geq.VarB = "VarB"; geq.DataTable = TestTable; GRT grt = new GRT(); grt.LeftLide = PowerRail; grt.VarA = "VarA"; grt.VarB = "VarB"; grt.DataTable = TestTable; LEG leg = new LEG(); leg.LeftLide = PowerRail; leg.VarA = "VarA"; leg.VarB = "VarB"; leg.DataTable = TestTable; LES les = new LES(); les.LeftLide = PowerRail; les.VarA = "VarA"; les.VarB = "VarB"; les.DataTable = TestTable; NEQ neq = new NEQ(); neq.LeftLide = PowerRail; neq.VarA = "VarA"; neq.VarB = "VarB"; neq.DataTable = TestTable; #endregion Startup #region EQU Trace.WriteLine("EQU", "Unit Test"); Trace.Indent(); Trace.WriteLine("Input False", "EQU"); Trace.Indent(); PowerRail.LogicLevel = false; TestTable.SetValue(0, (short)1); TestTable.SetValue(1, (short)1); Assert.IsFalse(equ.Execute()); TestTable.SetValue(0, (short)0); TestTable.SetValue(1, (short)1); Assert.IsFalse(equ.Execute()); TestTable.SetValue(0, (short)1); TestTable.SetValue(1, (short)0); Assert.IsFalse(equ.Execute()); Trace.Unindent(); Trace.WriteLine("Input True", "EQU"); Trace.Indent(); PowerRail.LogicLevel = true; TestTable.SetValue(0, (short)1); TestTable.SetValue(1, (short)1); Assert.IsTrue(equ.Execute()); TestTable.SetValue(0, (short)0); TestTable.SetValue(1, (short)1); Assert.IsFalse(equ.Execute()); TestTable.SetValue(0, (short)1); TestTable.SetValue(1, (short)0); Assert.IsFalse(equ.Execute()); Trace.Unindent(); Trace.Unindent(); #endregion EQU #region GEQ Trace.WriteLine("GEQ", "Unit Test"); Trace.Indent(); Trace.WriteLine("Input False", "GEQ"); Trace.Indent(); PowerRail.LogicLevel = false; TestTable.SetValue(0, (short)1); TestTable.SetValue(1, (short)1); Assert.IsFalse(geq.Execute()); TestTable.SetValue(0, (short)0); TestTable.SetValue(1, (short)1); Assert.IsFalse(geq.Execute()); TestTable.SetValue(0, (short)1); TestTable.SetValue(1, (short)0); Assert.IsFalse(geq.Execute()); Trace.Unindent(); Trace.WriteLine("Input True", "GEQ"); Trace.Indent(); PowerRail.LogicLevel = true; TestTable.SetValue(0, (short)1); TestTable.SetValue(1, (short)1); Assert.IsTrue(geq.Execute()); TestTable.SetValue(0, (short)0); TestTable.SetValue(1, (short)1); Assert.IsFalse(geq.Execute()); TestTable.SetValue(0, (short)1); TestTable.SetValue(1, (short)0); Assert.IsTrue(geq.Execute()); Trace.Unindent(); Trace.Unindent(); #endregion GEQ #region GRT Trace.WriteLine("GRT", "Unit Test"); Trace.Indent(); Trace.WriteLine("Input False", "GRT"); Trace.Indent(); PowerRail.LogicLevel = false; TestTable.SetValue(0, (short)1); TestTable.SetValue(1, (short)1); grt.Execute(); Assert.IsFalse(grt.InternalState); TestTable.SetValue(0, (short)0); TestTable.SetValue(1, (short)1); grt.Execute(); Assert.IsFalse(grt.InternalState); TestTable.SetValue(0, (short)1); TestTable.SetValue(1, (short)0); grt.Execute(); Assert.IsFalse(grt.InternalState); Trace.Unindent(); Trace.WriteLine("Input True", "GRT"); Trace.Indent(); PowerRail.LogicLevel = true; TestTable.SetValue(0, (short)1); TestTable.SetValue(1, (short)1); grt.Execute(); Assert.IsFalse(grt.InternalState); TestTable.SetValue(0, (short)0); TestTable.SetValue(1, (short)1); grt.Execute(); Assert.IsFalse(grt.InternalState); TestTable.SetValue(0, (short)1); TestTable.SetValue(1, (short)0); grt.Execute(); Assert.IsTrue(grt.InternalState); Trace.Unindent(); Trace.Unindent(); #endregion GRT #region LEG Trace.WriteLine("LEG", "Unit Test"); Trace.Indent(); Trace.WriteLine("Input False", "LEG"); Trace.Indent(); PowerRail.LogicLevel = false; TestTable.SetValue(0, (short)1); TestTable.SetValue(1, (short)1); leg.Execute(); Assert.IsFalse(leg.InternalState); TestTable.SetValue(0, (short)0); TestTable.SetValue(1, (short)1); leg.Execute(); Assert.IsFalse(leg.InternalState); TestTable.SetValue(0, (short)1); TestTable.SetValue(1, (short)0); leg.Execute(); Assert.IsFalse(leg.InternalState); Trace.Unindent(); Trace.WriteLine("Input True", "LEG"); Trace.Indent(); PowerRail.LogicLevel = true; TestTable.SetValue(0, (short)1); TestTable.SetValue(1, (short)1); leg.Execute(); Assert.IsTrue(leg.InternalState); TestTable.SetValue(0, (short)0); TestTable.SetValue(1, (short)1); leg.Execute(); Assert.IsTrue(leg.InternalState); TestTable.SetValue(0, (short)1); TestTable.SetValue(1, (short)0); leg.Execute(); Assert.IsFalse(leg.InternalState); Trace.Unindent(); Trace.Unindent(); #endregion LEG #region LES Trace.WriteLine("LES", "Unit Test"); Trace.Indent(); Trace.WriteLine("Input False", "LES"); Trace.Indent(); PowerRail.LogicLevel = false; TestTable.SetValue(0, (short)1); TestTable.SetValue(1, (short)1); Assert.IsFalse(les.Execute()); TestTable.SetValue(0, (short)0); TestTable.SetValue(1, (short)1); Assert.IsFalse(les.Execute()); TestTable.SetValue(0, (short)1); TestTable.SetValue(1, (short)0); Assert.IsFalse(les.Execute()); Trace.Unindent(); Trace.WriteLine("Input True", "LES"); Trace.Indent(); PowerRail.LogicLevel = true; TestTable.SetValue(0, (short)1); TestTable.SetValue(1, (short)1); Assert.IsFalse(les.Execute()); TestTable.SetValue(0, (short)0); TestTable.SetValue(1, (short)1); Assert.IsTrue(les.Execute()); TestTable.SetValue(0, (short)1); TestTable.SetValue(1, (short)0); Assert.IsFalse(les.Execute()); Trace.Unindent(); Trace.Unindent(); #endregion LES #region NEQ Trace.WriteLine("NEQ", "Unit Test"); Trace.Indent(); Trace.WriteLine("Input False", "NEQ"); Trace.Indent(); PowerRail.LogicLevel = false; TestTable.SetValue(0, (short)1); TestTable.SetValue(1, (short)1); Assert.IsFalse(neq.Execute()); TestTable.SetValue(0, (short)0); TestTable.SetValue(1, (short)1); Assert.IsFalse(neq.Execute()); TestTable.SetValue(0, (short)1); TestTable.SetValue(1, (short)0); Assert.IsFalse(neq.Execute()); Trace.Unindent(); Trace.WriteLine("Input True", "NEQ"); Trace.Indent(); PowerRail.LogicLevel = true; TestTable.SetValue(0, (short)1); TestTable.SetValue(1, (short)1); Assert.IsFalse(neq.Execute()); TestTable.SetValue(0, (short)0); TestTable.SetValue(1, (short)1); Assert.IsTrue(neq.Execute()); TestTable.SetValue(0, (short)1); TestTable.SetValue(1, (short)0); Assert.IsTrue(neq.Execute()); Trace.Unindent(); Trace.Unindent(); #endregion NEQ }