From cd1c87caa1d83d8f6193b6a464a117b8bb4b437e Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Fri, 23 Oct 2020 19:55:20 +0200 Subject: [PATCH 1/6] staret thermocam modifications --- CMS_CORE_Library/Models/ThermoModels.cs | 597 +++++++++++++++--------- CMS_CORE_Library/NcThermo.cs | 10 +- CMS_CORE_Library/S7Net/Nc_S7Net.cs | 83 +++- 3 files changed, 457 insertions(+), 233 deletions(-) diff --git a/CMS_CORE_Library/Models/ThermoModels.cs b/CMS_CORE_Library/Models/ThermoModels.cs index 18e0516..e696472 100644 --- a/CMS_CORE_Library/Models/ThermoModels.cs +++ b/CMS_CORE_Library/Models/ThermoModels.cs @@ -6,19 +6,151 @@ namespace CMS_CORE_Library.Models { public class ThermoModels { - #region Thermo models + + #region Fields protected const double EPSILON = 0.1; + #endregion Fields + + #region Classes + + /// + /// Single AXIS Info Data + /// + public class AxisInfo + { + + #region Properties + + public int ControlWord { get; set; } = 0; + public int ErrorCode { get; set; } = 0; + public int Id { get; set; } = 0; + public int MovPhase { get; set; } = 0; + public int StatusWord { get; set; } = 0; + public double TargetPos { get; set; } = 0; + + #endregion Properties + + #region Methods + + public override bool Equals(object obj) + { + // Object is not a GaugeModel instance + if (!(obj is AxisInfo item)) + return false; + + if (Id != item.Id) + return false; + if (ErrorCode != item.ErrorCode) + return false; + if (MovPhase != item.MovPhase) + return false; + if (StatusWord != item.StatusWord) + return false; + if (ControlWord != item.ControlWord) + return false; + if (TargetPos != item.TargetPos) + return false; + return true; + } + public override int GetHashCode() + { + return base.GetHashCode(); + } + + #endregion Methods + + } + + /// + /// Single AXIS RealTime (positions / movement) Data + /// + public class AxisRT + { + + #region Constructors + + /// + /// Deserializzazione da byte ad oggetto AxisRT + /// + /// + public AxisRT(int currId, byte[] rawData) + { + // converto i dati da byte grezzi ai 3 componenti... + Id = currId; + Position = S7.Net.Types.Double.FromByteArray(rawData.Skip(0).Take(4).ToArray()); + Speed = S7.Net.Types.Double.FromByteArray(rawData.Skip(4).Take(4).ToArray()); + Load = S7.Net.Types.Double.FromByteArray(rawData.Skip(8).Take(4).ToArray()); + } + + #endregion Constructors + + #region Properties + + public int Id { get; set; } = 0; + public double Load { get; set; } = 0; + public double Position { get; set; } = 0; + public double Speed { get; set; } = 0; + + #endregion Properties + + #region Methods + + /// + /// Converte un singolo item in un array di byte per scrittura su PLC S7 + /// + /// + public byte[] convertToByte() + { + byte[] answ = new byte[12]; + Buffer.BlockCopy(S7.Net.Types.Double.ToByteArray(Position), 0, answ, 0, 4); + Buffer.BlockCopy(S7.Net.Types.Double.ToByteArray(Speed), 0, answ, 4, 4); + Buffer.BlockCopy(S7.Net.Types.Double.ToByteArray(Load), 0, answ, 8, 4); + return answ; + } + + public override bool Equals(object obj) + { + // Object is not a GaugeModel instance + if (!(obj is AxisRT item)) + return false; + + if (Id != item.Id) + return false; + if (Position != item.Position) + return false; + if (Speed != item.Speed) + return false; + if (Load != item.Load) + return false; + return true; + } + public override int GetHashCode() + { + return base.GetHashCode(); + } + + #endregion Methods + + } + /// /// Represents thermo LIVE prod data (gauge, time adv...) /// public class LiveProdDataModel { - public double TimeAdv { get; set; } = 0; - public double Power { get; set; } = 0; - public double Vacuum { get; set; } = 0; + + #region Properties + public double Air { get; set; } = 0; + public double Power { get; set; } = 0; + public double TimeAdv { get; set; } = 0; + public double Vacuum { get; set; } = 0; + + #endregion Properties + + #region Methods public override bool Equals(object obj) { @@ -45,169 +177,31 @@ namespace CMS_CORE_Library.Models { return base.GetHashCode(); } + + #endregion Methods + } - /// - /// Recipe Parameters - /// - public class RecipeParam - { - public short Id { get; set; } = 0; - public double SetpointHMI { get; set; } = 0; - public double SetpointPLC { get; set; } = 0; - public double ValMax { get; set; } = 0; - public double ValMin { get; set; } = 0; - public ushort UnitMeasure { get; set; } = 0; - public bool Visible { get; set; } = false; - public bool Enabled { get; set; } = false; - public bool HasError { get; set; } = false; - public double ValueAct { get; set; } = 0; - public int ScaleFactor { get; set; } = 1; - - public override bool Equals(object obj) - { - // Object is not a GaugeModel instance - if (!(obj is RecipeParam item)) - return false; - - if (Id != item.Id) - return false; - if (SetpointHMI != item.SetpointHMI) - return false; - if (SetpointPLC != item.SetpointPLC) - return false; - if (ValMax != item.ValMax) - return false; - if (ValMin != item.ValMin) - return false; - if (UnitMeasure != item.UnitMeasure) - return false; - if (Visible != item.Visible) - return false; - if (Enabled != item.Enabled) - return false; - if (HasError != item.HasError) - return false; - if (ValueAct != item.ValueAct) - return false; - if (ScaleFactor != item.ScaleFactor) - return false; - - return true; - } - public override int GetHashCode() - { - return base.GetHashCode(); - } - } - /// - /// Single AXIS RealTime (positions / movement) Data - /// - public class AxisRT - { - public int Id { get; set; } = 0; - public double Position { get; set; } = 0; - public double Speed { get; set; } = 0; - public double Load { get; set; } = 0; - - - public override bool Equals(object obj) - { - // Object is not a GaugeModel instance - if (!(obj is AxisRT item)) - return false; - - if (Id != item.Id) - return false; - if (Position != item.Position) - return false; - if (Speed != item.Speed) - return false; - if (Load != item.Load) - return false; - return true; - } - public override int GetHashCode() - { - return base.GetHashCode(); - } - - /// - /// Deserializzazione da byte ad oggetto AxisRT - /// - /// - public AxisRT(int currId, byte[] rawData) - { - // converto i dati da byte grezzi ai 3 componenti... - Id = currId; - Position = S7.Net.Types.Double.FromByteArray(rawData.Skip(0).Take(4).ToArray()); - Speed = S7.Net.Types.Double.FromByteArray(rawData.Skip(4).Take(4).ToArray()); - Load = S7.Net.Types.Double.FromByteArray(rawData.Skip(8).Take(4).ToArray()); - } - /// - /// Converte un singolo item in un array di byte per scrittura su PLC S7 - /// - /// - public byte[] convertToByte() - { - byte[] answ = new byte[12]; - Buffer.BlockCopy(S7.Net.Types.Double.ToByteArray(Position), 0, answ, 0, 4); - Buffer.BlockCopy(S7.Net.Types.Double.ToByteArray(Speed), 0, answ, 4, 4); - Buffer.BlockCopy(S7.Net.Types.Double.ToByteArray(Load), 0, answ, 8, 4); - return answ; - } - } - /// - /// Single AXIS Info Data - /// - public class AxisInfo - { - public int Id { get; set; } = 0; - public int ErrorCode { get; set; } = 0; - public int MovPhase { get; set; } = 0; - public int StatusWord { get; set; } = 0; - public int ControlWord { get; set; } = 0; - public double TargetPos { get; set; } = 0; - - public override bool Equals(object obj) - { - // Object is not a GaugeModel instance - if (!(obj is AxisInfo item)) - return false; - - if (Id != item.Id) - return false; - if (ErrorCode != item.ErrorCode) - return false; - if (MovPhase != item.MovPhase) - return false; - if (StatusWord != item.StatusWord) - return false; - if (ControlWord != item.ControlWord) - return false; - if (TargetPos != item.TargetPos) - return false; - return true; - } - public override int GetHashCode() - { - return base.GetHashCode(); - } - } - public class ModuleBlock { - public short Id { get; set; } = 0; + + #region Properties + public int ActualDelay { get; set; } = 0; public int ActualDuration { get; set; } = 0; public int EstimatedDelay { get; set; } = 0; public int EstimatedDuration { get; set; } = 0; - public List PrecedingId { get; set; } = new List(); - public bool Visible { get; set; } = false; - public bool Running { get; set; } = false; public bool HasError { get; set; } = false; + public short Id { get; set; } = 0; + public List PrecedingId { get; set; } = new List(); + public bool Running { get; set; } = false; public bool Terminated { get; set; } = false; + public bool Visible { get; set; } = false; + + #endregion Properties + + #region Methods public override bool Equals(object obj) { @@ -242,39 +236,41 @@ namespace CMS_CORE_Library.Models { return base.GetHashCode(); } + + #endregion Methods + } - public class WarmerChannel + public class ProdCycleModel { - public int IdChannel { get; set; } = 0; - public byte IdRefl { get; set; } = 0; - public byte SetpointHMI { get; set; } = 0; - public byte SetpointThermoCam { get; set; } = 0; - public byte SetpointPLC { get; set; } = 0; - public byte ChStatus { get; set; } = 0; - public double CurrAct { get; set; } = 0; - public byte PercAct { get; set; } = 0; - public int MaxPower { get; set; } = 0; + + #region Properties + + public ushort MessageId { get; set; } = 0; + public ushort Mode { get; set; } = 0; + public ushort Status { get; set; } = 0; + public ushort Submode { get; set; } = 0; + public uint TimeAdv { get; set; } = 0; + + #endregion Properties + + #region Methods public override bool Equals(object obj) { // Object is not a GaugeModel instance - if (!(obj is WarmerChannel item)) + if (!(obj is ProdCycleModel item)) return false; - if (IdChannel != item.IdChannel) + if (Status != item.Status) return false; - if (SetpointHMI != item.SetpointHMI) + if (MessageId != item.MessageId) return false; - if (SetpointThermoCam != item.SetpointThermoCam) + if (Mode != item.Mode) return false; - if (SetpointPLC != item.SetpointPLC) + if (Submode != item.Submode) return false; - if (ChStatus != item.ChStatus) - return false; - if (CurrAct != item.CurrAct) - return false; - if (PercAct != item.PercAct) + if (TimeAdv != item.TimeAdv) return false; return true; @@ -283,28 +279,61 @@ namespace CMS_CORE_Library.Models { return base.GetHashCode(); } - } + #endregion Methods + + } public class ProdInfoModel { + + #region Properties + public DateTime DtEvent { get; set; } = DateTime.Now; - public short NumTarget { get; set; } = 0; + public bool IsScrap { get; set; } = false; + public double MaterialTempEndVent { get; set; } = 0; + public double MaterialTempEndWarm { get; set; } = 0; + public double MoldTemp { get; set; } = 0; + public double MouldEnergyIN { get; set; } = 0; + public double MouldEnergyOUT { get; set; } = 0; public short NumDone { get; set; } = 0; + public short NumPreHot { get; set; } = 0; + public short NumTarget { get; set; } = 0; public short PreWarmCycle { get; set; } = 0; - public int TimeWarm { get; set; } = 0; - public int TimeVent { get; set; } = 0; - public int TimeVacuum { get; set; } = 0; public int TimeCycleGross { get; set; } = 0; public int TimeCycleNet { get; set; } = 0; - public double MaterialTempEndWarm { get; set; } = 0; - public double MaterialTempEndVent { get; set; } = 0; - public double MoldTemp { get; set; } = 0; + public int TimeVacuum { get; set; } = 0; + public int TimeVent { get; set; } = 0; + public int TimeWarm { get; set; } = 0; public double VacuumReadVal { get; set; } = 0; - public double MouldEnergyOUT { get; set; } = 0; - public double MouldEnergyIN { get; set; } = 0; - public bool IsScrap { get; set; } = false; - public short NumPreHot { get; set; } = 0; + + #endregion Properties + + #region Methods + + /// + /// Converte un singolo item in un array di byte per scrittura su PLC S7 + /// + /// + public byte[] convertToByte() + { + byte[] answ = new byte[50]; + Buffer.BlockCopy(S7.Net.Types.Int.ToByteArray(NumTarget), 0, answ, 0, 2); + Buffer.BlockCopy(S7.Net.Types.Int.ToByteArray(NumDone), 0, answ, 2, 2); + Buffer.BlockCopy(S7.Net.Types.Int.ToByteArray(PreWarmCycle), 0, answ, 4, 2); + Buffer.BlockCopy(S7.Net.Types.DInt.ToByteArray(TimeWarm), 0, answ, 6, 4); + Buffer.BlockCopy(S7.Net.Types.DInt.ToByteArray(TimeVent), 0, answ, 10, 4); + Buffer.BlockCopy(S7.Net.Types.DInt.ToByteArray(TimeVacuum), 0, answ, 14, 4); + Buffer.BlockCopy(S7.Net.Types.DInt.ToByteArray(TimeCycleGross), 0, answ, 18, 4); + Buffer.BlockCopy(S7.Net.Types.DInt.ToByteArray(TimeCycleNet), 0, answ, 22, 4); + Buffer.BlockCopy(S7.Net.Types.Double.ToByteArray(MaterialTempEndWarm), 0, answ, 26, 4); + Buffer.BlockCopy(S7.Net.Types.Double.ToByteArray(MaterialTempEndVent), 0, answ, 30, 4); + Buffer.BlockCopy(S7.Net.Types.Double.ToByteArray(MoldTemp), 0, answ, 34, 4); + Buffer.BlockCopy(S7.Net.Types.Double.ToByteArray(VacuumReadVal), 0, answ, 38, 4); + Buffer.BlockCopy(S7.Net.Types.Double.ToByteArray(MouldEnergyOUT), 0, answ, 42, 4); + Buffer.BlockCopy(S7.Net.Types.Double.ToByteArray(MouldEnergyIN), 0, answ, 46, 4); + return answ; + } public override bool Equals(object obj) { @@ -354,54 +383,61 @@ namespace CMS_CORE_Library.Models return base.GetHashCode(); } - /// - /// Converte un singolo item in un array di byte per scrittura su PLC S7 - /// - /// - public byte[] convertToByte() - { - byte[] answ = new byte[50]; - Buffer.BlockCopy(S7.Net.Types.Int.ToByteArray(NumTarget), 0, answ, 0, 2); - Buffer.BlockCopy(S7.Net.Types.Int.ToByteArray(NumDone), 0, answ, 2, 2); - Buffer.BlockCopy(S7.Net.Types.Int.ToByteArray(PreWarmCycle), 0, answ, 4, 2); - Buffer.BlockCopy(S7.Net.Types.DInt.ToByteArray(TimeWarm), 0, answ, 6, 4); - Buffer.BlockCopy(S7.Net.Types.DInt.ToByteArray(TimeVent), 0, answ, 10, 4); - Buffer.BlockCopy(S7.Net.Types.DInt.ToByteArray(TimeVacuum), 0, answ, 14, 4); - Buffer.BlockCopy(S7.Net.Types.DInt.ToByteArray(TimeCycleGross), 0, answ, 18, 4); - Buffer.BlockCopy(S7.Net.Types.DInt.ToByteArray(TimeCycleNet), 0, answ, 22, 4); - Buffer.BlockCopy(S7.Net.Types.Double.ToByteArray(MaterialTempEndWarm), 0, answ, 26, 4); - Buffer.BlockCopy(S7.Net.Types.Double.ToByteArray(MaterialTempEndVent), 0, answ, 30, 4); - Buffer.BlockCopy(S7.Net.Types.Double.ToByteArray(MoldTemp), 0, answ, 34, 4); - Buffer.BlockCopy(S7.Net.Types.Double.ToByteArray(VacuumReadVal), 0, answ, 38, 4); - Buffer.BlockCopy(S7.Net.Types.Double.ToByteArray(MouldEnergyOUT), 0, answ, 42, 4); - Buffer.BlockCopy(S7.Net.Types.Double.ToByteArray(MouldEnergyIN), 0, answ, 46, 4); - return answ; - } + #endregion Methods + } - public class ProdCycleModel + /// + /// Recipe Parameters + /// + public class RecipeParam { - public ushort Status { get; set; } = 0; - public ushort MessageId { get; set; } = 0; - public ushort Mode { get; set; } = 0; - public ushort Submode { get; set; } = 0; - public uint TimeAdv { get; set; } = 0; + + #region Properties + + public bool Enabled { get; set; } = false; + public bool HasError { get; set; } = false; + public short Id { get; set; } = 0; + public int ScaleFactor { get; set; } = 1; + public double SetpointHMI { get; set; } = 0; + public double SetpointPLC { get; set; } = 0; + public ushort UnitMeasure { get; set; } = 0; + public double ValMax { get; set; } = 0; + public double ValMin { get; set; } = 0; + public double ValueAct { get; set; } = 0; + public bool Visible { get; set; } = false; + + #endregion Properties + + #region Methods public override bool Equals(object obj) { // Object is not a GaugeModel instance - if (!(obj is ProdCycleModel item)) + if (!(obj is RecipeParam item)) return false; - if (Status != item.Status) + if (Id != item.Id) return false; - if (MessageId != item.MessageId) + if (SetpointHMI != item.SetpointHMI) return false; - if (Mode != item.Mode) + if (SetpointPLC != item.SetpointPLC) return false; - if (Submode != item.Submode) + if (ValMax != item.ValMax) return false; - if (TimeAdv != item.TimeAdv) + if (ValMin != item.ValMin) + return false; + if (UnitMeasure != item.UnitMeasure) + return false; + if (Visible != item.Visible) + return false; + if (Enabled != item.Enabled) + return false; + if (HasError != item.HasError) + return false; + if (ValueAct != item.ValueAct) + return false; + if (ScaleFactor != item.ScaleFactor) return false; return true; @@ -410,8 +446,121 @@ namespace CMS_CORE_Library.Models { return base.GetHashCode(); } + + #endregion Methods + + } + public class WarmerChannel + { + + #region Properties + + /// + /// Channel status + /// + public byte ChStatus { get; set; } = 0; + + /// + /// Channel AMPERE actual value + /// + public double CurrAct { get; set; } = 0; + + /// + /// Channel Unique ID (from risk2007) + /// + public int IdChannel { get; set; } = 0; + + /// + /// Reflector ID + /// + public byte IdRefl { get; set; } = 0; + + /// + /// Channel MaxPower + /// + public int MaxPower { get; set; } = 0; + + /// + /// Channel actual value % + /// + public byte PercAct { get; set; } = 0; + + /// + /// Setpoint from HMI (%) + /// + public byte SetpointHMI { get; set; } = 0; + + /// + /// Setpoint from PLC (%) + /// + public byte SetpointPLC { get; set; } = 0; + + /// + /// Define if camera is active for channel + /// + public bool ThermocamActive { get; set; } = false; + + /// + /// Actual value from last ThermoCam image acquisition (° Celsius) + /// + public double ThermocamActualTemp { get; set; } = 0; + + /// + /// Setpoint from HMI (° Celsius) + /// + public byte ThermocamSetpoint { get; set; } = 0; + + #endregion Properties + + #region Methods + + /// + /// Equality test for class object + /// + /// + /// + public override bool Equals(object obj) + { + // Object is not a GaugeModel instance + if (!(obj is WarmerChannel item)) + return false; + + if (ChStatus != item.ChStatus) + return false; + if (CurrAct != item.CurrAct) + return false; + if (IdChannel != item.IdChannel) + return false; + if (PercAct != item.PercAct) + return false; + if (SetpointHMI != item.SetpointHMI) + return false; + if (SetpointPLC != item.SetpointPLC) + return false; + if (ThermocamActive != item.ThermocamActive) + return false; + if (ThermocamActualTemp != item.ThermocamActualTemp) + return false; + if (ThermocamSetpoint != item.ThermocamSetpoint) + return false; + + return true; + } + + /// + /// Hash gen + /// + /// + public override int GetHashCode() + { + return base.GetHashCode(); + } + + #endregion Methods + } - #endregion + #endregion Classes + } } diff --git a/CMS_CORE_Library/NcThermo.cs b/CMS_CORE_Library/NcThermo.cs index 9588a6e..2614fd9 100644 --- a/CMS_CORE_Library/NcThermo.cs +++ b/CMS_CORE_Library/NcThermo.cs @@ -684,11 +684,17 @@ namespace CMS_CORE_Library /// public abstract CmsError PLC_WWarmerChSetpHmi(Dictionary newData); /// - /// Set current Warmers Channels setpoints + /// Set current Warmers Channels ThermocamSetpoints (°C) /// /// /// - public abstract CmsError PLC_WWarmerChSetpTCam(Dictionary newData); + public abstract CmsError PLC_WWarmerChTCamSetp(Dictionary newData); + /// + /// Set current Warmers Channels Thermocam read (actual) value (°C) + /// + /// + /// + public abstract CmsError PLC_WWarmerChTCamActual(Dictionary newData); /// /// Set current Warmers Channels reflector's data /// diff --git a/CMS_CORE_Library/S7Net/Nc_S7Net.cs b/CMS_CORE_Library/S7Net/Nc_S7Net.cs index 38dc27d..154c964 100644 --- a/CMS_CORE_Library/S7Net/Nc_S7Net.cs +++ b/CMS_CORE_Library/S7Net/Nc_S7Net.cs @@ -2359,8 +2359,12 @@ namespace CMS_CORE_Library.S7Net refreshRiscSetpointHMI(); // refresh setpoint PLC refreshRiscSetpointPLC(); - // refresh setpoint termocamera ??? - refreshRiscSetpointTermoCam(); + + // refresh dati termocamera + refreshRiscTermoCamAbilit(); + refreshRiscTermoCamCommStatus(); + refreshRiscTermoCamTempAct(); + refreshRiscTermoCamTempSet(); // copio lista act in output currWarmerChannelList = ThermoWarmChannels; @@ -2945,9 +2949,30 @@ namespace CMS_CORE_Library.S7Net } /// - /// Refresh Canali Riscaldi: SetPoint Termocamera + /// Refresh dati ThermoCamera dal PLC: temperatura impostata come riferimento /// - private void refreshRiscSetpointTermoCam() + private void refreshRiscTermoCamTempSet() + { + // FIXME TODO ???? da dove prendere info? + } + /// + /// Refresh dati ThermoCamera dal PLC: ultima temp letta + /// + private void refreshRiscTermoCamTempAct() + { + // FIXME TODO ???? da dove prendere info? + } + /// + /// Refresh dati ThermoCamera dal PLC x area command/status + /// + private void refreshRiscTermoCamCommStatus() + { + // FIXME TODO ???? da dove prendere info? + } + /// + /// Refresh dati ThermoCamera dal PLC x area command/status + /// + private void refreshRiscTermoCamAbilit() { // FIXME TODO ???? da dove prendere info? } @@ -2956,7 +2981,7 @@ namespace CMS_CORE_Library.S7Net /// private void refreshRiscSetpointHMI() { - // leggo DB514 x area Ich + // leggo DB614 x area Ich List currMem = new List(); // leggo da PLC a array di byte di appoggio... @@ -3171,11 +3196,46 @@ namespace CMS_CORE_Library.S7Net return NO_ERROR; } /// - /// Write Warmers channels termocam data + /// Set current Warmers Channels ThermocamSetpoints (°C) /// /// /// - public override CmsError PLC_WWarmerChSetpTCam(Dictionary newData) + public override CmsError PLC_WWarmerChTCamSetp(Dictionary newData) + { + // FIXME TODO serve nuova area termocamera +#if false + // memory area + byte[] newMem = new byte[newData.Count]; + List currMem = new List(); + + // read actual data on memory... + CmsError libraryError = MEM_RWByteList(R, 0, RISC_CHP_DATA.MemType, RISC_CHP_DATA.Address, RISC_CHP_DATA.SubAddress, 0, RISC_CHP_DATA.Size, ref currMem); + if (libraryError.IsError()) + return libraryError; + + newMem = currMem.ToArray(); + + // update only given data... + foreach (var item in newData) + { + newMem[item.Key - 1] = (byte)item.Value; + } + // return as list... + currMem = newMem.ToList(); + // scrivo sul PLC array di byte... + libraryError = MEM_RWByteList(W, 0, RISC_CHP_DATA.MemType, RISC_CHP_DATA.Address, RISC_CHP_DATA.SubAddress, 0, RISC_CHP_DATA.Size, ref currMem); + if (libraryError.IsError()) + return libraryError; +#endif + + return NO_ERROR; + } + /// + /// Set current Warmers Channels Thermocam read (actual) value (°C) + /// + /// + /// + public override CmsError PLC_WWarmerChTCamActual(Dictionary newData) { // FIXME TODO serve nuova area termocamera #if false @@ -4926,6 +4986,15 @@ namespace CMS_CORE_Library.S7Net internal static MEMORY_CELL RISC_OVP_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 514, 10752, 1024); internal static MEMORY_CELL RISC_ICH_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 514, 11776, 4096); + // ThermoCamera + internal static MEMORY_CELL TCAM_STAT_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 626, 0, 2); + internal static MEMORY_CELL TCAM_COMM_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 626, 2, 2); + internal static MEMORY_CELL TCAM_CH_ENAB_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 626, 4, 128); + internal static MEMORY_CELL TCAM_TEMP_REQ_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 624, 0, 2048); + internal static MEMORY_CELL TCAM_TEMP_ACT_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 625, 0, 2048); + internal static MEMORY_CELL TCAM_CHP_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 627, 0, 1024); + + // produzione internal static MEMORY_CELL PROCESS_PROD_INFO = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 606, 0, 52); internal static MEMORY_CELL PROCESS_PROD_CYCLE = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 605, 0, 22); From 8dfd2d4d23f00e85dd9ba941b7c97ca7f66c7092 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Sat, 24 Oct 2020 11:39:06 +0200 Subject: [PATCH 2/6] Update for ThermoCam reading --- CMS_CORE_Library/Models/ThermoModels.cs | 16 +- CMS_CORE_Library/NcThermo.cs | 3 +- CMS_CORE_Library/S7Net/Nc_S7Net.cs | 193 +++++++++++++++++++++--- 3 files changed, 181 insertions(+), 31 deletions(-) diff --git a/CMS_CORE_Library/Models/ThermoModels.cs b/CMS_CORE_Library/Models/ThermoModels.cs index e696472..2d89427 100644 --- a/CMS_CORE_Library/Models/ThermoModels.cs +++ b/CMS_CORE_Library/Models/ThermoModels.cs @@ -498,17 +498,17 @@ namespace CMS_CORE_Library.Models /// /// Define if camera is active for channel /// - public bool ThermocamActive { get; set; } = false; + public bool TCamActive { get; set; } = false; /// - /// Actual value from last ThermoCam image acquisition (° Celsius) + /// Actual value from last ThermoCam image acquisition (1/10 ° Celsius) /// - public double ThermocamActualTemp { get; set; } = 0; + public short TCamTempActual { get; set; } = 0; /// - /// Setpoint from HMI (° Celsius) + /// Setpoint from HMI (1/10 ° Celsius) /// - public byte ThermocamSetpoint { get; set; } = 0; + public short TCamTempSet { get; set; } = 0; #endregion Properties @@ -537,11 +537,11 @@ namespace CMS_CORE_Library.Models return false; if (SetpointPLC != item.SetpointPLC) return false; - if (ThermocamActive != item.ThermocamActive) + if (TCamActive != item.TCamActive) return false; - if (ThermocamActualTemp != item.ThermocamActualTemp) + if (TCamTempActual != item.TCamTempActual) return false; - if (ThermocamSetpoint != item.ThermocamSetpoint) + if (TCamTempSet != item.TCamTempSet) return false; return true; diff --git a/CMS_CORE_Library/NcThermo.cs b/CMS_CORE_Library/NcThermo.cs index 2614fd9..bb125ad 100644 --- a/CMS_CORE_Library/NcThermo.cs +++ b/CMS_CORE_Library/NcThermo.cs @@ -674,9 +674,10 @@ namespace CMS_CORE_Library /// /// Get current Warmers Channels list /// + /// updates only READ parameters (false = update all data) /// /// - public abstract CmsError PLC_RWarmerChannelList(ref Dictionary currWarmerChannelList); + public abstract CmsError PLC_RWarmerChannelList(bool useCache, ref Dictionary currWarmerChannelList); /// /// Set current Warmers Channels setpoints /// diff --git a/CMS_CORE_Library/S7Net/Nc_S7Net.cs b/CMS_CORE_Library/S7Net/Nc_S7Net.cs index 154c964..cba105c 100644 --- a/CMS_CORE_Library/S7Net/Nc_S7Net.cs +++ b/CMS_CORE_Library/S7Net/Nc_S7Net.cs @@ -2345,26 +2345,34 @@ namespace CMS_CORE_Library.S7Net /// /// Get current Warmers Channels list /// + /// updates only READ parameters (false = update all data) /// /// - public override CmsError PLC_RWarmerChannelList(ref Dictionary currWarmerChannelList) + public override CmsError PLC_RWarmerChannelList(bool useCache, ref Dictionary currWarmerChannelList) { - // refresh stato canale + // refresh stato canale ESP[i] refreshRiscStatus(); - // refresh % attuale + // refresh % lavoro attuale OVp[i] refreshRiscPerc(); - // refresh setpoint PLC + // refresh corrente attuale Ich[i] refreshRiscActCurr(); - // refresh setpoint HMI - refreshRiscSetpointHMI(); - // refresh setpoint PLC + // refresh setpoint PLC % (era 514 --> 627) refreshRiscSetpointPLC(); - // refresh dati termocamera - refreshRiscTermoCamAbilit(); + // refresh dati status/comando termocamera refreshRiscTermoCamCommStatus(); - refreshRiscTermoCamTempAct(); - refreshRiscTermoCamTempSet(); + + if (!useCache) + { + // refresh setpoint HMI canale % | Write + refreshRiscSetpointHMI(); + // refresh abilitazione canale x thermoCam | Write + refreshRiscTermoCamAbilit(); + // refresh ultima temp canale letta da thermoCam | Write + refreshRiscTermoCamTempAct(); + // refresh temp canale impostata x thermoCam | Write + refreshRiscTermoCamTempSet(); + } // copio lista act in output currWarmerChannelList = ThermoWarmChannels; @@ -2953,28 +2961,170 @@ namespace CMS_CORE_Library.S7Net /// private void refreshRiscTermoCamTempSet() { - // FIXME TODO ???? da dove prendere info? + // leggo DB624 x Setpoint Temp richiesti + List currMem = new List(); + + // leggo da PLC a array di byte di appoggio... + CmsError libraryError = MEM_RWShortList(R, 0, TCAM_TEMP_REQ_DATA.MemType, TCAM_TEMP_REQ_DATA.Address, TCAM_TEMP_REQ_DATA.SubAddress, TCAM_TEMP_REQ_DATA.Size / 2, ref currMem); + + // copio! controllo SE ho dati... + if (currMem.Count > 0) + { + for (int i = 0; i < TCAM_TEMP_REQ_DATA.Size / 2; i++) + { + // cerco id + 1 (su memoria è base 0) + if (ThermoWarmChannels.ContainsKey(i + 1)) + { + try + { + ThermoWarmChannels[i + 1].TCamTempSet = currMem[i]; + } + catch + { } + } + else + { + ThermoWarmChannels.Add(i + 1, new ThermoModels.WarmerChannel() + { + IdChannel = i + 1, + TCamTempSet = currMem[i] + }); + } + } + } + else + { + libraryError = S7_PLC_EMPTY_READ; + } } /// /// Refresh dati ThermoCamera dal PLC: ultima temp letta /// private void refreshRiscTermoCamTempAct() { - // FIXME TODO ???? da dove prendere info? + // leggo DB625 x Temp attuale + List currMem = new List(); + + // leggo da PLC a array di byte di appoggio... + CmsError libraryError = MEM_RWShortList(R, 0, TCAM_TEMP_ACT_DATA.MemType, TCAM_TEMP_ACT_DATA.Address, TCAM_TEMP_ACT_DATA.SubAddress, TCAM_TEMP_ACT_DATA.Size / 2, ref currMem); + + // copio! controllo SE ho dati... + if (currMem.Count > 0) + { + for (int i = 0; i < TCAM_TEMP_ACT_DATA.Size / 2; i++) + { + // cerco id + 1 (su memoria è base 0) + if (ThermoWarmChannels.ContainsKey(i + 1)) + { + try + { + ThermoWarmChannels[i + 1].TCamTempActual = currMem[i]; + } + catch + { } + } + else + { + ThermoWarmChannels.Add(i + 1, new ThermoModels.WarmerChannel() + { + IdChannel = i + 1, + TCamTempActual = currMem[i] + }); + } + } + } + else + { + libraryError = S7_PLC_EMPTY_READ; + } } /// /// Refresh dati ThermoCamera dal PLC x area command/status /// private void refreshRiscTermoCamCommStatus() { - // FIXME TODO ???? da dove prendere info? +#if false + // leggo DB614 x area Ich + List currMem = new List(); + + // leggo da PLC a array di byte di appoggio... + CmsError libraryError = MEM_RWByteList(R, 0, RISC_CHP_DATA.MemType, RISC_CHP_DATA.Address, RISC_CHP_DATA.SubAddress, 0, RISC_CHP_DATA.Size, ref currMem); + + // copio! controllo SE ho dati... + if (currMem.Count > 0) + { + // converto a blocchi di 8 byte... + byte[] memArray = currMem.ToArray(); + for (int i = 0; i < RISC_CHP_DATA.Size; i++) + { + // cerco id + 1 (su memoria è base 0) + if (ThermoWarmChannels.ContainsKey(i + 1)) + { + try + { + ThermoWarmChannels[i + 1].SetpointHMI = memArray[i]; + } + catch + { } + } + else + { + ThermoWarmChannels.Add(i + 1, new ThermoModels.WarmerChannel() + { + IdChannel = i + 1, + SetpointHMI = memArray[i] + }); + } + } + } + else + { + libraryError = S7_PLC_EMPTY_READ; + } +#endif } /// /// Refresh dati ThermoCamera dal PLC x area command/status /// private void refreshRiscTermoCamAbilit() { - // FIXME TODO ???? da dove prendere info? +#if false + // leggo DB664 x abilitazione ch alla termocamera + List currMem = new List(); + + // leggo da PLC a array di byte di appoggio... + CmsError libraryError = MEM_RWByteList(R, 0, TCAM_CH_ENAB_DATA.MemType, TCAM_CH_ENAB_DATA.Address, TCAM_CH_ENAB_DATA.SubAddress, 0, TCAM_CH_ENAB_DATA.Size, ref currMem); + + // copio! controllo SE ho dati... + if (currMem.Count > 0) + { + for (int i = 0; i < TCAM_TEMP_ACT_DATA.Size; i++) + { + // cerco id + 1 (su memoria è base 0) + if (ThermoWarmChannels.ContainsKey(i + 1)) + { + try + { + ThermoWarmChannels[i + 1].TCamActive = currMem[i]; + } + catch + { } + } + else + { + ThermoWarmChannels.Add(i + 1, new ThermoModels.WarmerChannel() + { + IdChannel = i + 1, + TCamActive = currMem[i] + }); + } + } + } + else + { + libraryError = S7_PLC_EMPTY_READ; + } +#endif } /// /// Refresh Canali Riscaldi: SetPoint HMI @@ -3020,11 +3170,11 @@ namespace CMS_CORE_Library.S7Net } } /// - /// Refresh Canali Riscaldi: SetPoint PLC + /// Refresh Canali Riscaldi: SetPoint PLC (% lavoro applicata ATTUALE dal PLC) /// private void refreshRiscSetpointPLC() { - // leggo DB514 x area Ich + // leggo area DB627 (era DB514) x area CHp List currMem = new List(); // leggo da PLC a array di byte di appoggio... @@ -3095,7 +3245,7 @@ namespace CMS_CORE_Library.S7Net } } /// - /// Refresh Canali Riscaldi: Percentuale Attuale + /// Refresh Canali Riscaldi: Percentuale lavoro Attuale /// private void refreshRiscPerc() { @@ -4977,7 +5127,7 @@ namespace CMS_CORE_Library.S7Net // riscaldi internal static MEMORY_CELL RISC_VU_MIN = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 513, 0, 2); internal static MEMORY_CELL RISC_OCC_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 514, 64, 64); - internal static MEMORY_CELL RISC_PLC_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 514, 128, 1024); + internal static MEMORY_CELL RISC_PLC_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 627, 0, 1024); //internal static MEMORY_CELL RISC_PLC_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 514, 128, 1024); //valore PRE thermoCam internal static MEMORY_CELL RISC_CHP_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 614, 0, 1024); internal static MEMORY_CELL RISC_CFI_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 514, 2176, 1024); internal static MEMORY_CELL RISC_ICH_MIN_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 514, 3200, 4096); @@ -4987,12 +5137,11 @@ namespace CMS_CORE_Library.S7Net internal static MEMORY_CELL RISC_ICH_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 514, 11776, 4096); // ThermoCamera - internal static MEMORY_CELL TCAM_STAT_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 626, 0, 2); - internal static MEMORY_CELL TCAM_COMM_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 626, 2, 2); + internal static MEMORY_CELL TCAM_STATW_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 626, 0, 2); + internal static MEMORY_CELL TCAM_COMMW_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 626, 2, 2); internal static MEMORY_CELL TCAM_CH_ENAB_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 626, 4, 128); internal static MEMORY_CELL TCAM_TEMP_REQ_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 624, 0, 2048); internal static MEMORY_CELL TCAM_TEMP_ACT_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 625, 0, 2048); - internal static MEMORY_CELL TCAM_CHP_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 627, 0, 1024); // produzione From 2ad2fb432b99d466dc6a7e2f4676d78fc5ff2f7b Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Sat, 24 Oct 2020 11:59:24 +0200 Subject: [PATCH 3/6] Update lettura status act BOOL --- CMS_CORE_Library/S7Net/Nc_S7Net.cs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/CMS_CORE_Library/S7Net/Nc_S7Net.cs b/CMS_CORE_Library/S7Net/Nc_S7Net.cs index cba105c..969a357 100644 --- a/CMS_CORE_Library/S7Net/Nc_S7Net.cs +++ b/CMS_CORE_Library/S7Net/Nc_S7Net.cs @@ -3088,7 +3088,6 @@ namespace CMS_CORE_Library.S7Net /// private void refreshRiscTermoCamAbilit() { -#if false // leggo DB664 x abilitazione ch alla termocamera List currMem = new List(); @@ -3098,14 +3097,21 @@ namespace CMS_CORE_Library.S7Net // copio! controllo SE ho dati... if (currMem.Count > 0) { - for (int i = 0; i < TCAM_TEMP_ACT_DATA.Size; i++) + bool[] bits = new bool[TCAM_CH_ENAB_DATA.Size * 8]; + + // Convert int into to true/false array + var bArray = new BitArray(currMem.ToArray()); + bArray.CopyTo(bits, 0); + + + for (int i = 0; i < TCAM_TEMP_ACT_DATA.Size * 8; i++) { // cerco id + 1 (su memoria è base 0) if (ThermoWarmChannels.ContainsKey(i + 1)) { try { - ThermoWarmChannels[i + 1].TCamActive = currMem[i]; + ThermoWarmChannels[i + 1].TCamActive = bits[i]; } catch { } @@ -3115,7 +3121,7 @@ namespace CMS_CORE_Library.S7Net ThermoWarmChannels.Add(i + 1, new ThermoModels.WarmerChannel() { IdChannel = i + 1, - TCamActive = currMem[i] + TCamActive = bits[i] }); } } @@ -3123,8 +3129,7 @@ namespace CMS_CORE_Library.S7Net else { libraryError = S7_PLC_EMPTY_READ; - } -#endif + } } /// /// Refresh Canali Riscaldi: SetPoint HMI From 2f22a34c73ddf0f2da7fbde9d7763655e5488762 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Sat, 24 Oct 2020 12:31:13 +0200 Subject: [PATCH 4/6] commeneted out warmers full read --- CMS_CORE_Library/S7Net/Nc_S7Net.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/CMS_CORE_Library/S7Net/Nc_S7Net.cs b/CMS_CORE_Library/S7Net/Nc_S7Net.cs index 969a357..4daa741 100644 --- a/CMS_CORE_Library/S7Net/Nc_S7Net.cs +++ b/CMS_CORE_Library/S7Net/Nc_S7Net.cs @@ -2362,6 +2362,9 @@ namespace CMS_CORE_Library.S7Net // refresh dati status/comando termocamera refreshRiscTermoCamCommStatus(); + // FIXME TODO ammazza le performances!!! +#if false + if (!useCache) { // refresh setpoint HMI canale % | Write @@ -2372,7 +2375,8 @@ namespace CMS_CORE_Library.S7Net refreshRiscTermoCamTempAct(); // refresh temp canale impostata x thermoCam | Write refreshRiscTermoCamTempSet(); - } + } +#endif // copio lista act in output currWarmerChannelList = ThermoWarmChannels; @@ -3088,6 +3092,7 @@ namespace CMS_CORE_Library.S7Net /// private void refreshRiscTermoCamAbilit() { +#if false // leggo DB664 x abilitazione ch alla termocamera List currMem = new List(); @@ -3129,7 +3134,8 @@ namespace CMS_CORE_Library.S7Net else { libraryError = S7_PLC_EMPTY_READ; - } + } +#endif } /// /// Refresh Canali Riscaldi: SetPoint HMI From 65ecccdcf2b80d3a592548a0cc3770024e13ba01 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Sat, 24 Oct 2020 14:19:06 +0200 Subject: [PATCH 5/6] Update ThermoCam reads --- CMS_CORE_Library/S7Net/Nc_S7Net.cs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/CMS_CORE_Library/S7Net/Nc_S7Net.cs b/CMS_CORE_Library/S7Net/Nc_S7Net.cs index 4daa741..4acfd3c 100644 --- a/CMS_CORE_Library/S7Net/Nc_S7Net.cs +++ b/CMS_CORE_Library/S7Net/Nc_S7Net.cs @@ -2362,13 +2362,11 @@ namespace CMS_CORE_Library.S7Net // refresh dati status/comando termocamera refreshRiscTermoCamCommStatus(); - // FIXME TODO ammazza le performances!!! -#if false + // refresh setpoint HMI canale % | Write + refreshRiscSetpointHMI(); if (!useCache) { - // refresh setpoint HMI canale % | Write - refreshRiscSetpointHMI(); // refresh abilitazione canale x thermoCam | Write refreshRiscTermoCamAbilit(); // refresh ultima temp canale letta da thermoCam | Write @@ -2376,7 +2374,6 @@ namespace CMS_CORE_Library.S7Net // refresh temp canale impostata x thermoCam | Write refreshRiscTermoCamTempSet(); } -#endif // copio lista act in output currWarmerChannelList = ThermoWarmChannels; @@ -2969,7 +2966,7 @@ namespace CMS_CORE_Library.S7Net List currMem = new List(); // leggo da PLC a array di byte di appoggio... - CmsError libraryError = MEM_RWShortList(R, 0, TCAM_TEMP_REQ_DATA.MemType, TCAM_TEMP_REQ_DATA.Address, TCAM_TEMP_REQ_DATA.SubAddress, TCAM_TEMP_REQ_DATA.Size / 2, ref currMem); + CmsError libraryError = MEM_RWShortList(R, 0, TCAM_TEMP_REQ_DATA.MemType, TCAM_TEMP_REQ_DATA.Address, TCAM_TEMP_REQ_DATA.SubAddress, TCAM_TEMP_REQ_DATA.Size, ref currMem); // copio! controllo SE ho dati... if (currMem.Count > 0) @@ -3010,7 +3007,7 @@ namespace CMS_CORE_Library.S7Net List currMem = new List(); // leggo da PLC a array di byte di appoggio... - CmsError libraryError = MEM_RWShortList(R, 0, TCAM_TEMP_ACT_DATA.MemType, TCAM_TEMP_ACT_DATA.Address, TCAM_TEMP_ACT_DATA.SubAddress, TCAM_TEMP_ACT_DATA.Size / 2, ref currMem); + CmsError libraryError = MEM_RWShortList(R, 0, TCAM_TEMP_ACT_DATA.MemType, TCAM_TEMP_ACT_DATA.Address, TCAM_TEMP_ACT_DATA.SubAddress, TCAM_TEMP_ACT_DATA.Size, ref currMem); // copio! controllo SE ho dati... if (currMem.Count > 0) From fdb570b6eedd968ae6479d499e683921b7826dc6 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Sat, 24 Oct 2020 14:24:25 +0200 Subject: [PATCH 6/6] Fix readings TCam --- CMS_CORE_Library/S7Net/Nc_S7Net.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/CMS_CORE_Library/S7Net/Nc_S7Net.cs b/CMS_CORE_Library/S7Net/Nc_S7Net.cs index 4acfd3c..41073c7 100644 --- a/CMS_CORE_Library/S7Net/Nc_S7Net.cs +++ b/CMS_CORE_Library/S7Net/Nc_S7Net.cs @@ -3089,7 +3089,6 @@ namespace CMS_CORE_Library.S7Net /// private void refreshRiscTermoCamAbilit() { -#if false // leggo DB664 x abilitazione ch alla termocamera List currMem = new List(); @@ -3105,8 +3104,7 @@ namespace CMS_CORE_Library.S7Net var bArray = new BitArray(currMem.ToArray()); bArray.CopyTo(bits, 0); - - for (int i = 0; i < TCAM_TEMP_ACT_DATA.Size * 8; i++) + for (int i = 0; i < TCAM_CH_ENAB_DATA.Size * 8; i++) { // cerco id + 1 (su memoria è base 0) if (ThermoWarmChannels.ContainsKey(i + 1)) @@ -3132,7 +3130,6 @@ namespace CMS_CORE_Library.S7Net { libraryError = S7_PLC_EMPTY_READ; } -#endif } /// /// Refresh Canali Riscaldi: SetPoint HMI