internal static void WriteDataTable(LadderDataTable dataTable, XmlWriter writer) { Trace.WriteLine("Data Table Started", "DiagramWriter"); Trace.Indent(); writer.WriteStartElement("DataTable"); writer.WriteStartAttribute("Count"); writer.WriteValue(dataTable.Count); writer.WriteEndAttribute(); #region Variable Loop //Write every variable in table to file. //Tag name is the variable type without the "System." prefix foreach (var variable in dataTable.ListAllData()) { string type = variable.Item2.ToString().Replace("System.", string.Empty); writer.WriteStartElement(type); writer.WriteStartAttribute("Name"); writer.WriteValue(variable.Item1); writer.WriteEndAttribute(); //So far not needed //writer.WriteStartAttribute("Class"); //writer.WriteValue(variable.Item3.ToString()); //writer.WriteEndAttribute(); if (variable.Item3 != LDVarClass.OutFunction && variable.Item3 != LDVarClass.OutFunction) { writer.WriteStartAttribute("Value"); writer.WriteValue(variable.Item4); writer.WriteEndAttribute(); } else { writer.WriteString((string)variable.Item4); } writer.WriteEndElement(); Trace.WriteLine("Written: " + type + ", Name=" + variable.Item1 + ", Value=" + variable.Item4, "DataTable"); } #endregion Variable Loop writer.WriteEndElement();//Data table end Trace.Unindent(); Trace.WriteLine("Data Table Ended", "DiagramWriter"); }
/// <summary> /// Generate code from data table variables /// </summary> /// <param name="table"></param> /// <param name="codeBuffer"></param> internal static void CompileDataTable(LadderDataTable table, CompilerBuffer codeBuffer) { List <Tuple <string, Type, LDVarClass, object> > tuples = table.ListAllData().OrderBy(x => x.Item1).ToList(); codeBuffer.Globals.Add("//Inputs"); StringBuilder inputList = new StringBuilder(); foreach (var tuple in tuples.Where(x => x.Item3 == LDVarClass.Input)) { codeBuffer.Globals.Add("boolean " + tuple.Item1 + ";"); } codeBuffer.Globals.Add(string.Empty); codeBuffer.Globals.Add("//Outputs"); foreach (var tuple in tuples.Where(x => x.Item3 == LDVarClass.Output)) { codeBuffer.Globals.Add("boolean " + tuple.Item1 + ";"); } codeBuffer.Globals.Add(string.Empty); codeBuffer.Globals.Add("//Data"); foreach (var tuple in tuples.Where(x => x.Item3 == LDVarClass.Data)) { switch (tuple.Item2.ToString().Replace("System.", string.Empty)) { case "Boolean": codeBuffer.Globals.Add("boolean " + tuple.Item1 + " = " + (((bool)tuple.Item4) ? "true;" : "false;")); break; case "Int16": codeBuffer.Globals.Add("int " + tuple.Item1 + " = " + tuple.Item4.ToString() + ";"); break; case "Byte": codeBuffer.Globals.Add("byte " + tuple.Item1 + " = " + tuple.Item4.ToString() + ";"); break; default: throw new FormatException("Unrecognized variable type in data table"); } } foreach (var tuple in tuples.Where(x => x.Item3 == LDVarClass.InFunction)) { List <string> buffer = new List <string>(); buffer.Add("boolean " + tuple.Item1 + "(boolean input)"); buffer.Add("{"); foreach (string line in tuple.Item4.ToString().Split('\n')) { buffer.Add(INDENT + line); } buffer.Add("}"); codeBuffer.Functions.Add(buffer); } foreach (var tuple in tuples.Where(x => x.Item3 == LDVarClass.OutFunction)) { List <string> buffer = new List <string>(); buffer.Add("void " + tuple.Item1 + "()"); buffer.Add("{"); foreach (string line in tuple.Item4.ToString().Split('\n')) { buffer.Add(INDENT + line); } buffer.Add("}"); codeBuffer.Functions.Add(buffer); } }