diff --git a/CMS_CORE_Application/Form1.cs b/CMS_CORE_Application/Form1.cs index e0f01e1..feb8a45 100644 --- a/CMS_CORE_Application/Form1.cs +++ b/CMS_CORE_Application/Form1.cs @@ -210,7 +210,7 @@ namespace CMS_CORE_Application SetError(Lines, cmsError); } - // cmsError = N.TOOLS_WAddShank(ref newShank); + cmsError = N.TOOLS_WAddShank(ref newShank); // cmsError = N.TOOLS_WDeleteShank(4); //cmsError = N.TOOLS_WUpdateEdge(1, ref newEdge); // List a = null; @@ -234,11 +234,11 @@ namespace CMS_CORE_Application //cmsError = N.TOOLS_RShanksData(ref shanks); //cmsError = N.TOOLS_RFamilyData(ref famiies); //cmsError = N.TOOLS_RMagazinePositions(ref positions); - cmsError = N.TOOLS_WAddTool(ref newTool); + // cmsError = N.TOOLS_WAddTool(ref newTool); //ShankModel shank = new ShankModel(); - newShank.Name = newShank.Name + "1"; - cmsError = N.TOOLS_WAddShank(ref newShank); + // newShank.Name = newShank.Name + "1"; + // cmsError = N.TOOLS_WAddShank(ref newShank); //FamilyModel family = new FamilyModel //{ // Name = "Da demo" diff --git a/CMS_CORE_Library/DataStructures.cs b/CMS_CORE_Library/DataStructures.cs index c205d55..318e61a 100644 --- a/CMS_CORE_Library/DataStructures.cs +++ b/CMS_CORE_Library/DataStructures.cs @@ -653,6 +653,8 @@ namespace CMS_CORE_Library public int MaxMultitools; public int MaxToolsPerMultitools; + public bool MultitoolOptionActive; + public List Magazines; public List ToolsConfiguration; public FamiliesConfiguration FamiliesConfiguration; diff --git a/CMS_CORE_Library/Siemens/Nc_Siemens.cs b/CMS_CORE_Library/Siemens/Nc_Siemens.cs index 8eeef2c..f104ab7 100644 --- a/CMS_CORE_Library/Siemens/Nc_Siemens.cs +++ b/CMS_CORE_Library/Siemens/Nc_Siemens.cs @@ -88,6 +88,9 @@ namespace CMS_CORE.Siemens private static int MAX_MULTITOOLS_NUMBER; private static int MAX_TOOLS_PER_MULTITOOL; + private static bool LIFE_OPTION_ACTIVE; + private static bool MULTITOOL_OPTION_ACTIVE; + private Alarm[] SiemensAlarms; private static string PlcMessagesFilePath = "C:\\Program Files (x86)\\Siemens\\MotionControl\\oem\\sinumerik\\hmi\\lng\\"; @@ -97,13 +100,14 @@ namespace CMS_CORE.Siemens // Tool table static data private static List ToolTableData = new List(); - private static List MagazinePositionsData = new List(); private static List MultitoolsData = new List(); private static List MagazineMountedTools = new List(); public static List FamiliesData = new List(); public static MagazineActionModel MagazineAction = new MagazineActionModel(); + public static uint multitoolsNumber = 0; + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #region Contructor & global methods @@ -207,10 +211,20 @@ namespace CMS_CORE.Siemens MAX_TOOLS_PER_MULTITOOL = (int)itemToRead.Value; // Read file string[] toolsStrings = ReadToolTableFile(); + + // Read options from NC + itemToRead = new Item("/NC/_N_NC_TEA_ACX/$MN_MM_TOOL_MANAGEMENT_MASK"); + dataSvc.Read(itemToRead); + MULTITOOL_OPTION_ACTIVE = GetBitValue(Convert.ToInt32(itemToRead.Value), 11); + LIFE_OPTION_ACTIVE = GetBitValue(Convert.ToInt32(itemToRead.Value), 6); + // If not active remove fields from config + if (!LIFE_OPTION_ACTIVE) + RemoveLifeParamsFromConfig(); + // Parse file PopulateToolsTableFromFileStrings(toolsStrings); - // Setup magazine positions update listener + // Setup magazine positions listener List magPosItems = new List(); foreach (var position in MagazinePositionsData) { @@ -221,6 +235,7 @@ namespace CMS_CORE.Siemens SymbolicName = position.MagazineId + "_" + position.PositionId }); } + // Subscribe MagazinePositionSvc.Subscribe(MagazinePositionEnabled_OnChange, magPosItems.ToArray()); @@ -230,6 +245,42 @@ namespace CMS_CORE.Siemens Path = "DB71.DBB0" }; MagazineActionsSvc.Subscribe(MagazineAction_OnChange, magActionsItem); + + DataSvc d = new DataSvc(); + Item i = new Item() { Path = "/Tool/MTCatalogue/numMultiTools[u1]" }; + d.Subscribe(MultitoolsNumber_OnChange, i); + } + + private void MultitoolsNumber_OnChange(Guid guid, Item item, DataSvcStatus status) + { + // Check if an element has been deleted + if((uint)item.Value < multitoolsNumber) + { + // for each saved multitool + for (int i = 0; i < MultitoolsData.Count; i++) + { + try + { + // Check if exists + Item toolData = new Item(string.Format("/Tool/MT/multitoolMyPlace[u1, {0}]", MultitoolsData[i].Id)); + DataSvc dataSvc = new DataSvc(); + dataSvc.Read(toolData); + } + catch (Exception ex) + { + // Remove from list + MultitoolsData.RemoveAt(i); + } + } + } + // Update multitool counter + multitoolsNumber = (uint)item.Value; + } + + private void RemoveLifeParamsFromConfig() + { + SiemensToolFieldsConfig.RemoveAll(x => x.Category == "life"); + SiemensEdgesFieldsConfiguration.EdgeConfiguration.RemoveAll(x => x.Category == "life"); } public override CmsError NC_GetTranslatedPlcMessages(string language, ref Dictionary messages) @@ -1819,12 +1870,15 @@ namespace CMS_CORE.Siemens public override CmsError TOOLS_RConfiguration(ref ToolTableConfiguration config) { + // Set limits config.MaxTools = MAX_TOOL_NUMER; config.MaxEdgesPerTools = MAX_EDGES_PER_TOOL; config.MaxToolsPerFamily = MAX_TOOLS_PER_FAMILY; config.MaxMultitools = MAX_MULTITOOLS_NUMBER; config.MaxToolsPerMultitools = MAX_TOOLS_PER_MULTITOOL; - + // Set options + config.MultitoolOptionActive = MULTITOOL_OPTION_ACTIVE; + // Set fields configurations config.ToolsConfiguration = SiemensToolFieldsConfig; config.FamiliesConfiguration = SiemensFamilyFieldsConfig; config.ShanksConfiguration = SiemensShankFieldsConfig; @@ -1977,8 +2031,6 @@ namespace CMS_CORE.Siemens new Item() { Path = "/Tool/Data/toolplace_spec[" + tool.Id + "]", Value = tool.MagazinePositionType }, // TC_TP8 new Item() { Path = "/Tool/Data/toolStateL[" + tool.Id + "]", Value = array[0] }, - // TC_TP9 - new Item() { Path = "/Tool/Data/toolMon[" + tool.Id + "]", Value = (int)tool.LifeType, }, // TC_DP1 new Item() { Path = "/Tool/Compensation/edgeData[c" + tool.Id + ",1]", Value = tool.ToolType }, // TC_DP25 @@ -1989,6 +2041,9 @@ namespace CMS_CORE.Siemens new Item() { Path = "/Tool/Data/toolMaxAcc[" + tool.Id + "]", Value = tool.MaxAcceleration } }; + if (LIFE_OPTION_ACTIVE) // TC_TP9 + items.Add(new Item() { Path = "/Tool/Data/toolMon[" + tool.Id + "]", Value = (int)tool.LifeType }); + dataSvc.Write(items.ToArray()); Item childId = new Item() { Path = "/Tool/Data/duploNo[" + tool.Id + "]" }; @@ -2061,6 +2116,7 @@ namespace CMS_CORE.Siemens return INCORRECT_PARAMETERS_ERROR; //if (shank.MaxChilds > MAX_TOOLS_PER_MULTITOOLS) // return INCORRECT_PARAMETERS_ERROR; + try { if (shank.Name.Count() > 32) @@ -2099,30 +2155,6 @@ namespace CMS_CORE.Siemens return NO_ERROR; } - public override CmsError TOOLS_WUpdatePosition(PositionModel position) - { - try - { - DataSvc dataSvc = new DataSvc(); - int paramId = ((position.PositionId - 1) * 11) + 5; - // TC_MTP2 - Item item = new Item() - { - Path = string.Format("/Tool/Magazine/placeData[c{0} , {1}]", position.MagazineId, paramId) - }; - dataSvc.Read(item); - - item.Value = SetBitValue(Convert.ToInt32(item.Value), position.Disabled, 1); - dataSvc.Write(item); - } - catch (Exception ex) - { - return ManageException(ex); - } - - return NO_ERROR; - } - public override CmsError TOOLS_WUpdateShank(ref ShankModel shank) { try @@ -2138,11 +2170,12 @@ namespace CMS_CORE.Siemens // TC_MTP2 new Item("/Tool/MT/multitoolIdent[" + shank.Id + "]") { Value = shank.Name }, // TC_MTP3 - new Item() { Path = "/Tool/MT/multitoolsize_left[" + shank.Id + "]", Value = shank.LeftSize }, + + new Item() { Path = "/Tool/MT/multitoolsize_left[" + shank.Id + "]", Value = shank.LeftSize == 0 ? 1 : shank.LeftSize }, // TC_MTP4 - new Item() { Path = "/Tool/MT/multitoolsize_right[" + shank.Id + "]", Value = shank.RightSize }, + new Item() { Path = "/Tool/MT/multitoolsize_right[" + shank.Id + "]", Value = shank.RightSize == 0 ? 1 : shank.RightSize }, // TC_TMP7 - new Item() { Path = "/Tool/MT/multitoolplace_spec[" + shank.Id + "]", Value = shank.MagazinePositionType }, + new Item() { Path = "/Tool/MT/multitoolplace_spec[" + shank.Id + "]", Value = shank.MagazinePositionType == 0 ? 1 : shank.MagazinePositionType }, // TC_MTP8 new Item() { Path = "/Tool/MT/multitoolStateL[" + shank.Id + "]", Value = array[0] } }; @@ -2242,6 +2275,9 @@ namespace CMS_CORE.Siemens if (tool.EdgesData.Count > MAX_EDGES_PER_TOOL) return MAX_EDGES_PER_TOOL_REACHED_ERROR; + // Get next edge id + int nextEdgeId = tool.EdgesData.Count + 1; + try { // Create strings parameters @@ -2254,6 +2290,12 @@ namespace CMS_CORE.Siemens // Start NC add command PiSvc pi = new PiSvc(piArgs); pi.Start(); + + edge.Id = nextEdgeId; + + CmsError cmsError = TOOLS_WUpdateEdge(toolId, ref edge); + if (cmsError.IsError()) + return cmsError; } catch (Exception ex) { @@ -2278,30 +2320,41 @@ namespace CMS_CORE.Siemens List toolTypeConfig = toolEdgesConfig.EdgesConfig[tool.ToolType]; DataSvc dataSvc = new DataSvc(); List items = new List(); - int edgeOffset = (edge.Id - 1) * 9; - switch (tool.LifeType) - { - case SIEMENS_LIFE_TYPE.TIME: - { - items.Add(new Item() { Path = string.Format("/Tool/Supervision/data[c{0}, {1}]", tool.Id, edgeOffset + 1), Value = edge.PreAlmLife }); - items.Add(new Item() { Path = string.Format("/Tool/Supervision/data[c{0}, {1}]", tool.Id, edgeOffset + 2), Value = edge.NominalLife }); - items.Add(new Item() { Path = string.Format("/Tool/Supervision/data[c{0}, {1}]", tool.Id, edgeOffset + 5), Value = edge.ResidualLife }); - } - break; - case SIEMENS_LIFE_TYPE.COUNT: - { - items.Add(new Item() { Path = string.Format("/Tool/Supervision/data[c{0}, {1}]", tool.Id, edgeOffset + 3), Value = edge.PreAlmLife }); - items.Add(new Item() { Path = string.Format("/Tool/Supervision/data[c{0}, {1}]", tool.Id, edgeOffset + 4), Value = edge.NominalLife }); - items.Add(new Item() { Path = string.Format("/Tool/Supervision/data[c{0}, {1}]", tool.Id, edgeOffset + 6), Value = edge.ResidualLife }); - } - break; + int edgeLifeOffset = (edge.Id - 1) * 9; + if (LIFE_OPTION_ACTIVE) // Check if life option is active + { + switch (tool.LifeType) + { + case SIEMENS_LIFE_TYPE.TIME: + { + items.Add(new Item() { Path = string.Format("/Tool/Supervision/data[c{0}, {1}]", tool.Id, edgeLifeOffset + 1), Value = edge.PreAlmLife }); + items.Add(new Item() { Path = string.Format("/Tool/Supervision/data[c{0}, {1}]", tool.Id, edgeLifeOffset + 2), Value = edge.NominalLife }); + items.Add(new Item() { Path = string.Format("/Tool/Supervision/data[c{0}, {1}]", tool.Id, edgeLifeOffset + 5), Value = edge.ResidualLife }); + } + break; + + case SIEMENS_LIFE_TYPE.COUNT: + { + items.Add(new Item() { Path = string.Format("/Tool/Supervision/data[c{0}, {1}]", tool.Id, edgeLifeOffset + 3), Value = edge.PreAlmLife }); + items.Add(new Item() { Path = string.Format("/Tool/Supervision/data[c{0}, {1}]", tool.Id, edgeLifeOffset + 4), Value = edge.NominalLife }); + items.Add(new Item() { Path = string.Format("/Tool/Supervision/data[c{0}, {1}]", tool.Id, edgeLifeOffset + 6), Value = edge.ResidualLife }); + } + break; + } } + // Edge params + int edgeParamsIndex = ((edge.Id - 1) * 35); + + // Set edge id type + items.Add(new Item() { Path = string.Format("/Tool/Compensation/edgeData[c{0},{1}]", tool.Id, edgeParamsIndex + 1), Value = tool.ToolType }); + + // Set edge additional params, read by configuration foreach (EdgeConfigModel conf in toolTypeConfig) { if (edge.EdgeAdditionalParams.ContainsKey(conf.Name)) { - items.Add(new Item() { Path = string.Format("/Tool/Compensation/edgeData[c{0}, {1}]", edge.Id, edgeOffset + conf.Number), Value = edge.EdgeAdditionalParams[conf.Name] }); + items.Add(new Item() { Path = string.Format("/Tool/Compensation/edgeData[c{0}, {1}]", tool.Id, edgeParamsIndex + conf.Number), Value = edge.EdgeAdditionalParams[conf.Name] }); } } @@ -2468,6 +2521,31 @@ namespace CMS_CORE.Siemens return NO_ERROR; } + public override CmsError TOOLS_WUpdatePosition(PositionModel position) + { + try + { + DataSvc dataSvc = new DataSvc(); + int paramId = ((position.PositionId - 1) * 11) + 5; + // TC_MTP2 + Item item = new Item() + { + Path = string.Format("/Tool/Magazine/placeData[c{0} , {1}]", position.MagazineId, paramId) + }; + dataSvc.Read(item); + + item.Value = SetBitValue(Convert.ToInt32(item.Value), position.Disabled, 1); + dataSvc.Write(item); + } + catch (Exception ex) + { + return ManageException(ex); + } + + return NO_ERROR; + } + + public override CmsError TOOLS_RMagazineTools(int magazineId, ref List magazinePos) { if (magazineId <= 0) @@ -2529,7 +2607,7 @@ namespace CMS_CORE.Siemens return NO_ERROR; } - #endregion Tools functions + #endregion Tool Management /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -3593,7 +3671,7 @@ namespace CMS_CORE.Siemens if (tool != null) // Remove ToolTableData.Remove(tool); - else + else if (MULTITOOL_OPTION_ACTIVE) { // if tool not exist, find into shanks ShankModel shank = MultitoolsData.SingleOrDefault(t => t.Id == toolInfo.tNo); @@ -3622,7 +3700,7 @@ namespace CMS_CORE.Siemens ToolTableData.Add(newTool); AddOrUpdateFamilyChild(newTool.FamilyName); } - else + else if (MULTITOOL_OPTION_ACTIVE) { ShankModel newMultitool = CreateMultitoolFromId((int)toolInfo.tNo, toolsStrings); MultitoolsData.Add(newMultitool); @@ -3646,11 +3724,11 @@ namespace CMS_CORE.Siemens if (newTool != null) ToolTableData[toolIndex] = newTool; } - else + else if (MULTITOOL_OPTION_ACTIVE) { // Find if its a multitool int multitoolIndex = MultitoolsData.FindIndex(t => t.Id == toolInfo.tNo); - + if (multitoolIndex != -1) { // Create model with new data @@ -3659,6 +3737,11 @@ namespace CMS_CORE.Siemens if (newShank != null) MultitoolsData[multitoolIndex] = newShank; } + else + { + ShankModel newMultitool = CreateMultitoolFromId((int)toolInfo.tNo, toolsStrings); + MultitoolsData.Add(newMultitool); + } } } break; @@ -3738,6 +3821,30 @@ namespace CMS_CORE.Siemens return Convert.ToInt32(item.Value); } + private int GetLastEdgeId(int toolId) + { + // Get edgeIds ids + List edgeIds = ToolTableData.Where(x => x.Id == toolId).FirstOrDefault()?.EdgesData.Select(x => x.Id).ToList(); + // Sort tools ids array + edgeIds.Sort((x, y) => x.CompareTo(y)); + + if (edgeIds.Count == 0) + return 1; + + for (int i = 0; i < edgeIds.Count - 1; i++) + { + // If next id is different than previus + 1, there is an empty space in the array of numbers + if (edgeIds[i] + 1 != edgeIds[i + 1]) + { + // return new id + return edgeIds[i] + 1; + } + } + + // If there isn't an empty space return max id + 1 + return edgeIds[edgeIds.Count - 1] + 1; + } + private void AddOrUpdateFamilyChild(string familyName) { // Find family diff --git a/CMS_CORE_Library/Siemens/SiemensEdgesConfigurations.cs b/CMS_CORE_Library/Siemens/SiemensEdgesConfigurations.cs index cd7a483..74ce564 100644 --- a/CMS_CORE_Library/Siemens/SiemensEdgesConfigurations.cs +++ b/CMS_CORE_Library/Siemens/SiemensEdgesConfigurations.cs @@ -136,7 +136,7 @@ namespace CMS_CORE_Library.Siemens new EdgeConfigModel{ Name = "cuttingEdge", Path = "$TC_DP2[", Number = 2}, new EdgeConfigModel{ Name = "lenght", Path = "$TC_DP3[", Number = 3}, new EdgeConfigModel{ Name = "radius", Path = "$TC_DP6[", Number = 6}, - new EdgeConfigModel{ Name = "Width", Path = "$TC_DP9[", Number = 9 }, + new EdgeConfigModel{ Name = "width", Path = "$TC_DP9[", Number = 9 }, new EdgeConfigModel{ Name = "wearLenght", Path = "$TC_DP12[", Number = 12}, new EdgeConfigModel{ Name = "wearRadius", Path = "$TC_DP15[", Number = 15 }, new EdgeConfigModel{ Name = "teeth", Path = "$TC_DPNT[", Number = 34 } @@ -148,7 +148,7 @@ namespace CMS_CORE_Library.Siemens new EdgeConfigModel{ Name = "cuttingEdge", Path = "$TC_DP2[", Number = 2}, new EdgeConfigModel{ Name = "lenght", Path = "$TC_DP3[", Number = 3}, new EdgeConfigModel{ Name = "radius", Path = "$TC_DP6[", Number = 6}, - new EdgeConfigModel{ Name = "Width", Path = "$TC_DP9[", Number = 9 }, + new EdgeConfigModel{ Name = "width", Path = "$TC_DP9[", Number = 9 }, new EdgeConfigModel{ Name = "wearLenght", Path = "$TC_DP12[", Number = 12}, new EdgeConfigModel{ Name = "wearRadius", Path = "$TC_DP15[", Number = 15 }, new EdgeConfigModel{ Name = "teeth", Path = "$TC_DPNT[", Number = 34 } diff --git a/CMS_CORE_Library/ToolConfigurations.cs b/CMS_CORE_Library/ToolConfigurations.cs index 0f2cbeb..76f7b44 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 = "lifeType", Type = "select", SelectValues = toolLifeList, Category = "life", ReadOnly = false}, 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},