diff --git a/Step.Core/ThreadsFunctions.cs b/Step.Core/ThreadsFunctions.cs index 92cec6e1..cdaaf09f 100644 --- a/Step.Core/ThreadsFunctions.cs +++ b/Step.Core/ThreadsFunctions.cs @@ -7,9 +7,11 @@ using Step.Model.DTOModels.AlarmModels; using Step.Model.DTOModels.Scada; using Step.Model.DTOModels.ToolModels; using Step.NC; +using Step.Utils; using System; using System.Collections.Generic; using System.Diagnostics; +using System.Globalization; using System.IO; using System.Linq; using System.Runtime.InteropServices; @@ -25,7 +27,7 @@ public static class ThreadsFunctions public static bool reconnectionIsRunning = false; private static long ReadAlarmsTimer = 0, ReadAlarmsTimes = 0; private static long ReadAxesTimer = 0, ReadAxesTimes = 0; - private static long ReadPowerOnTimer = 0, ReadPowerOnTimes = 0; + private static long ReadPowerOnTimer = 0, ReadPowerOnTimes = 0; private static long ReadProcPPTimer = 0, ReadProcPPTimes = 0; private static long ReadFunctionTimer = 0, ReadFunctionTimes = 0; private static long ReadMaintenanceTimer = 0, ReadMaintenanceTimes = 0; @@ -154,8 +156,8 @@ public static class ThreadsFunctions sw.Stop(); // Update thread timer - ReadPowerOnTimer += sw.ElapsedMilliseconds; - ReadPowerOnTimes++; + ReadPowerOnTimer += sw.ElapsedMilliseconds; + ReadPowerOnTimes++; // Wait Thread.Sleep(CalcSleepTime(400, (int)sw.ElapsedMilliseconds)); @@ -514,9 +516,9 @@ public static class ThreadsFunctions try { // Try connection - CmsError libraryError = ncHandler.Connect(); + CmsError libraryError = ncHandler.Connect(); if (libraryError.errorCode != 0) - ManageLibraryError(libraryError); + ManageLibraryError(libraryError); while (true) { @@ -570,7 +572,7 @@ public static class ThreadsFunctions if (ncHandler.numericalControl.NC_IsConnected()) { // Get Data from config and PLC - libraryError = ncHandler.GetActiveProgramInfo(out DTOActiveProgramDataModel active); + libraryError = ncHandler.GetActiveProgramInfo(out DTOActiveProgramDataModel active); if (libraryError.IsError()) ManageLibraryError(libraryError); @@ -672,7 +674,7 @@ public static class ThreadsFunctions MessageServices.Current.Publish(NC_MAGAZINE_IS_ACTIVE, null, status); - if(NcConfig.NcVendor != NC_VENDOR.SIEMENS) + if (NcConfig.NcVendor != NC_VENDOR.SIEMENS) { libraryError = ncHandler.ReadAssistedToolingProcedure(out DTOAssistedToolingEndValueModel data); if (libraryError.IsError()) @@ -705,14 +707,14 @@ public static class ThreadsFunctions // Try connection CmsError libraryError = ncHandler.Connect(); if (libraryError.errorCode != 0) - ManageLibraryError(libraryError); + ManageLibraryError(libraryError); while (true) { sw.Restart(); // Check if client is connected - if (ncHandler.numericalControl.NC_IsConnected()) + if (ncHandler.numericalControl.NC_IsConnected()) { // Read data libraryError = ncHandler.UpdateQueue(); @@ -772,7 +774,7 @@ public static class ThreadsFunctions sw.Stop(); // Wait - Thread.Sleep(CalcSleepTime(500, (int)sw.ElapsedMilliseconds)); + Thread.Sleep(CalcSleepTime(500, (int)sw.ElapsedMilliseconds)); } } catch (ThreadAbortException) @@ -783,7 +785,7 @@ public static class ThreadsFunctions public static void ReadM154Data() { - NcHandler ncHandler = new NcHandler(); + NcHandler ncHandler = new NcHandler(); Stopwatch sw = new Stopwatch(); try @@ -791,7 +793,7 @@ public static class ThreadsFunctions // Try connection CmsError libraryError = ncHandler.Connect(); if (libraryError.errorCode != 0) - ManageLibraryError(libraryError); + ManageLibraryError(libraryError); while (true) { @@ -833,8 +835,8 @@ public static class ThreadsFunctions } foreach (M154DataModel m154 in data) - { - if(CmsConnectConfig.Enabled) + { + if (CmsConnectConfig.Enabled) { if (m154.Parameters.Count() >= 2 && m154.Parameters[0] == "SOUR") @@ -866,7 +868,7 @@ public static class ThreadsFunctions notif += m154.Parameters[2]; RedisController.WriteProductionNotification(m154.Process, notif); break; - } + } } // Write ack @@ -883,7 +885,7 @@ public static class ThreadsFunctions if (m154.Parameters[0] == "MTC") { // Convert tag string in Pascal Case and add to result string - switch (m154.Parameters[1].ToLower()) + switch (m154.Parameters[1].ToLower()) { case "currprog": stringVal += "CurrProg"; @@ -908,7 +910,7 @@ public static class ThreadsFunctions string outputFileName = ServerStartupConfig.MTCFolderPath + "\\DATA\\CmsGeneralStatus.mtc"; // Create file if not exits if (!File.Exists(outputFileName)) - using (var f = File.Create(outputFileName)) { }; + using (var f = File.Create(outputFileName)) { }; // Read file List fileLines = File.ReadAllLines(outputFileName).ToList(); string[] parametersInLine; @@ -952,6 +954,68 @@ public static class ThreadsFunctions } } + + public static void SetupCmsConnect(){ + NcHandler ncHandler = new NcHandler(); + try + { + List availableLanguages = LanguageController.GetLanguageListFromDirectory(); + if (availableLanguages == null) + return ; + + ICollection cultureInfos = new List(); + + // Get nc available language + CmsError cmsError = ncHandler.numericalControl.NC_GetAvailableLanguages(ref cultureInfos); + if (cmsError.IsError()) + ManageLibraryError(cmsError); + + // Filter available language with + availableLanguages = availableLanguages.Where(x => cultureInfos.Any(y => y.TwoLetterISOLanguageName == x.IsoId)).ToList(); + + // Fill redis DB + int count = 1; + Dictionary defAlarmsNamesEn = null; + Dictionary defAlarmsNamesIt = null; + foreach (DTOLanguageModel lang in availableLanguages) + { + Dictionary alarmsNames = GetPlcAlarmsTranslations(lang.IsoId); + + if(lang.IsoId.ToLower() == "en") + { + defAlarmsNamesEn = alarmsNames; + if(!RedisController.WriteAlarmsConfigEn(alarmsNames)) + Manage(ERROR_LEVEL.FATAL, CMS_CONNECT_SETUP_ALARM_MESSAGE); + } + else if (lang.IsoId.ToLower() == "it") + { + defAlarmsNamesIt = alarmsNames; + if (!RedisController.WriteAlarmsConfigIt(alarmsNames)) + Manage(ERROR_LEVEL.FATAL, CMS_CONNECT_SETUP_ALARM_MESSAGE); + } + else + if (!RedisController.WriteAlarmsConfigCurr(alarmsNames)) + Manage(ERROR_LEVEL.FATAL, CMS_CONNECT_SETUP_ALARM_MESSAGE); + + if (count == 3) + break; + else + count++; + } + + if (availableLanguages.Count < 3 && defAlarmsNamesEn != null) + if (!RedisController.WriteAlarmsConfigCurr(defAlarmsNamesEn)) + Manage(ERROR_LEVEL.FATAL, CMS_CONNECT_SETUP_ALARM_MESSAGE); + else if (availableLanguages.Count < 3 && defAlarmsNamesIt != null) + if (!RedisController.WriteAlarmsConfigCurr(defAlarmsNamesIt)) + Manage(ERROR_LEVEL.FATAL, CMS_CONNECT_SETUP_ALARM_MESSAGE); + + } + catch (ThreadAbortException) + { + ncHandler.Dispose(); + } + } #endregion Functions #region SupportFunctions @@ -1212,6 +1276,39 @@ public static class ThreadsFunctions return false; } + private static Dictionary GetPlcAlarmsTranslations(string language) + { + using (NcHandler ncHandler = new NcHandler()) + { + Dictionary returnValue = new Dictionary(); + + Dictionary messages = new Dictionary(); + // Read data from CN + ncHandler.numericalControl.NC_GetTranslatedPlcMessages(language, ref messages); // Avoid checking error because in the worst case "messages" is empty + + // Id start from 1 + for (int i = 1; i <= 1024; i++) + { + // Get configurated alarms + var tmpAlarmConfig = InitialAlarmsConfig.Where(x => x.PlcId == i).FirstOrDefault(); + // Default string + string message = string.Format(NOT_CONFIGURATED_ALARM_MESSAGE, i); + // If is configurated + if (tmpAlarmConfig != null) + { + // Find translated string + message = messages.Where(x => x.Key == tmpAlarmConfig.AlarmId).FirstOrDefault().Value; + if (message == null) + message = string.Format(NOT_FOUND_ALARM_MESSAGE, i); + } + // Add to dictionary + returnValue.Add(i.ToString("D6") + "|900",message); + } + return returnValue; + } + } + + [DllImport("user32.dll")] static extern bool SetForegroundWindow(IntPtr hWnd); diff --git a/Step.Core/ThreadsHandler.cs b/Step.Core/ThreadsHandler.cs index 98b01429..6fbf69f1 100644 --- a/Step.Core/ThreadsHandler.cs +++ b/Step.Core/ThreadsHandler.cs @@ -29,6 +29,7 @@ namespace Step.Core ThreadsFunctions.ReadM154Data // ThreadsFunctions.ReadNcSoftKeysData, }; + private static Action ThreadSetupCmsConnect = ThreadsFunctions.SetupCmsConnect; private volatile static List RunningThreadsList = new List(); public static Thread StartClient; @@ -38,6 +39,14 @@ namespace Step.Core public static void Start() { ThreadsFunctions.RestoreConnection(); + + //Setup CMS Connect + if(Config.ServerConfig.CmsConnectConfig.Enabled) + { + Thread t = new Thread(() => ThreadSetupCmsConnect()); + t.Start(); + } + } public static void StartWorkers() diff --git a/Step.Database/Controllers/RedisController.cs b/Step.Database/Controllers/RedisController.cs index cbc6c94e..bcbce2fb 100644 --- a/Step.Database/Controllers/RedisController.cs +++ b/Step.Database/Controllers/RedisController.cs @@ -13,6 +13,9 @@ namespace Step.Database.Controllers private const String redisProdNameAddress = "Machine:ProductionProcesses:%NN%:Programs:01:Name"; private const String redisRepsTargetAddress = "Machine:ProductionProcesses:%NN%:Programs:01:RepsTarget"; private const String redisRepsDoneAddress = "Machine:ProductionProcesses:%NN%:Programs:01:RepsDone"; + private const String redisAlmCurr = "AdpConf:Plc:Condition:Curr"; + private const String redisAlmIt = "AdpConf:Plc:Condition:It"; + private const String redisAlmEn = "AdpConf:Plc:Condition:En"; public static void WriteProductionNotification(uint ProductionProcess, string Notification) { @@ -38,6 +41,24 @@ namespace Step.Database.Controllers redUtil.man.setRSV(redisHash, RepsDone); } + public static bool WriteAlarmsConfigCurr(Dictionary alarms) + { + string redisHash = redUtil.man.redHash(redisAlmCurr); + return redUtil.man.redSaveHashDict(redisHash, alarms); + } + + public static bool WriteAlarmsConfigEn(Dictionary alarms) + { + string redisHash = redUtil.man.redHash(redisAlmEn); + return redUtil.man.redSaveHashDict(redisHash, alarms); + } + + public static bool WriteAlarmsConfigIt(Dictionary alarms) + { + string redisHash = redUtil.man.redHash(redisAlmIt); + return redUtil.man.redSaveHashDict(redisHash, alarms); + } + } } diff --git a/Step.Model/Constants.cs b/Step.Model/Constants.cs index 29cf06cf..fb16ec81 100644 --- a/Step.Model/Constants.cs +++ b/Step.Model/Constants.cs @@ -8,6 +8,7 @@ namespace Step.Model public static bool IS_BETA = true; public static string NOT_FOUND_ALARM_MESSAGE = "Alarm_id_{0} : Message not found"; public static string NOT_CONFIGURATED_ALARM_MESSAGE = "Alarm_id_{0} : Message not configurated"; + public static string CMS_CONNECT_SETUP_ALARM_MESSAGE = "Error during CMS-Connect setup: Redis Db Not Found"; public static int DATABASE_PROCESS_TIMEOUT = 5; //Costanti Tipo metreica utensili