From 06cdac822b90176f62a2d5f7407286fe48e27fd9 Mon Sep 17 00:00:00 2001 From: "Samuele E. Locatelli" Date: Thu, 4 Feb 2021 16:51:49 +0100 Subject: [PATCH] update letture IO --- CMS_CORE_Library/NcThermo.cs | 9 +- CMS_CORE_Library/S7Net/Nc_S7Net.cs | 253 ++++++++--------------------- CMS_CORE_Library/Utils/Nc_Utils.cs | 24 +++ 3 files changed, 99 insertions(+), 187 deletions(-) diff --git a/CMS_CORE_Library/NcThermo.cs b/CMS_CORE_Library/NcThermo.cs index 515864d..52124f4 100644 --- a/CMS_CORE_Library/NcThermo.cs +++ b/CMS_CORE_Library/NcThermo.cs @@ -797,14 +797,17 @@ namespace CMS_CORE_Library /// public abstract CmsError PLC_WModeSel(int mode); /// - /// Read PLC current IO hannels data + /// Read PLC current IO Channels visibility (conf) /// - /// updates only VALUE readout /// Visibility status for all channels + public abstract CmsError PLC_RIOChannelsConf(ref ThermoModels.ChanIOVis currThermoIOVis); + /// + /// Read PLC current IO Channels VALUES (actual + forced) + /// /// Values for channels /// Indicates if values are forced by UI /// Values forced by UI - public abstract CmsError PLC_RIOChannels(bool onlyVal, ref ThermoModels.ChanIOVis currThermoIOVis, ref ThermoModels.ChanIOVal currThermoIOVal, ref ThermoModels.ChanIOFor currThermoIOFor, ref ThermoModels.ChanIOValFor currThermoIOValFor); + public abstract CmsError PLC_RIOChannelsVal(ref ThermoModels.ChanIOVal currThermoIOVal, ref ThermoModels.ChanIOFor currThermoIOFor, ref ThermoModels.ChanIOValFor currThermoIOValFor); #endregion THERMO high level data diff --git a/CMS_CORE_Library/S7Net/Nc_S7Net.cs b/CMS_CORE_Library/S7Net/Nc_S7Net.cs index d167384..45203ab 100644 --- a/CMS_CORE_Library/S7Net/Nc_S7Net.cs +++ b/CMS_CORE_Library/S7Net/Nc_S7Net.cs @@ -2601,7 +2601,7 @@ namespace CMS_CORE_Library.S7Net return NO_ERROR; } - + /// /// Refresh recipE parameters RT @@ -3736,30 +3736,39 @@ namespace CMS_CORE_Library.S7Net return NO_ERROR; } - /// - /// Read PLC current IO hannels data + /// + /// Read PLC current IO Channels visibility (conf) /// - /// updates only RT parameters (false = update all) /// Visibility status for all channels + /// + public override CmsError PLC_RIOChannelsConf(ref ThermoModels.ChanIOVis currThermoIOVis) + { + CmsError currError = NO_ERROR; + // refresh dati + refreshChIOVisib(); + + // copio liste in output... + currThermoIOVis = ThermoIOVis; + + // esco + return currError; + } + /// + /// Read PLC current IO Channels VALUES (actual + forced) + /// /// Values for channels /// Indicates if values are forced by UI /// Values forced by UI /// - public override CmsError PLC_RIOChannels(bool onlyVal, ref ThermoModels.ChanIOVis currThermoIOVis, ref ThermoModels.ChanIOVal currThermoIOVal, ref ThermoModels.ChanIOFor currThermoIOFor, ref ThermoModels.ChanIOValFor currThermoIOValFor) + public override CmsError PLC_RIOChannelsVal(ref ThermoModels.ChanIOVal currThermoIOVal, ref ThermoModels.ChanIOFor currThermoIOFor, ref ThermoModels.ChanIOValFor currThermoIOValFor) { CmsError currError = NO_ERROR; // refresh dati veloci (valori) refreshChIOVal(); - // se richiesto NON SOLO RT faccio refresh anche dati "lenti" - if (!onlyVal) - { - refreshChIOVisib(); - refreshChIOForced(); - refreshChIOForcedVal(); - } + refreshChIOForced(); + refreshChIOForcedVal(); // copio liste in output... - currThermoIOVis = ThermoIOVis; currThermoIOVal = ThermoIOVal; currThermoIOFor = ThermoIOFor; currThermoIOValFor = ThermoIOValFor; @@ -3775,52 +3784,32 @@ namespace CMS_CORE_Library.S7Net protected CmsError refreshChIOVal() { CmsError libraryError = NO_ERROR; -#if false - List currMem = new List(); - int packSize = 8; + List readValuesDI = new List(); + List readValuesDO = new List(); + List readValuesAI = new List(); + List readValuesAO = new List(); - // leggo da PLC a array di byte di appoggio... - libraryError = MEM_RWByteList(R, 0, PARAMETER_RT_DATA.MemType, PARAMETER_RT_DATA.Address, PARAMETER_RT_DATA.SubAddress, 0, PARAMETER_RT_DATA.Size, ref currMem); + // leggo da PLC a array di byte di appoggio x visibilità DI... + libraryError = MEM_RWWordList(R, 0, IO_DI_VAL_ACT.MemType, IO_DI_VAL_ACT.Address, IO_DI_VAL_ACT.SubAddress, IO_DI_VAL_ACT.Size, ref readValuesDI); + if (libraryError.IsError()) + return libraryError; + // leggo da PLC a array di byte di appoggio x visibilità DO... + libraryError = MEM_RWWordList(R, 0, IO_DO_VAL_ACT.MemType, IO_DO_VAL_ACT.Address, IO_DO_VAL_ACT.SubAddress, IO_DO_VAL_ACT.Size, ref readValuesDO); + if (libraryError.IsError()) + return libraryError; + // leggo da PLC a array di byte di appoggio x visibilità AI... + libraryError = MEM_RWShortList(R, 0, IO_AI_VAL_ACT.MemType, IO_AI_VAL_ACT.Address, IO_AI_VAL_ACT.SubAddress, IO_AI_VAL_ACT.Size, ref readValuesAI); + if (libraryError.IsError()) + return libraryError; + // leggo da PLC a array di byte di appoggio x visibilità AO... + libraryError = MEM_RWShortList(R, 0, IO_AO_VAL_ACT.MemType, IO_AO_VAL_ACT.Address, IO_AO_VAL_ACT.SubAddress, IO_AO_VAL_ACT.Size, ref readValuesAO); if (libraryError.IsError()) return libraryError; - // controllo SE ho dati... - if (currMem.Count > 0) - { - // converto a blocchi di 8 byte... - byte[] memArray = currMem.ToArray(); - for (int i = 0; i < PARAMETER_RT_DATA.Size / packSize; i++) - { - PlcParamRT currParam = new PlcParamRT(memArray.Skip(i * packSize).Take(packSize).ToArray()); - // solo se ID > 0... - if (currParam.Id > 0) - { - // update oggetto thermoParamList... - if (ThermoParamList.ContainsKey(currParam.Id)) - { - try - { - ThermoParamList[currParam.Id].Enabled = currParam.Enabled; - ThermoParamList[currParam.Id].HasError = currParam.HasError; - ThermoParamList[currParam.Id].Visible = currParam.Visible; - ThermoParamList[currParam.Id].ValueAct = currParam.ValueAct; - } - catch - { } - } - else - { - try - { - ThermoParamList.Add(currParam.Id, new ThermoModels.RecipeParam() { Id = currParam.Id, Enabled = currParam.Enabled, HasError = currParam.HasError, Visible = currParam.Visible, ValueAct = currParam.ValueAct }); - } - catch - { } - } - } - } - } -#endif + ThermoIOVal.DI = convToDictIntBol(readValuesDI); + ThermoIOVal.DO = convToDictIntBol(readValuesDO); + ThermoIOVal.AI = convToDictIntInt(readValuesAI); + ThermoIOVal.AO = convToDictIntInt(readValuesAO); return libraryError; } @@ -3831,7 +3820,6 @@ namespace CMS_CORE_Library.S7Net protected CmsError refreshChIOVisib() { CmsError libraryError = NO_ERROR; - Byte[] byteArray = null; List readValuesDI = new List(); List readValuesDO = new List(); List readValuesAI = new List(); @@ -3854,28 +3842,15 @@ namespace CMS_CORE_Library.S7Net if (libraryError.IsError()) return libraryError; - ThermoIOVis.DI = convShortToDict(readValuesDI); - ThermoIOVis.DO = convShortToDict(readValuesDO); - ThermoIOVis.AI = convShortToDict(readValuesAI); - ThermoIOVis.AO = convShortToDict(readValuesAO); + ThermoIOVis.DI = convToDictIntBol(readValuesDI); + ThermoIOVis.DO = convToDictIntBol(readValuesDO); + ThermoIOVis.AI = convToDictIntBol(readValuesAI); + ThermoIOVis.AO = convToDictIntBol(readValuesAO); return libraryError; } - internal static Dictionary convShortToDict(List origVal) - { - Byte[] byteArray = null; - // Convert List into Byte Array - byteArray = origVal.SelectMany(j => BitConverter.GetBytes(j)).ToArray(); - // converto a bit - BitArray bitArr = new BitArray(byteArray); - Dictionary answ = new Dictionary(); - for (int i = 0; i < bitArr.Count; i++) - { - answ.Add(i, bitArr[i]); - } - return answ; - } + /// /// Refresh recipe parameters @@ -3883,65 +3858,20 @@ namespace CMS_CORE_Library.S7Net protected CmsError refreshChIOForcedVal() { CmsError libraryError = NO_ERROR; -#if false - List currMem = new List(); - int packSize = 20; + List readValuesDO = new List(); + List readValuesAO = new List(); - // leggo da PLC a array di byte di appoggio... - libraryError = MEM_RWByteList(R, 0, PARAMETER_DATA.MemType, PARAMETER_DATA.Address, PARAMETER_DATA.SubAddress, 0, PARAMETER_DATA.Size, ref currMem); + // leggo da PLC a array di byte di appoggio x visibilità DO... + libraryError = MEM_RWWordList(R, 0, IO_DO_VAL_FOR.MemType, IO_DO_VAL_FOR.Address, IO_DO_VAL_FOR.SubAddress, IO_DO_VAL_FOR.Size, ref readValuesDO); + if (libraryError.IsError()) + return libraryError; + // leggo da PLC a array di byte di appoggio x visibilità AO... + libraryError = MEM_RWShortList(R, 0, IO_AO_VAL_FOR.MemType, IO_AO_VAL_FOR.Address, IO_AO_VAL_FOR.SubAddress, IO_AO_VAL_FOR.Size, ref readValuesAO); if (libraryError.IsError()) return libraryError; - - - // controllo SE ho dati... - if (currMem.Count > 0) - { - // converto a blocchi di 8 byte... - byte[] memArray = currMem.ToArray(); - - for (int i = 0; i < PARAMETER_DATA.Size / packSize; i++) - { - PlcParam currParam = new PlcParam(memArray.Skip(i * packSize).Take(packSize).ToArray()); - // solo se ID > 0... - if (currParam.Id > 0) - { - // update oggetto thermoParamList... - if (ThermoParamList.ContainsKey(currParam.Id)) - { - try - { - ThermoParamList[currParam.Id].SetpointHMI = currParam.SetpointHMI; - ThermoParamList[currParam.Id].SetpointPLC = currParam.SetpointPLC; - ThermoParamList[currParam.Id].ValMax = currParam.ValMax; - ThermoParamList[currParam.Id].ValMin = currParam.ValMin; - ThermoParamList[currParam.Id].UnitMeasure = currParam.UnitMeasure; - } - catch - { } - } - else - { - try - { - ThermoParamList.Add(currParam.Id, new ThermoModels.RecipeParam() { Id = currParam.Id, SetpointHMI = currParam.SetpointHMI, SetpointPLC = currParam.SetpointPLC, ValMax = currParam.ValMax, ValMin = currParam.ValMin, UnitMeasure = currParam.UnitMeasure }); - } - catch - { } - } - } - else - { - libraryError = S7_PLC_WRONG_DATA; - } - } - } - else - { - libraryError = S7_PLC_EMPTY_READ; - } -#endif - + ThermoIOValFor.DO = convToDictIntBol(readValuesDO); + ThermoIOValFor.AO = convToDictIntInt(readValuesAO); return libraryError; } @@ -3951,65 +3881,20 @@ namespace CMS_CORE_Library.S7Net protected CmsError refreshChIOForced() { CmsError libraryError = NO_ERROR; -#if false - List currMem = new List(); - int packSize = 20; + List readValuesDO = new List(); + List readValuesAO = new List(); - // leggo da PLC a array di byte di appoggio... - libraryError = MEM_RWByteList(R, 0, PARAMETER_DATA.MemType, PARAMETER_DATA.Address, PARAMETER_DATA.SubAddress, 0, PARAMETER_DATA.Size, ref currMem); + // leggo da PLC a array di byte di appoggio x visibilità DO... + libraryError = MEM_RWWordList(R, 0, IO_DO_FORCE.MemType, IO_DO_FORCE.Address, IO_DO_FORCE.SubAddress, IO_DO_FORCE.Size, ref readValuesDO); + if (libraryError.IsError()) + return libraryError; + // leggo da PLC a array di byte di appoggio x visibilità AO... + libraryError = MEM_RWWordList(R, 0, IO_AO_FORCE.MemType, IO_AO_FORCE.Address, IO_AO_FORCE.SubAddress, IO_AO_FORCE.Size, ref readValuesAO); if (libraryError.IsError()) return libraryError; - - - // controllo SE ho dati... - if (currMem.Count > 0) - { - // converto a blocchi di 8 byte... - byte[] memArray = currMem.ToArray(); - - for (int i = 0; i < PARAMETER_DATA.Size / packSize; i++) - { - PlcParam currParam = new PlcParam(memArray.Skip(i * packSize).Take(packSize).ToArray()); - // solo se ID > 0... - if (currParam.Id > 0) - { - // update oggetto thermoParamList... - if (ThermoParamList.ContainsKey(currParam.Id)) - { - try - { - ThermoParamList[currParam.Id].SetpointHMI = currParam.SetpointHMI; - ThermoParamList[currParam.Id].SetpointPLC = currParam.SetpointPLC; - ThermoParamList[currParam.Id].ValMax = currParam.ValMax; - ThermoParamList[currParam.Id].ValMin = currParam.ValMin; - ThermoParamList[currParam.Id].UnitMeasure = currParam.UnitMeasure; - } - catch - { } - } - else - { - try - { - ThermoParamList.Add(currParam.Id, new ThermoModels.RecipeParam() { Id = currParam.Id, SetpointHMI = currParam.SetpointHMI, SetpointPLC = currParam.SetpointPLC, ValMax = currParam.ValMax, ValMin = currParam.ValMin, UnitMeasure = currParam.UnitMeasure }); - } - catch - { } - } - } - else - { - libraryError = S7_PLC_WRONG_DATA; - } - } - } - else - { - libraryError = S7_PLC_EMPTY_READ; - } -#endif - + ThermoIOFor.DO = convToDictIntBol(readValuesDO); + ThermoIOFor.AO = convToDictIntBol(readValuesAO); return libraryError; } diff --git a/CMS_CORE_Library/Utils/Nc_Utils.cs b/CMS_CORE_Library/Utils/Nc_Utils.cs index c12d8ff..5bf8de1 100644 --- a/CMS_CORE_Library/Utils/Nc_Utils.cs +++ b/CMS_CORE_Library/Utils/Nc_Utils.cs @@ -166,6 +166,30 @@ namespace CMS_CORE_Library.Utils return String.Empty; } + internal static Dictionary convToDictIntBol(List origVal) + { + Byte[] byteArray = null; + // Convert List into Byte Array + byteArray = origVal.SelectMany(j => BitConverter.GetBytes(j)).ToArray(); + // converto a bit + BitArray bitArr = new BitArray(byteArray); + Dictionary answ = new Dictionary(); + for (int i = 0; i < bitArr.Count; i++) + { + answ.Add(i, bitArr[i]); + } + return answ; + } + internal static Dictionary convToDictIntInt(List origVal) + { + Dictionary answ = new Dictionary(); + for (int i = 0; i < origVal.Count; i++) + { + answ.Add(i, origVal[i]); + } + return answ; + } + // Convert one integer in array of bools internal static bool[] IntToBits(int val) {