diff --git a/Libs/CMS_CORE_Library.dll b/Libs/CMS_CORE_Library.dll index 12877f8a..38785774 100644 Binary files a/Libs/CMS_CORE_Library.dll and b/Libs/CMS_CORE_Library.dll differ diff --git a/Step.Config/Config/serverConfig.xml b/Step.Config/Config/serverConfig.xml index ec1bcc1e..9ed5e08e 100644 --- a/Step.Config/Config/serverConfig.xml +++ b/Step.Config/Config/serverConfig.xml @@ -1,9 +1,9 @@ - DEMO + OSAI true - localhost + 192.168.157.2 8080 Ares 37 OF diff --git a/Step.Core/ThreadsFunctions.cs b/Step.Core/ThreadsFunctions.cs index 2d9b1a75..7f51642d 100644 --- a/Step.Core/ThreadsFunctions.cs +++ b/Step.Core/ThreadsFunctions.cs @@ -449,7 +449,7 @@ public static class ThreadsFunctions try { // Try connection - CmsError libraryError = ncHandler.Connect(); + CmsError libraryError = ncHandler.Connect(); if (libraryError.errorCode != 0) ManageLibraryError(libraryError); @@ -578,6 +578,44 @@ public static class ThreadsFunctions } } + public static void ReadNcMagazineActive() + { + NcHandler ncHandler = new NcHandler(); + Stopwatch sw = new Stopwatch(); + + try + { + // Try connection + CmsError libraryError = ncHandler.Connect(); + if (libraryError.errorCode != 0) + ManageLibraryError(libraryError); + + while (true) + { + sw.Restart(); + + // Check if client is connected + if (ncHandler.numericalControl.NC_IsConnected()) + { + // Get new data from PLC + libraryError = ncHandler.GetNcMagazineStatus(out Dictionary status); + + MessageServices.Current.Publish(NC_MAGAZINE_IS_ACTIVE, null, status); + } + else + TryNcConnection(); + sw.Stop(); + + // Wait + Thread.Sleep(CalcSleepTime(500, (int)sw.ElapsedMilliseconds)); + } + } + catch (ThreadAbortException) + { + ncHandler.Dispose(); + } + } + #endregion Nc functions threads #region SupportFunctions diff --git a/Step.Core/ThreadsHandler.cs b/Step.Core/ThreadsHandler.cs index b27d424d..5b0b4391 100644 --- a/Step.Core/ThreadsHandler.cs +++ b/Step.Core/ThreadsHandler.cs @@ -22,7 +22,8 @@ namespace Step.Core ThreadsFunctions.ReadHeadsData, ThreadsFunctions.ReadAxesNamesData, ThreadsFunctions.ReadActiveProgramData, - ThreadsFunctions.UpdateToolsData + ThreadsFunctions.UpdateToolsData, + ThreadsFunctions.ReadNcMagazineActive // ThreadsFunctions.ReadNcSoftKeysData, }; diff --git a/Step.Database/Controllers/NcToolManagerController.cs b/Step.Database/Controllers/NcToolManagerController.cs index 493c2bc2..ef34baf2 100644 --- a/Step.Database/Controllers/NcToolManagerController.cs +++ b/Step.Database/Controllers/NcToolManagerController.cs @@ -294,6 +294,29 @@ namespace Step.Database.Controllers return tool; } + public DbNcToolModel UpdateToolOffset(int toolId, int position, int offsetId) + { + DbNcToolModel tool = FindTool(toolId); + + switch (position) + { + case 1: + tool.OffsetId1 = offsetId; + break; + case 2: + tool.OffsetId2 = offsetId; + break; + case 3: + tool.OffsetId3 = offsetId; + break; + } + + // Save + dbCtx.SaveChanges(); + + return tool; + } + public void DeleteTool(int toolId) { DbNcToolModel tool = FindTool(toolId); diff --git a/Step.Model/Constants.cs b/Step.Model/Constants.cs index 3c5809aa..86aeb115 100644 --- a/Step.Model/Constants.cs +++ b/Step.Model/Constants.cs @@ -155,6 +155,7 @@ namespace Step.Model public const string SEND_MAGAZINES_STATUS = "SEND_MAGAZINES_STATUS"; public const string SEND_ACTIVE_PROGRAM_DATA = "SEND_ACTIVE_PROGRAM_DATA"; public const string UPDATE_TOOLS_DATA = "UPDATE_TOOLS_DATA"; + public const string NC_MAGAZINE_IS_ACTIVE = "UPDATE_NC_MAGAZINE_STATUS"; public const string BROADCAST_DATA = "BROADCAST_DATA"; diff --git a/Step.NC/NcHandler.cs b/Step.NC/NcHandler.cs index 3719fd6b..c9ad69aa 100644 --- a/Step.NC/NcHandler.cs +++ b/Step.NC/NcHandler.cs @@ -163,7 +163,7 @@ namespace Step.NC if (cmsError.IsError()) return cmsError; // Activate - return numericalControl.FILES_WSetActiveProgram(selectedProcess, newFilePath, ref programData); + return numericalControl.FILES_WSetActiveProgram(selectedProcess, newFilePath, ref programData); } #endregion File manager @@ -1360,6 +1360,55 @@ namespace Step.NC { return numericalControl.TOOLS_WOffset(offsetId, offsetData); } + + public CmsError UpdateToolOffsetId(int toolId, int positionId, int offsetId, out DTONcToolModel toolWithOffsets) + { + toolWithOffsets = new DTONcToolModel(); + + using (NcToolManagerController toolsManager = new NcToolManagerController()) + { + using (var dbContextTransaction = toolsManager.dbCtx.Database.BeginTransaction()) + { + // Update database tool Tool + DbNcToolModel dbTool = toolsManager.UpdateToolOffset(toolId, positionId, offsetId); + + // Populate updated tool with offset data + CmsError cmsError = GetToolData(dbTool, ref toolWithOffsets); + if (cmsError.IsError()) + { + dbContextTransaction.Rollback(); + return cmsError; + } + + bool startIsActive = false; + + // Check if tool is loaded into a shank + if (dbTool.ShankId != null) + { + // Check if shank is loaded into magazine + DbNcShankModel shank = toolsManager.FindShankWithTools(dbTool.ShankId.Value); + if (shank.MagazineId != null) + { + startIsActive = true; + // Create backup of data stored on the NC and block file accesses + cmsError = numericalControl.TOOLS_WStartEditData(); + if (cmsError.IsError()) + { + ManageErrorAndTransaction(cmsError, dbContextTransaction, startIsActive); + return cmsError; + } + + // Update tool + cmsError = UpdateNcTools(toolsManager); + } + } + + ManageErrorAndTransaction(cmsError, dbContextTransaction, startIsActive); + + return NO_ERROR; + } + } + } public CmsError DeleteNcTool(DbNcToolModel tool) { @@ -1844,6 +1893,12 @@ namespace Step.NC return NO_ERROR; } + public CmsError GetNcMagazineStatus(out Dictionary status) + { + status = new Dictionary(); + return numericalControl.TOOLS_RMagazineStatus(ref status); + } + #endregion Osai/Fanuc Tools } } \ No newline at end of file diff --git a/Step/Controllers/WebApi/NcToolManagerController.cs b/Step/Controllers/WebApi/NcToolManagerController.cs index 477e411b..3d4d5b35 100644 --- a/Step/Controllers/WebApi/NcToolManagerController.cs +++ b/Step/Controllers/WebApi/NcToolManagerController.cs @@ -233,6 +233,41 @@ namespace Step.Controllers.WebApi #endregion Tools + #region Offsets + + [Route("offset/{offsetId:int}"), HttpPut] + public IHttpActionResult UpdateOffset(short offsetId, OffsetModel offsetData) + { + using (NcHandler ncHandler = new NcHandler()) + { + ncHandler.Connect(); + + CmsError cmsError = ncHandler.UpdateOffset(offsetId, offsetData); + if (cmsError.IsError()) + return BadRequest(cmsError.localizationKey); + + offsetData.Id = offsetId; + return Ok(offsetData); + } + } + + [Route("tool/{toolId:int}/position/{positionId:int}/offset/{offsetId:int}"), HttpPut] + public IHttpActionResult UpdateToolOffset(int toolId, int positionId, short offsetId) + { + using (NcHandler ncHandler = new NcHandler()) + { + ncHandler.Connect(); + + CmsError cmsError = ncHandler.UpdateToolOffsetId(toolId, positionId, offsetId, out DTONcToolModel tool); + if (cmsError.IsError()) + return BadRequest(cmsError.localizationKey); + + return Ok(tool); + } + } + + #endregion + #region Shanks [Route("shanks"), HttpGet] @@ -673,21 +708,5 @@ namespace Step.Controllers.WebApi return Ok(); } } - - [Route("offset/{offsetId:int}"), HttpPut] - public IHttpActionResult UpdateOffset(short offsetId, OffsetModel offsetData) - { - using (NcHandler ncHandler = new NcHandler()) - { - ncHandler.Connect(); - - CmsError cmsError = ncHandler.UpdateOffset(offsetId, offsetData); - if (cmsError.IsError()) - return BadRequest(cmsError.localizationKey); - - offsetData.Id = offsetId; - return Ok(offsetData); - } - } } } \ No newline at end of file diff --git a/Step/Listeners/ListenersHandler.cs b/Step/Listeners/ListenersHandler.cs index 2396565b..c2213ebf 100644 --- a/Step/Listeners/ListenersHandler.cs +++ b/Step/Listeners/ListenersHandler.cs @@ -75,15 +75,23 @@ namespace Step.Listeners { SignalRListener.SendActiveProgramData(a); })); - - infos.Add(MessageServices.Current.Subscribe(BROADCAST_DATA, (a, b) => + infos.Add(MessageServices.Current.Subscribe(NC_MAGAZINE_IS_ACTIVE, (a, b) => { - SignalRListener.BroadcastData(); + SignalRListener.SendNcMagazineIsActive(a); })); + + + // Database infos.Add(MessageServices.Current.Subscribe(UPDATE_TOOLS_DATA, (a, b) => { SignalRDatabaseHandler.UpdateToolsData(a); })); + + // Broadcast + infos.Add(MessageServices.Current.Subscribe(BROADCAST_DATA, (a, b) => + { + SignalRListener.BroadcastData(); + })); } public static void Stop() diff --git a/Step/Listeners/SignalR/SignalRListener.cs b/Step/Listeners/SignalR/SignalRListener.cs index b2a95158..076e02bf 100644 --- a/Step/Listeners/SignalR/SignalRListener.cs +++ b/Step/Listeners/SignalR/SignalRListener.cs @@ -25,6 +25,7 @@ namespace Step.Listeners.SignalR private static List LastAxesNamesData = new List(); private static DTOMagazineActionModel LastMagazineStatus = new DTOMagazineActionModel(); private static DTOActiveProgramDataModel LastProgramData = new DTOActiveProgramDataModel(); + private static Dictionary LastNcMagazineIsActive = new Dictionary(); private static bool LastIsNcConnected = false; @@ -212,6 +213,19 @@ namespace Step.Listeners.SignalR context.Clients.Group("ncData").activeProgramData(programData); } } + + public static void SendNcMagazineIsActive(object magazineActive) + { + Dictionary newStatus = magazineActive as Dictionary; + var context = GlobalHost.ConnectionManager.GetHubContext(); + if (!LastNcMagazineIsActive.SequenceEqual(newStatus)) + { + LastNcMagazineIsActive = newStatus; + + context.Clients.Group("ncData").magazineIsActive(newStatus); + } + } + private volatile static object _broadcastlock = new Object(); public static void BroadcastData()