using System; using System.Collections.Generic; using System.Threading; using Step.Model.DTOModels; using TeamDev.SDK.MVVM; using Step.NC; using Step.Core; using static Step.Utils.Constants; using static Step.Utils.ExceptionManager; using static CMS_CORE.Nc; public static class ThreadsFunctions { public static bool reconnectionIsRunning = false; public static void ReadAlarmsAsync() { NcHandler ncHandler = new NcHandler(); try { ncHandler.Connect(); while (true) { if (ncHandler.numericalControl.NC_IsConnected()) { // Get Alarms from NC CmsError libraryError = ncHandler.GetNcAlarms(out DTOAlarmsModel alarms); if (libraryError.errorCode != 0) ManageLibraryError(libraryError); // Send through signalR MessageServices.Current.Publish(SEND_ALARMS, null, alarms); } Thread.Sleep(200); } } catch (ThreadAbortException ex) { ncHandler.Dispose(); } } public static void ReadNcGenericInfo() { NcHandler ncHandler = new NcHandler(); try { CmsError libraryError = ncHandler.Connect(); if (libraryError.errorCode != 0) ManageLibraryError(libraryError); while (true) { if (ncHandler.numericalControl.NC_IsConnected()) { // Get Generic data from NC libraryError = ncHandler.GetNcGenericData(out DTONcGenericDataModel genericData); if (libraryError.errorCode != 0) ManageLibraryError(libraryError); else // Send through signalR MessageServices.Current.Publish(SEND_GENERIC_DATA, null, genericData); } Thread.Sleep(1000); } } catch (ThreadAbortException ex) { ncHandler.Dispose(); } } public static void ReadAxes() { NcHandler ncHandler = new NcHandler(); try { CmsError libraryError = ncHandler.Connect(); if (libraryError.errorCode != 0) ManageLibraryError(libraryError); while (true) { if (ncHandler.numericalControl.NC_IsConnected()) { // Get the list of the axes libraryError = ncHandler.GetAxesPositions(out List genericData); if (libraryError.errorCode != 0) ManageLibraryError(libraryError); // Send through signalR MessageServices.Current.Publish(SEND_AXES, null, genericData); } Thread.Sleep(200); } } catch (ThreadAbortException ex) { ncHandler.Dispose(); } } private static void WillReconnect() { // Stop all the NC threads ThreadsHandler.Stop(); NcHandler ncHandler = new NcHandler(); // Run loop until NC is connected while (!ncHandler.numericalControl.NC_IsConnected()) { // Try reconnection CmsError cmsError = ncHandler.Connect(); if (cmsError.errorCode == CMS_ERROR_CODES.SIEMENS_ENVIRONMENT_NOT_FOUND || cmsError.errorCode == CMS_ERROR_CODES.SIEMENS_HMI_NOT_RUNNING) { ManageLibraryError(cmsError); } else if ( cmsError.errorCode != CMS_ERROR_CODES.OK) ncHandler.Dispose(); Thread.Sleep(1000); // Send status to UI MessageServices.Current.Publish(NC_STATUS, null, ncHandler.numericalControl.NC_IsConnected()); } // Start/Restart NC threads ThreadsHandler.StartWorkers(); reconnectionIsRunning = false; } public static void TryNcConnection() { if (reconnectionIsRunning == false) { // Set thread as running state reconnectionIsRunning = true; // Start reconnection thread Thread t = new Thread(() => WillReconnect() ); t.Start(); } } public static void ManageLibraryError(CmsError cmsError) { switch (cmsError.errorCode) { case CMS_ERROR_CODES.NC_PROD_ERROR: TryNcConnection(); break; case CMS_ERROR_CODES.NOT_CONNECTED: TryNcConnection(); // If not connected try reconnection break; case CMS_ERROR_CODES.PROC_NOT_FOUND: break; case CMS_ERROR_CODES.FUNCTION_NOT_ALLOWED: break; case CMS_ERROR_CODES.BIT_NOT_IN_RANGE: break; case CMS_ERROR_CODES.BYTE_NOT_IN_RANGE: break; case CMS_ERROR_CODES.INTERNAL_ERROR: break; case CMS_ERROR_CODES.INCORRECT_PARAMETERS: break; case CMS_ERROR_CODES.NC_LANGUAGE_ERROR: break; case CMS_ERROR_CODES.SIEMENS_ENVIRONMENT_NOT_FOUND: case CMS_ERROR_CODES.SIEMENS_HMI_NOT_RUNNING: Manage(ERROR_LEVEL.FATAL, cmsError.message); break; } } }