diff --git a/Libs/CMS_CORE_Library.dll b/Libs/CMS_CORE_Library.dll index 90f616fc..1f9aa0e4 100644 Binary files a/Libs/CMS_CORE_Library.dll and b/Libs/CMS_CORE_Library.dll differ diff --git a/Step.Config/ServerConfig.cs b/Step.Config/ServerConfig.cs index cd084a08..1c143297 100644 --- a/Step.Config/ServerConfig.cs +++ b/Step.Config/ServerConfig.cs @@ -32,8 +32,8 @@ namespace Step.Config public static AreasConfigModel JobEditorConfig; - public static List ProductionScada = new List(); - public static List Scadas = new List(); + public static List ProductionScadaSchema = new List(); + public static List ConfiguredScadaSchema = new List(); public static List MacrosConfig; } diff --git a/Step.Config/ServerConfigController.cs b/Step.Config/ServerConfigController.cs index 62553571..39e130af 100644 --- a/Step.Config/ServerConfigController.cs +++ b/Step.Config/ServerConfigController.cs @@ -197,9 +197,9 @@ namespace Step.Config .ToArray(); if (schema.IsInProductionPage == true) - ProductionScada.Add(schema); + ProductionScadaSchema.Add(schema); else - Scadas.Add(schema); + ConfiguredScadaSchema.Add(schema); } } diff --git a/Step.Core/ThreadsFunctions.cs b/Step.Core/ThreadsFunctions.cs index 21c7ac43..79b1096d 100644 --- a/Step.Core/ThreadsFunctions.cs +++ b/Step.Core/ThreadsFunctions.cs @@ -2,6 +2,7 @@ using Step.Core; using Step.Model.DTOModels; using Step.Model.DTOModels.AlarmModels; +using Step.Model.DTOModels.Scada; using Step.Model.DTOModels.ToolModels; using Step.NC; using System.Collections.Generic; @@ -26,7 +27,6 @@ public static class ThreadsFunctions private static long ReadToolDataTimer = 0, ReadToolDataTimes = 0; private static long WatchdogTimer = 0, WatchdogTimes = 0; - private static Thread ConnThread; #region Functions @@ -715,6 +715,45 @@ public static class ThreadsFunctions } } + public static void ReadScadaData() + { + 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.ReadScadaData(out List scadas); + if (libraryError.IsError()) + ManageLibraryError(libraryError); + + // MessageServices.Current.Publish(NC_MAGAZINE_IS_ACTIVE, null, status); + } + else + RestoreConnection(); + sw.Stop(); + + // Wait + Thread.Sleep(CalcSleepTime(500 , (int)sw.ElapsedMilliseconds)); + } + } + catch (ThreadAbortException) + { + } + } + #endregion Functions #region SupportFunctions diff --git a/Step.Core/ThreadsHandler.cs b/Step.Core/ThreadsHandler.cs index 37c160b6..1ced7821 100644 --- a/Step.Core/ThreadsHandler.cs +++ b/Step.Core/ThreadsHandler.cs @@ -24,7 +24,8 @@ namespace Step.Core ThreadsFunctions.ReadActiveProgramData, ThreadsFunctions.UpdateToolsData, ThreadsFunctions.ReadNcMagazineActive, - ThreadsFunctions.ReadPartProgramQueueData + ThreadsFunctions.ReadPartProgramQueueData, + ThreadsFunctions.ReadScadaData // ThreadsFunctions.ReadNcSoftKeysData, }; diff --git a/Step.Model/DTOModels/Scada/ScadaSchemaModel.cs b/Step.Model/DTOModels/Scada/ScadaSchemaModel.cs index 55ce39b8..5bf50694 100644 --- a/Step.Model/DTOModels/Scada/ScadaSchemaModel.cs +++ b/Step.Model/DTOModels/Scada/ScadaSchemaModel.cs @@ -195,8 +195,8 @@ namespace Step.Model.DTOModels.Scada public class ScadaSchemaInputDataModel { - [XmlElement("memVisibleIndex")] - public string MemVisibleIndex { get; set; } + [XmlElement("memEnabledIndex")] + public string MemEnabledIndex { get; set; } [XmlElement("memValueIndex")] public string MemValueIndex { get; set; } diff --git a/Step.NC/NcHandler.cs b/Step.NC/NcHandler.cs index 414e3b53..1fdcca50 100644 --- a/Step.NC/NcHandler.cs +++ b/Step.NC/NcHandler.cs @@ -2378,13 +2378,13 @@ namespace Step.NC #endregion Osai/Fanuc Tools - public CmsError ReadScadaData() + public CmsError ReadScadaData(out List scadas) { CmsError cmsError = NO_ERROR; - List scadas = new List(); + scadas = new List(); DTOScadaModel scada = new DTOScadaModel(); - foreach (var prodScada in ProductionScada) + foreach (var prodScada in ProductionScadaSchema) { scada = new DTOScadaModel() { @@ -2404,7 +2404,7 @@ namespace Step.NC if(layer.Buttons.ElementAt(i) != null) { // Read enabled from PLC - cmsError = numericalControl.PLC_RScadaValue(layer.Buttons[i].Status.MemEnabledIndex, ref val); + cmsError = numericalControl.PLC_RScadaValue(layer.Buttons[i].Status.MemEnabledIndex, SCADA_MEM_TYPE.BOOL, ref val); if (cmsError.IsError()) return cmsError; // Populate & add new object into scada model @@ -2419,7 +2419,7 @@ namespace Step.NC if (layer.Images.ElementAt(i) != null) { // Read isVisible from PLC - cmsError = numericalControl.PLC_RScadaValue(layer.Images[i].Status.MemVisibleIndex, ref val); + cmsError = numericalControl.PLC_RScadaValue(layer.Images[i].Status.MemVisibleIndex, SCADA_MEM_TYPE.BOOL, ref val); if (cmsError.IsError()) return cmsError; // Populate & add new object into scada model @@ -2434,7 +2434,7 @@ namespace Step.NC if(layer.ProgressBars.ElementAt(i) != null) { // Read value from PLC - cmsError = numericalControl.PLC_RScadaValue(layer.ProgressBars[i].MemValueIndex, ref val); + cmsError = numericalControl.PLC_RScadaValue(layer.ProgressBars[i].MemValueIndex, SCADA_MEM_TYPE.BYTE, ref val); if (cmsError.IsError()) return cmsError; // Populate & add new object into scada model @@ -2445,15 +2445,15 @@ namespace Step.NC }); } - if (layer.Inputs.ElementAt(i) != null) + if (layer.Inputs.ElementAt(i) != null && layer.Inputs[i].Status.Action == "read") { // Read isVisible from PLC - cmsError = numericalControl.PLC_RScadaValue(layer.Inputs[i].Status.MemVisibleIndex, ref val); + cmsError = numericalControl.PLC_RScadaValue(layer.Inputs[i].Status.MemEnabledIndex, SCADA_MEM_TYPE.BOOL, ref val); if (cmsError.IsError()) - return cmsError; + return cmsError; // Read value from PLC - cmsError = numericalControl.PLC_RScadaValue(layer.Inputs[i].Status.MemValueIndex, ref val2); + cmsError = numericalControl.PLC_RScadaValue(layer.Inputs[i].Status.MemValueIndex, GetMemTypeFromString(layer.Inputs[i].Status.Type), ref val2); if (cmsError.IsError()) return cmsError; @@ -2470,11 +2470,34 @@ namespace Step.NC } } } + + scadas.Add(scada); } return cmsError; } + private SCADA_MEM_TYPE GetMemTypeFromString(string memType) + { + switch (memType) + { + case "BOOL": + return SCADA_MEM_TYPE.BOOL; + + case "BYTE": + return SCADA_MEM_TYPE.BYTE; + + case "WORD": + return SCADA_MEM_TYPE.WORD; + + case "INT": + return SCADA_MEM_TYPE.INT; + + default: + return SCADA_MEM_TYPE.BOOL; + } + } + //DTOScadaModel scada = new DTOScadaModel //{ // Layers = prodScada.Layers.Select(x => new DTOScadaLayerModel() diff --git a/Step/Controllers/WebApi/ScadaController.cs b/Step/Controllers/WebApi/ScadaController.cs new file mode 100644 index 00000000..25404c9c --- /dev/null +++ b/Step/Controllers/WebApi/ScadaController.cs @@ -0,0 +1,66 @@ +using CMS_CORE_Library.Models; +using Step.Model.DTOModels.Scada; +using Step.NC; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web.Http; +using static Step.Config.ServerConfig; + +namespace Step.Controllers.WebApi +{ + [RoutePrefix("api/scada")] + public class ScadaController : ApiController + { + [Route("list")] + public IHttpActionResult GetScadaList() + { + using (NcHandler ncHandler = new NcHandler()) + { + ncHandler.Connect(); + CmsError cmsError = ncHandler.ReadScadaData(out List values); + if (cmsError.IsError()) + return BadRequest(cmsError.localizationKey); + + + ScadaDataAndSchema data = new ScadaDataAndSchema() + { + schemes = ConfiguredScadaSchema, + values = values + }; + + return Ok(data); + } + } + + + [Route("production/list")] + public IHttpActionResult GetProductionPageList() + { + using(NcHandler ncHandler = new NcHandler()) + { + ncHandler.Connect(); + CmsError cmsError = ncHandler.ReadScadaData(out List values); + if (cmsError.IsError()) + return BadRequest(cmsError.localizationKey); + + + ScadaDataAndSchema data = new ScadaDataAndSchema() + { + schemes = ProductionScadaSchema, + values = values + }; + + return Ok(data); + } + } + + public class ScadaDataAndSchema + { + public List schemes; + public List values; + } + } +} diff --git a/Step/Step.csproj b/Step/Step.csproj index 8ee32a58..fa433db7 100644 --- a/Step/Step.csproj +++ b/Step/Step.csproj @@ -178,6 +178,7 @@ +