diff --git a/Libs/CMS_CORE_Library.dll b/Libs/CMS_CORE_Library.dll index d3ca44fd..606bfcba 100644 Binary files a/Libs/CMS_CORE_Library.dll and b/Libs/CMS_CORE_Library.dll differ diff --git a/Step.Core/ThreadsHandler.cs b/Step.Core/ThreadsHandler.cs index f434a16b..359e5c35 100644 --- a/Step.Core/ThreadsHandler.cs +++ b/Step.Core/ThreadsHandler.cs @@ -16,13 +16,13 @@ namespace Step.Core ThreadsFunctions.ReadProcessesPPStatus, ThreadsFunctions.ReadEnabledFunctionality, ThreadsFunctions.ReadExpiredMaintenances, - // ThreadsFunctions.ReadNcSoftKeysData, ThreadsFunctions.ReadMagazinesStatus, ThreadsFunctions.ReadUserSoftKeysData, ThreadsFunctions.ReadHeadsData, ThreadsFunctions.ReadAxesNamesData, ThreadsFunctions.ReadAxes, ThreadsFunctions.UpdateToolsData + // ThreadsFunctions.ReadNcSoftKeysData, }; private volatile static List RunningThreadsList = new List(); diff --git a/Step.Database/Controllers/NcToolManagerController.cs b/Step.Database/Controllers/NcToolManagerController.cs index 6124e0ce..ca2dee1e 100644 --- a/Step.Database/Controllers/NcToolManagerController.cs +++ b/Step.Database/Controllers/NcToolManagerController.cs @@ -77,6 +77,15 @@ namespace Step.Database.Controllers return tools; } + public List FindToolsByShankIdWithDependencies(int shankId) + { + List tools = FindToolsWithDependencies() + .Where(x => x.ShankId == shankId) + .ToList(); + + return tools; + } + public List FindTools() { List tools = dbCtx @@ -105,6 +114,16 @@ namespace Step.Database.Controllers return shanks; } + public DbNcShankModel FindShanksByPositions(int magazineId, int positionId) + { + DbNcShankModel shank = FindShanks() + .Where(x => x.MagazineId == magazineId && x.PositionId == positionId) + .FirstOrDefault(); + + return shank; + } + + public List GetShanks() { // Get shank from database @@ -200,6 +219,15 @@ namespace Step.Database.Controllers return dtoShanks; } + public List GetMountedTools() + { + List tools = FindToolsWithDependencies() + .Where(x => x.Shank.MagazineId != null) + .ToList(); + + return tools; + } + public List GetAvailableShanks() { List dtoShanks = GetShanks() diff --git a/Step.Model/DTOModels/ToolModels/DTONcToolModel.cs b/Step.Model/DTOModels/ToolModels/DTONcToolModel.cs index 11bd7a73..c9183093 100644 --- a/Step.Model/DTOModels/ToolModels/DTONcToolModel.cs +++ b/Step.Model/DTOModels/ToolModels/DTONcToolModel.cs @@ -21,14 +21,19 @@ namespace Step.Model.DTOModels.ToolModels // Foreign keys public int FamilyId { get; set; } + [Required] public bool Disabled { get; set; } - + + [Required] public bool Broken { get; set; } + [Required] public bool Measured { get; set; } + [Required] public bool ClockwiseRotation { get; set; } + [Required] public bool CounterClockwiseRotation { get; set; } public int? ShankId { get; set; } diff --git a/Step.NC/NcHandler.cs b/Step.NC/NcHandler.cs index 845b6e38..6924aa89 100644 --- a/Step.NC/NcHandler.cs +++ b/Step.NC/NcHandler.cs @@ -1347,26 +1347,26 @@ namespace Step.NC } - public DTONcMagazinePositionModel LoadToolInMagazine(byte magazineId, byte positionId, DbNcShankModel shank) - { - using (NcToolManagerController toolsManager = new NcToolManagerController()) - { - // Update shank data - DTONcMagazinePositionModel magPos = (DTONcMagazinePositionModel)toolsManager.LoadShankInMagazine(magazineId, positionId, shank); - // Set magazineId - magPos.ShankId = shank.ShankId; + //public DTONcMagazinePositionModel LoadToolInMagazine(byte magazineId, byte positionId, DbNcShankModel shank) + //{ + // using (NcToolManagerController toolsManager = new NcToolManagerController()) + // { + // // Update shank data + // DTONcMagazinePositionModel magPos = (DTONcMagazinePositionModel)toolsManager.LoadShankInMagazine(magazineId, positionId, shank); + // // Set magazineId + // magPos.ShankId = shank.ShankId; - return magPos; - } - } + // return magPos; + // } + //} - public DTONcShankModel UnloadToolInMagazine(byte magazineId, byte positionId, DbNcShankModel shank) - { - using (NcToolManagerController toolsManager = new NcToolManagerController()) - { - return toolsManager.UnloadShankInMagazine(magazineId, positionId, shank); - } - } + //public DTONcShankModel UnloadToolInMagazine(byte magazineId, byte positionId, DbNcShankModel shank) + //{ + // using (NcToolManagerController toolsManager = new NcToolManagerController()) + // { + // return toolsManager.UnloadShankInMagazine(magazineId, positionId, shank); + // } + //} public DTONcShankModel LoadIntoShank(DbNcToolModel tool, int shankId) { @@ -1402,19 +1402,17 @@ namespace Step.NC List dbPositions = toolsManager.FindMagazinePositions(); if (dbPositions.Count <= 0) { - List config = new List(); - // Read configuration - CmsError cmsError = numericalControl.TOOLS_RMagazineConfig(ref config); + CmsError cmsError = GetMagazineConfiguration(out List config); if (cmsError.IsError()) return cmsError; - // Setup new positions list + // Setup new positions list in order to be saved in the database List fromConfigPosition = new List(); foreach (var conf in config) { for (byte i = 1; i <= conf.MaxPositions; i++) { - // Create new positions + // Create new position fromConfigPosition.Add(new DbNcMagazinePositionModel() { MagazineId = conf.Id, @@ -1435,6 +1433,13 @@ namespace Step.NC } } + public CmsError GetMagazineConfiguration(out List config) + { + config = new List(); + // Read configuration + return numericalControl.TOOLS_RMagazineConfig(ref config); + } + public CmsError StartEditData() { return numericalControl.TOOLS_WStartEditData(); @@ -1506,6 +1511,44 @@ namespace Step.NC return numericalControl.TOOLS_RUpdatedToolsData(ref updatedStatus,ref updatedLives); } + public CmsError CheckIfShankCanFit(int magazineId, int positionId, DbNcShankModel shankToBeLoaded, List magazineMountedTools, NcMagazineConfigModel magConfig) + { + // Check if tool can fit in the position considering other tools + foreach (var mountedTool in magazineMountedTools) + { + // Check if is not the same position && if is different check if the position is on the same magazine + if (mountedTool.Shank.PositionId != positionId && mountedTool.Shank.MagazineId == magazineId) + { + int decPosition, incPosition; + decPosition = incPosition = mountedTool.Shank.PositionId.Value; + // if it is a circular magazine move position before ( for left case ) or after ( right case ) the location you want to mount the tool + if (magConfig.Type != MAGAZINE_TYPE.BOX_MAGAZINE) + { + decPosition = decPosition < shankToBeLoaded.PositionId ? decPosition + magConfig.MaxPositions : decPosition; + incPosition = incPosition > shankToBeLoaded.PositionId ? incPosition - magConfig.MaxPositions : incPosition; + } + + // Right check + // Calculate left space occupied (with mounted shank) + double leftMounted = decPosition - (mountedTool.Family.LeftSize / 2.0); + // Calculate right space needed (with shank to be loaded) + double rightToBeMount = positionId + (mountedTool.Family.RightSize / 2.0); + if (leftMounted < rightToBeMount) + return MAGAZINE_POSITION_OCCUPIED_ERROR; + + // Left check + // Calculate right space occupied (with mounted shank) + double rightMounted = incPosition + (mountedTool.Family.RightSize / 2.0); + // Calculate left space needed (with shank to be loaded) + double leftToBeMounted = positionId - (mountedTool.Family.LeftSize / 2.0); + if (rightMounted > leftToBeMounted) + return MAGAZINE_POSITION_OCCUPIED_ERROR; + } + } + + return NO_ERROR; + } + #endregion Osai/Fanuc Tools #endregion Write data diff --git a/Step/Controllers/WebApi/NcToolManagerController.cs b/Step/Controllers/WebApi/NcToolManagerController.cs index 3c457522..c4ccdfa3 100644 --- a/Step/Controllers/WebApi/NcToolManagerController.cs +++ b/Step/Controllers/WebApi/NcToolManagerController.cs @@ -388,6 +388,7 @@ namespace Step.Controllers.WebApi // Check if shank exists shank = toolsManager.FindShank(shankId.ToolId); if (shank == null) + return BadRequest(API_ERROR_KEYS.INCORRECT_PARAMETERS); // Check if shank is already loaded somewhere if (shank.MagazineId != null) @@ -400,16 +401,37 @@ namespace Step.Controllers.WebApi // Check if the mag pos is disabled if(magPos.Disabled == true) return BadRequest(API_ERROR_KEYS.INCORRECT_PARAMETERS); - } - using (NcHandler ncHandler = new NcHandler()) - { - ncHandler.Connect(); - DTONcMagazinePositionModel magazinePos = ncHandler.LoadToolInMagazine(magazineId, positionId, shank); + using (NcHandler ncHandler = new NcHandler()) + { + // Get Configuration + ncHandler.Connect(); + CmsError cmsError = ncHandler.GetMagazineConfiguration(out List magConfig); + if (cmsError.IsError()) + return BadRequest(cmsError.localizationKey); + + // Check if shank can fit + cmsError = ncHandler.CheckIfShankCanFit( + magazineId, + positionId, + shank, + toolsManager.GetMountedTools(), // Get mounted tools + magConfig.Where(x => x.Id == magazineId).FirstOrDefault() // Get only current magazine config + ); + + if (cmsError.IsError()) + return BadRequest(cmsError.localizationKey); + } + + // Update shank data + DTONcMagazinePositionModel magazinePos = (DTONcMagazinePositionModel)toolsManager.LoadShankInMagazine(magazineId, positionId, shank); + // Set shankId + magazinePos.ShankId = shank.ShankId; return Ok(magazinePos); } + } [Route("magazine/{magazineId:int}/unload/position/{positionId:int}"), HttpPut] @@ -436,20 +458,18 @@ namespace Step.Controllers.WebApi // Check if the mag pos is disabled if (magPos.Disabled == true) return BadRequest(API_ERROR_KEYS.INCORRECT_PARAMETERS); + // Check if magazine position is occupied - DbNcShankModel shankMounted = toolsManager.FindShanks().Where(x => x.MagazineId == magazineId && x.PositionId == positionId).FirstOrDefault(); + DbNcShankModel shankMounted = toolsManager.FindShanksByPositions(magazineId, positionId); if (shankMounted != null) return BadRequest(API_ERROR_KEYS.MAGAZINE_POSITION_OCCUPIED); - } - using (NcHandler ncHandler = new NcHandler()) - { - ncHandler.Connect(); - DTONcShankModel responseShank = ncHandler.UnloadToolInMagazine(magazineId, positionId, shank); + DTONcShankModel responseShank = toolsManager.UnloadShankInMagazine(magazineId, positionId, shank); return Ok(responseShank); } } + [Route("shank/{shankId:int}/load/tool/{toolId:int}"), HttpPut] public IHttpActionResult LoadToolIntoShank(int shankId, int toolId) diff --git a/Step/program.cs b/Step/program.cs index 571fdbbf..bd2bf7a7 100644 --- a/Step/program.cs +++ b/Step/program.cs @@ -1,27 +1,26 @@ using Microsoft.Owin.Hosting; -using Step.UI; -using System.Threading; -using TeamDev.SDK.MVVM; using Step.Config; -using static Step.Config.ServerConfig; -using static Step.Utils.StepLogger; -using static Step.Model.Constants; -using Step.Database; using Step.Core; +using Step.Database; using Step.Listeners; -using System; +using Step.NC; +using Step.UI; using Step.Utils; -using System.Net.NetworkInformation; +using System; using System.Net; using System.Net.Sockets; -using Step.NC; +using System.Threading; +using TeamDev.SDK.MVVM; +using static Step.Config.ServerConfig; +using static Step.Model.Constants; +using static Step.Utils.StepLogger; namespace Step { public class Application { - public static readonly ManualResetEvent StopRequest = new ManualResetEvent(false); + //Set the Mutef of GUID private static Mutex CmsStepMutex = new Mutex(true, "{689e76ce-b845-49f0-919c-c26491079fca}"); @@ -30,7 +29,7 @@ namespace Step public static void Main() { LogInfo("Application started"); - + //Check if is already running an instance of this application if (!CmsStepMutex.WaitOne(TimeSpan.Zero, true)) ExceptionManager.Manage(ERROR_LEVEL.FATAL, "Only one istance of Step-Server can be executed!"); @@ -52,14 +51,14 @@ namespace Step }); // Setup Osai/fanuc toolManager - using(NcHandler handler = new NcHandler()) + using (NcHandler handler = new NcHandler()) { handler.Connect(); handler.SetupNcToolManager(); } // Start server services - if(!ValidateAddress(ServerStartupConfig.ServerAddress)) + if (!ValidateAddress(ServerStartupConfig.ServerAddress)) ExceptionManager.Manage(ERROR_LEVEL.FATAL, "IP Address not valid (must be one configured in Windows-OS)!"); StartOptions opt = new StartOptions(); @@ -71,7 +70,6 @@ namespace Step using (WebApp.Start(opt)) { - // Start Threads ThreadsHandler.Start(); // Start listeners @@ -79,7 +77,7 @@ namespace Step // Wait interrupt from client StopRequest.WaitOne(); - LogInfo("Application closed"); + LogInfo("Application closed"); } // Stop Threads ThreadsHandler.Close(); @@ -89,11 +87,12 @@ namespace Step ServerControlWindow.Stop(); } - private static bool ValidateAddress(String Addr) { + private static bool ValidateAddress(String Addr) + { //If is an asterisk is OK if (String.IsNullOrWhiteSpace(Addr) || Addr == "*") return true; - + //Find an IP Address foreach (IPAddress ipAddr in Array.FindAll(Dns.GetHostEntry(string.Empty).AddressList, a => a.AddressFamily == AddressFamily.InterNetwork)) { @@ -104,4 +103,4 @@ namespace Step return false; } } -} +} \ No newline at end of file