diff --git a/CMS_CORE_Application/Form1.cs b/CMS_CORE_Application/Form1.cs index f7ad1c7..224014b 100644 --- a/CMS_CORE_Application/Form1.cs +++ b/CMS_CORE_Application/Form1.cs @@ -87,15 +87,17 @@ namespace CMS_CORE_Application List tools = new List(); SiemensToolModel newTool = new SiemensToolModel() { - FamilyName = "nuovo nome", + FamilyName = "nuovo nome2", ChildId = 1, + Id = 6, MagazinePositionType = 1, ToolType = 110, LeftSize = 1, RightSize = 1, - Rotation = (ROTATION)0, - Cooling1 = false, - Cooling2 = true, + Rotation = ROTATION.CLOCKWHISE, + LifeType = SIEMENS_LIFE_TYPE.COUNT, + Cooling1 = true, + Cooling2 = false, IsActive = true, InFixedPlace = true, IsInhibited = true, @@ -219,7 +221,7 @@ namespace CMS_CORE_Application cmsError = N.TOOLS_RConfiguration(ref toolsConfig); // cmsError = N.TOOLS_WAddEdge(1, ref edge); // cmsError = N.TOOLS_WUpdateEdge(1, ref newEdge); - + cmsError = N.TOOLS_WUpdateTool(newTool); cmsError = N.TOOLS_RMagazineTools(1, ref magazine); cmsError = N.TOOLS_RAvailableTools(ref multiTools, ref tools); cmsError = N.TOOLS_WUpdateMagazineTools(1, newMagazine); diff --git a/CMS_CORE_Library/DataStructures.cs b/CMS_CORE_Library/DataStructures.cs index 898684e..bad8525 100644 --- a/CMS_CORE_Library/DataStructures.cs +++ b/CMS_CORE_Library/DataStructures.cs @@ -535,19 +535,19 @@ namespace CMS_CORE_Library public class MagazineAndToolModel { - public int Id; + public int PositionId; public int MagazineId; public int Type; } public class PositionWithMultiToolModel : MagazineAndToolModel { - public MountedMultiToolModel ShankData; + public MountedMultiToolModel ChildShank; } public class PositionWithToolModel : MagazineAndToolModel { - public MountedToolModel Child; + public MountedToolModel ChildTool; } public class MountedMultiToolModel diff --git a/CMS_CORE_Library/Demo/Nc_Demo.cs b/CMS_CORE_Library/Demo/Nc_Demo.cs index 735a4eb..fc566b9 100644 --- a/CMS_CORE_Library/Demo/Nc_Demo.cs +++ b/CMS_CORE_Library/Demo/Nc_Demo.cs @@ -2201,10 +2201,10 @@ namespace CMS_CORE.Demo // Create Tool Model PositionWithToolModel pos = new PositionWithToolModel() { - Id = demoPos.Id, + PositionId = demoPos.Id, Type = demoPos.Type, MagazineId = magazineId, - Child = new MountedToolModel + ChildTool = new MountedToolModel { Id = demoPos.ChildTools.Id, FamilyName = demoPos.ChildTools.FamilyName, @@ -2231,10 +2231,10 @@ namespace CMS_CORE.Demo // Create multi tool model PositionWithMultiToolModel pos = new PositionWithMultiToolModel() { - Id = demoPos.Id, + PositionId = demoPos.Id, Type = demoPos.Type, MagazineId = magazineId, - ShankData = new MountedMultiToolModel() + ChildShank = new MountedMultiToolModel() { Id = demoPos.Shank.Id, Name = demoPos.Shank.Name, diff --git a/CMS_CORE_Library/Siemens/Nc_Siemens.cs b/CMS_CORE_Library/Siemens/Nc_Siemens.cs index 9ebe02c..cbf1fec 100644 --- a/CMS_CORE_Library/Siemens/Nc_Siemens.cs +++ b/CMS_CORE_Library/Siemens/Nc_Siemens.cs @@ -36,21 +36,26 @@ namespace CMS_CORE.Siemens private const int IDMaxChannel = 19999; // Siemens Path Constants - private const string PathMaxChannelNo = "/Nck/Configuration/maxnumChannels"; + private const string MAX_CHANNEL_NO_PATH = "/Nck/Configuration/maxnumChannels"; - private const string PathConfChannelNo = "/Nck/Configuration/numChannels"; - private const string PathNcType = "/Nck/Configuration/nckType"; - private const string PathNcVersion = "/Nck/Configuration/nckVersion"; - private const string PathLanguage = "/Nck/Configuration/anLanguageOnHmi"; - private const string PathSerialNumber = "/Nck/State/hwProductSerialNrL"; - private const string PathNcTime = "/Nck/State/sysTimeBCD"; - private const string PathGenericNcMode = "/Bag/State/opMode"; - private const string PathGenericNcState = "/Channel/State/chanStatus"; - private const string PathIncrJog = "/Channel/GeometricAxis/actIncrVal"; - private const string PathAdvancedJog = "/Channel/State/machFunc"; - private const string PathRelatPosition = "/Channel/GeometricAxis/actToolBasPosEN"; - private const string PathActProgLines = "/Channel/ProgramInfo/actPartProgram"; - private const string PathActProgName = "/Channel/ProgramPointer/progName"; + private const string CONF_CHANNEL_NO_PATH = "/Nck/Configuration/numChannels"; + private const string NC_TYPE_PATH = "/Nck/Configuration/nckType"; + private const string NC_VERSION_PATH = "/Nck/Configuration/nckVersion"; + private const string LANGUAGE_PATH = "/Nck/Configuration/anLanguageOnHmi"; + private const string SERIAL_NO_PATH = "/Nck/State/hwProductSerialNrL"; + private const string NC_TIME_PATH = "/Nck/State/sysTimeBCD"; + private const string NC_GENERIC_MODE_PATH = "/Bag/State/opMode"; + private const string NC_GENERIC_STATE_PATH = "/Channel/State/chanStatus"; + private const string JOG_INCR_PATH = "/Channel/GeometricAxis/actIncrVal"; + private const string ADVANCED_JOG_PATH = "/Channel/State/machFunc"; + private const string RELATIVE_POS_PATH = "/Channel/GeometricAxis/actToolBasPosEN"; + private const string ACT_PROG_LINES_PATH = "/Channel/ProgramInfo/actPartProgram"; + private const string ACT_PROG_NAME_PATH = "/Channel/ProgramPointer/progName"; + + // TOOLS + private const string NC_TOOL_FILE_PATH = "//NC/ACT.DIR/TO.DIR/TO_INI.INI"; + + private const string LOCALE_TOOL_FILE_PATH = "C:\\TO_INI.INI"; // Global Variables private DateTime Last_Static_Read; @@ -73,8 +78,12 @@ namespace CMS_CORE.Siemens private Guid ToolMngmtListGuid = Guid.Empty; + // Magazine config parameters private int MAX_TOOL_NUMER; - private int MAX_EDGE_PER_TOOL; + private int MAX_EDGES_PER_TOOL; + private int MAX_TOOLS_PER_FAMILY; + private int MAX_MULTITOOLS_NUMBER; + private int MAX_TOOLS_PER_MULTITOOLS; private Alarm[] SiemensAlarms; @@ -305,7 +314,7 @@ namespace CMS_CORE.Siemens DataSvc Data = new DataSvc(); Data.Timeout = TimeoutConn; Data.PriorityFlag = SlPriority.lowPriority; - Item ReadItem = new Item(PathNcTime); + Item ReadItem = new Item(NC_TIME_PATH); //Read Data Data.Read(ReadItem); @@ -828,9 +837,9 @@ namespace CMS_CORE.Siemens DataSvc Data = new DataSvc(); Data.Timeout = TimeoutConn; Data.PriorityFlag = SlPriority.highPriority; - Item ReadItem = new Item(PathGenericNcMode + "[u" + ProcNumber + "]"); - Item ReadItemIncr = new Item(PathIncrJog + "[u" + ProcNumber + "]"); - Item ReadItemAdv = new Item(PathAdvancedJog + "[u" + ProcNumber + "]"); + Item ReadItem = new Item(NC_GENERIC_MODE_PATH + "[u" + ProcNumber + "]"); + Item ReadItemIncr = new Item(JOG_INCR_PATH + "[u" + ProcNumber + "]"); + Item ReadItemAdv = new Item(ADVANCED_JOG_PATH + "[u" + ProcNumber + "]"); //Read Data Data.Read(ReadItem); @@ -863,7 +872,7 @@ namespace CMS_CORE.Siemens DataSvc Data = new DataSvc(); Data.Timeout = TimeoutConn; Data.PriorityFlag = SlPriority.highPriority; - Item ReadItem = new Item(PathGenericNcState + "[u" + ProcNumber + "]"); + Item ReadItem = new Item(NC_GENERIC_STATE_PATH + "[u" + ProcNumber + "]"); //Read Data Data.Read(ReadItem); @@ -895,7 +904,7 @@ namespace CMS_CORE.Siemens DataSvc Data = new DataSvc(); Data.Timeout = TimeoutConn; Data.PriorityFlag = SlPriority.highPriority; - Item ReadItem = new Item(PathActProgLines + "[u" + ProcNumber + "]"); + Item ReadItem = new Item(ACT_PROG_LINES_PATH + "[u" + ProcNumber + "]"); //Read Data Data.Read(ReadItem); @@ -938,7 +947,7 @@ namespace CMS_CORE.Siemens DataSvc Data = new DataSvc(); Data.Timeout = TimeoutConn; Data.PriorityFlag = SlPriority.highPriority; - Item ReadItem = new Item(PathActProgName + "[u" + ProcNumber + "]"); + Item ReadItem = new Item(ACT_PROG_NAME_PATH + "[u" + ProcNumber + "]"); //Read Data Data.Read(ReadItem); @@ -1792,21 +1801,49 @@ namespace CMS_CORE.Siemens return NO_ERROR; } + private string[] ReadToolTableFile() + { + // Create a configuration file + FileStream f = new FileStream(LOCALE_TOOL_FILE_PATH, FileMode.Create); + // Read siemens configuration file + FILES_RProgramToFile(NC_TOOL_FILE_PATH, f); + f.Close(); + return File.ReadAllLines(LOCALE_TOOL_FILE_PATH); + } + private void PopulateToolTable() { DataSvc dataSvc = new DataSvc(); + // Read max tool number Item itemToRead = new Item("/NC/_N_NC_TEA_ACX/$MN_MM_NUM_TOOL"); - dataSvc.Read(itemToRead); - MAX_TOOL_NUMER = (int)itemToRead.Value; - string[] toolsStrings = ReadToolTableFile(); - Stopwatch sw = new Stopwatch(); - sw.Start(); - CreateToolsFromFile(toolsStrings); + // Read max edge per tool number + itemToRead = new Item("/NC/_N_NC_TEA_ACX/$MN_MM_MAX_CUTTING_EDGE_PERTOOL"); + dataSvc.Read(itemToRead); + MAX_EDGES_PER_TOOL = (int)itemToRead.Value; - Console.WriteLine("TEMPO " + sw.ElapsedMilliseconds); + // Read max tools per family + itemToRead = new Item("/NC/_N_NC_TEA_ACX/$MN_MAXNUM_REPLACEMENT_TOOLS"); + dataSvc.Read(itemToRead); + MAX_TOOLS_PER_FAMILY = (int)itemToRead.Value; + + // Read max multitools number + itemToRead = new Item("/NC/_N_NC_TEA_ACX/$MN_MM_NUM_MULTITOOL"); + dataSvc.Read(itemToRead); + MAX_MULTITOOLS_NUMBER = (int)itemToRead.Value; + + // Read max tools per multitools + itemToRead = new Item("/NC/_N_NC_TEA_ACX/$MN_MAX_TOOLS_PER_MULTITOOL"); + dataSvc.Read(itemToRead); + MAX_TOOLS_PER_MULTITOOLS = (int)itemToRead.Value; + + + // Read file + string[] toolsStrings = ReadToolTableFile(); + // Parse file + CreateToolsFromFileStrings(toolsStrings); //for (int i = 1; i < MAX_TOOL_NUMER; i++) //{ @@ -1816,16 +1853,6 @@ namespace CMS_CORE.Siemens //} } - private string[] ReadToolTableFile() - { - // Create a configuration file - FileStream f = new FileStream("C:\\TO_INI.INI", FileMode.Create); - // Read siemens configuration file - FILES_RProgramToFile("//NC/ACT.DIR/TO.DIR/TO_INI.INI", f); - f.Close(); - return File.ReadAllLines("C:\\TO_INI.INI"); - } - private void TOOLS_UpdateToolsData(Guid guid, ToolInfo[] toolInfos) { try @@ -1893,7 +1920,7 @@ namespace CMS_CORE.Siemens return NO_ERROR; } - private void CreateToolsFromFile(string[] toolsStrings) + private void CreateToolsFromFileStrings(string[] toolsStrings) { SiemensEdgesConfiguration toolEdgesConfig = new SiemensEdgesConfiguration(); @@ -1959,22 +1986,18 @@ namespace CMS_CORE.Siemens ToolTableData[toolIndex].RightSize = Convert.ToByte(actualString.Split('=').LastOrDefault()); } break; + case "$TC_TP7": { ToolTableData[toolIndex].MagazinePositionType = Convert.ToInt32(actualString.Split('=').LastOrDefault()); } break; - case "$TC_TP9": - { - ToolTableData[toolIndex].LifeType = (SIEMENS_LIFE_TYPE)Convert.ToInt32(actualString.Split('=').LastOrDefault()); - } - break; case "$TC_TP8": { // Get tool status byte toolStatus = Convert.ToByte(actualString.Split('=').LastOrDefault()); - + ToolTableData[toolIndex].IsActive = GetBitValue(toolStatus, 1); ToolTableData[toolIndex].InFixedPlace = GetBitValue(toolStatus, 2); ToolTableData[toolIndex].IsInhibited = GetBitValue(toolStatus, 3); @@ -1986,6 +2009,12 @@ namespace CMS_CORE.Siemens } break; + case "$TC_TP9": + { + ToolTableData[toolIndex].LifeType = (SIEMENS_LIFE_TYPE)Convert.ToInt32(actualString.Split('=').LastOrDefault()); + } + break; + case "$TC_TP25": { // Get tool general information @@ -2004,19 +2033,22 @@ namespace CMS_CORE.Siemens ToolTableData[toolIndex].Rotation = rotation; } break; + case "$TC_MTPN": { // Insert new multitool - Multitools.Add(new ShankModel() { Id = firstId }); + Multitools.Add(new ShankModel() { Id = firstId }); // Update Index multitoolIndex = Multitools.Count - 1; } break; + case "$TC_MTP2": { Multitools[multitoolIndex].Name = actualString.Split('=').LastOrDefault().Replace("\"", ""); } break; + case "$TC_MTP3": { Multitools[multitoolIndex].LeftSize = Convert.ToByte(actualString.Split('=').LastOrDefault()); @@ -2028,11 +2060,13 @@ namespace CMS_CORE.Siemens Multitools[multitoolIndex].RightSize = Convert.ToByte(actualString.Split('=').LastOrDefault()); } break; + case "$TC_MTP7": { Multitools[multitoolIndex].MagazinePositionType = Convert.ToInt32(actualString.Split('=').LastOrDefault()); } break; + case "$TC_MTP8": { // Get tool status @@ -2136,6 +2170,7 @@ namespace CMS_CORE.Siemens } } break; + case "$TC_DP2": case "$TC_DP3": case "$TC_DP4": @@ -2181,6 +2216,7 @@ namespace CMS_CORE.Siemens } } break; + case "$TC_MPP1": { MagazinePositions.Add(new PositionsModel() @@ -2191,6 +2227,7 @@ namespace CMS_CORE.Siemens }); } break; + case "$TC_MPP6": { int toolId = Convert.ToInt32(actualString.Split('=').LastOrDefault()); @@ -2198,15 +2235,17 @@ namespace CMS_CORE.Siemens { // Find tool by id SiemensToolModel tool = ToolTableData.Where(x => x.Id == toolId).FirstOrDefault(); + // Find position by id PositionsModel position = MagazinePositions.Where(x => x.MagazineId == firstId && x.Id == secondId).FirstOrDefault(); if (tool != null) { + // Add new Magazine-Tool MagazineAndTools.Add(new PositionWithToolModel() { - Id = secondId, + PositionId = secondId, MagazineId = firstId, Type = position.Type, - Child = new MountedToolModel() + ChildTool = new MountedToolModel() { Id = tool.Id, FamilyName = tool.FamilyName, @@ -2216,15 +2255,17 @@ namespace CMS_CORE.Siemens } else { + // Find shank by id ShankModel shank = Multitools.Where(x => x.Id == toolId).FirstOrDefault(); if (shank != null) { + // Add new Magazine-Multitool MagazineAndTools.Add(new PositionWithMultiToolModel() { - Id = secondId, + PositionId = secondId, MagazineId = firstId, Type = position.Type, - ShankData = new MountedMultiToolModel() + ChildShank = new MountedMultiToolModel() { Id = shank.Id, Name = shank.Name, @@ -2236,14 +2277,16 @@ namespace CMS_CORE.Siemens } } break; + case "$TC_MTPP6": { + // Find tool by id int toolId = Convert.ToInt32(actualString.Split('=').LastOrDefault()); - if (toolId != 0) { // Find tool by id SiemensToolModel tool = ToolTableData.Where(x => x.Id == toolId).First(); + // Add new multitool child Multitools[multitoolIndex].ChildsTools.Add(new ShankChildModel() { Id = toolId, @@ -2267,18 +2310,19 @@ namespace CMS_CORE.Siemens if (!String.IsNullOrWhiteSpace(text)) { - // Get + // Get indexes from string int startingData = text.IndexOf("[", StringComparison.Ordinal) + 1; int secondData = text.IndexOf(",", StringComparison.Ordinal) + 1; int endingData = text.IndexOf("]", StringComparison.Ordinal); - + // If the string is matching with the pattern STRING[N]=N or STRING[N,M]=N if (startingData > 0 && endingData > 0) + // STRING[N,M]=N case if (secondData > 0) { toolId = Convert.ToInt32(text.Substring(startingData, secondData - (startingData + 1))); edgeId = Convert.ToInt32(text.Substring(secondData, endingData - (secondData))); } - else + else // STRING[N]=N case { toolId = Convert.ToInt32(text.Substring(startingData, endingData - (startingData))); edgeId = 0; @@ -2288,14 +2332,14 @@ namespace CMS_CORE.Siemens public static string GetUntilOrEmpty(string text, string stopAt = "[") { + // Get string unti if (!String.IsNullOrWhiteSpace(text)) { + // Find character index int charLocation = text.IndexOf(stopAt, StringComparison.Ordinal); if (charLocation > 0) - { return text.Substring(0, charLocation); - } } return String.Empty; @@ -2326,7 +2370,7 @@ namespace CMS_CORE.Siemens { Id = toolId, ChildId = Convert.ToInt32(toolsStrings.FirstOrDefault(x => x.StartsWith("$TC_TP1[" + toolId)).Split('=').LastOrDefault()), - FamilyName = toolsStrings.FirstOrDefault(x => x.Contains("$TC_TP2[" + toolId)).Split('=').LastOrDefault(), + FamilyName = toolsStrings.FirstOrDefault(x => x.Contains("$TC_TP2[" + toolId)).Split('=').LastOrDefault().Replace("\"", ""), LeftSize = Convert.ToByte(toolsStrings.FirstOrDefault(X => X.StartsWith("$TC_TP3[" + toolId)).Split('=').LastOrDefault()), RightSize = Convert.ToByte(toolsStrings.FirstOrDefault(X => X.StartsWith("$TC_TP4[" + toolId)).Split('=').LastOrDefault()), Rotation = rotation, @@ -2481,6 +2525,81 @@ namespace CMS_CORE.Siemens public override CmsError TOOLS_WUpdateTool(SiemensToolModel tool) { + try + { + Stopwatch sw = new Stopwatch(); + sw.Start(); + + // TC_TP2 + DataSvc dataSvc = new DataSvc(); + Item item = new Item("/Tool/Data/toolIdent[" + tool.Id + "]") { Value = tool.FamilyName }; + dataSvc.Write(item); + + // TC_TP3 + item = new Item() { Path = "/Tool/Data/toolsize_left[" + tool.Id + "]", Value = tool.LeftSize }; + dataSvc.Write(item); + + // TC_TP4 + item = new Item() { Path = "/Tool/Data/toolsize_right[" + tool.Id + "]", Value = tool.RightSize }; + dataSvc.Write(item); + + // TC_TP7 + item = new Item() { Path = "/Tool/Data/toolplace_spec[" + tool.Id + "]", Value = tool.MagazinePositionType }; + dataSvc.Write(item); + + // TC_TP8 + BitArray bitArray = new BitArray(new bool[] { tool.IsActive, tool.IsEnabled, tool.IsInhibited, tool.IsMeasured, tool.PreAlarm, tool.InChangeTool, tool.InFixedPlace, tool.IsInUse }); + int[] array = new int[1]; + bitArray.CopyTo(array, 0); + + item = new Item() { Path = "/Tool/Data/toolStateL[" + tool.Id + "]", Value = array[0] }; + dataSvc.Write(item); + + // TC_TP9 + item = new Item() { Path = "/Tool/Data/toolMon[" + tool.Id + "]", Value = (int)tool.LifeType, }; + dataSvc.Write(item); + + // TC_DP25 + item = new Item("/Tool/Compensation/edgeData[c" + tool.Id + ",25]"); + dataSvc.Read(item); + int val = Convert.ToInt32(item.Value); + + bool clockwhise = false; + bool counterClockwhise = false; + + // Convert rotation data + switch (tool.Rotation) + { + case ROTATION.CLOCKWHISE: + clockwhise = true; + counterClockwhise = false; + break; + + case ROTATION.COUNTERCLOCKWHISE: + clockwhise = false; + counterClockwhise = true; + break; + + default: + clockwhise = false; + counterClockwhise = false; + break; + } + + val = SetBitValue(val, clockwhise, 9); + val = SetBitValue(val, counterClockwhise, 10); + + val = SetBitValue(val, tool.Cooling1, 11); + val = SetBitValue(val, tool.Cooling2, 12); + + item.Value = val; + dataSvc.Write(item); + Console.WriteLine("TEMPO UPDATE:" + sw.ElapsedMilliseconds); + } + catch (Exception ex) + { + return ManageException(ex); + } return NO_ERROR; } @@ -2547,7 +2666,7 @@ namespace CMS_CORE.Siemens #region Subordinate Private Functions - //Manage the Alarms - Called automatically on changes + // Manage the Alarms - Called automatically on changes private void AlarmsChanged(Guid guid, Alarm[] alarms) { SiemensAlarms = alarms; @@ -2563,6 +2682,14 @@ namespace CMS_CORE.Siemens return (b & (1 << bitNumber - 1)) != 0; } + private int SetBitValue(int intVal, bool val, int bitIndex) + { + if (val) + return intVal | (1 << (bitIndex - 1)); + else + return intVal & ~(1 << (bitIndex - 1)); + } + //Manage the Mode private PROC_MODE ConvertToSTEPMode(uint mode, uint JogMode, uint AdvMode) { @@ -2687,12 +2814,12 @@ namespace CMS_CORE.Siemens DataSvc ReadStaticData = new DataSvc(); ReadStaticData.Timeout = TimeoutConn; ReadStaticData.PriorityFlag = SlPriority.defaultPriority; - Item ItemNcType = new Item(PathNcType); - Item ItemNcVersion = new Item(PathNcVersion); - Item ItemMaxChannelNo = new Item(PathMaxChannelNo); - Item ItemConfChannelNo = new Item(PathConfChannelNo); - Item ItemLanguage = new Item(PathLanguage); - Item ItemSerialNumber = new Item(PathSerialNumber); + Item ItemNcType = new Item(NC_TYPE_PATH); + Item ItemNcVersion = new Item(NC_VERSION_PATH); + Item ItemMaxChannelNo = new Item(MAX_CHANNEL_NO_PATH); + Item ItemConfChannelNo = new Item(CONF_CHANNEL_NO_PATH); + Item ItemLanguage = new Item(LANGUAGE_PATH); + Item ItemSerialNumber = new Item(SERIAL_NO_PATH); cmsError = ConvertMemToPath(MATR_MACCH_SIEMENS.MemType, MATR_MACCH_SIEMENS.Address, MATR_MACCH_SIEMENS.SubAddress, 0, 1, 'W', out string itemString); if (cmsError.IsError()) diff --git a/CMS_CORE_Library/ToolConfigurations.cs b/CMS_CORE_Library/ToolConfigurations.cs index 0af5771..3f31cc1 100644 --- a/CMS_CORE_Library/ToolConfigurations.cs +++ b/CMS_CORE_Library/ToolConfigurations.cs @@ -72,7 +72,7 @@ namespace CMS_CORE_Library new FieldsConfiguration{Name = "id", Type = "int", SelectValues = null, Category = "general", ReadOnly = true }, new FieldsConfiguration{Name = "toolType", Type = "select", SelectValues = toolTypeList, Category = "general", ReadOnly = false}, new FieldsConfiguration{Name = "lifeType", Type="select", SelectValues = toolLifeList, Category = "general", ReadOnly = false}, - new FieldsConfiguration{Name = "familyName", Type = "string", SelectValues = null, Category = "family", ReadOnly = true }, + new FieldsConfiguration{Name = "familyName", Type = "string", SelectValues = null, Category = "family", ReadOnly = false }, new FieldsConfiguration{Name = "childId", Type = "int", SelectValues = null, Category = "family", ReadOnly = true }, new FieldsConfiguration{Name = "isEnabled", Type = "boolean", SelectValues = null, Category = "state", ReadOnly = false}, new FieldsConfiguration{Name = "isActive", Type = "boolean", SelectValues = null, Category = "state", ReadOnly = false},