From c67ee063ccec430a9ac0dd404dbb9f2a58d778d4 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 10 Jun 2020 16:28:55 +0200 Subject: [PATCH 1/2] Removed swapped byte (prev error was word/byte ex) --- CMS_CORE_Library/NcThermo.cs | 10 +- CMS_CORE_Library/S7Net/Nc_S7Net.cs | 111 +++++++++++++--------- SiemensS7/Siemens-S7-Test/TestMainForm.cs | 32 +++++-- 3 files changed, 98 insertions(+), 55 deletions(-) diff --git a/CMS_CORE_Library/NcThermo.cs b/CMS_CORE_Library/NcThermo.cs index e3d1156..4526bb2 100644 --- a/CMS_CORE_Library/NcThermo.cs +++ b/CMS_CORE_Library/NcThermo.cs @@ -657,13 +657,19 @@ namespace CMS_CORE_Library /// /// /// - public abstract CmsError PLC_WWarmerChSetpoints(Dictionary currWarmerChannelList); + public abstract CmsError PLC_WWarmerChSetpHmi(Dictionary newData); + /// + /// Set current Warmers Channels setpoints + /// + /// + /// + public abstract CmsError PLC_WWarmerChSetpTCam(Dictionary newData); /// /// Set current Warmers Channels setup data /// /// /// - public abstract CmsError PLC_WWarmerChData(Dictionary currWarmerChannelList); + public abstract CmsError PLC_WWarmerSetupData(Dictionary currWarmerChannelList); /// /// Read power gauge data /// diff --git a/CMS_CORE_Library/S7Net/Nc_S7Net.cs b/CMS_CORE_Library/S7Net/Nc_S7Net.cs index f6c30a9..7ae03ad 100644 --- a/CMS_CORE_Library/S7Net/Nc_S7Net.cs +++ b/CMS_CORE_Library/S7Net/Nc_S7Net.cs @@ -2200,11 +2200,16 @@ namespace CMS_CORE_Library.S7Net // update oggetto thermoParamList... if (ThermoModuleList.ContainsKey(currModBlock.Id)) { - ThermoModuleList[currModBlock.Id].Visible = currModBlock.Visible; - ThermoModuleList[currModBlock.Id].Running = currModBlock.Running; - ThermoModuleList[currModBlock.Id].HasError = currModBlock.HasError; - ThermoModuleList[currModBlock.Id].ActualDuration = currModBlock.ActualDuration; - ThermoModuleList[currModBlock.Id].ActualDelay = currModBlock.ActualDelay; + try + { + ThermoModuleList[currModBlock.Id].Visible = currModBlock.Visible; + ThermoModuleList[currModBlock.Id].Running = currModBlock.Running; + ThermoModuleList[currModBlock.Id].HasError = currModBlock.HasError; + ThermoModuleList[currModBlock.Id].ActualDuration = currModBlock.ActualDuration; + ThermoModuleList[currModBlock.Id].ActualDelay = currModBlock.ActualDelay; + } + catch + { } } else { @@ -2386,6 +2391,8 @@ namespace CMS_CORE_Library.S7Net double currVal = 0; for (int i = 0; i < RISC_CHP_DATA.Size / 4; i++) { + // FIXME TODO +#if false currVal = S7.Net.Types.Double.FromByteArray(memArray.Skip(4 * i).Take(4).ToArray()); // cerco id + 1 (su memoria รจ base 0) if (ThermoWarmChannels.ContainsKey(i + 1)) @@ -2399,25 +2406,12 @@ namespace CMS_CORE_Library.S7Net IdChannel = i + 1, SetpointPLC = currVal }); - } + } +#endif } } } - /// - /// Write SetPoint PLC on CHp area - /// - private void PLC_WRiscSetpointPLC() - { - List currMem = new List(); - // converto a blocchi di 2 byte... - for (int i = 0; i < RISC_CHP_DATA.Size / 2; i++) - { - currMem.Add(ThermoWarmChannels[i + 1].SetpointPLC); - currMem.Add(ThermoWarmChannels[i].SetpointPLC); - } - // scrivo sul PLC array di byte... - CmsError cmsError = MEM_RWByteList(W, 0, RISC_CHP_DATA.MemType, RISC_CHP_DATA.Address, RISC_CHP_DATA.SubAddress, 0, RISC_CHP_DATA.Size, ref currMem); - } + // FIXME TODO : devo farla o legge da conf il PLC? #if false /// @@ -2561,13 +2555,47 @@ namespace CMS_CORE_Library.S7Net /// /// Write Warmers channels load data /// - /// + /// /// - public override CmsError PLC_WWarmerChSetpoints(Dictionary updtCh) + public override CmsError PLC_WWarmerChSetpHmi(Dictionary newData) { // memory area - List newMem = new List(); + byte[] newMem = new byte[newData.Count]; + List currMem = new List(); + // read actual data on memory... + CmsError cmsError = MEM_RWByteList(R, 0, RISC_CHP_DATA.MemType, RISC_CHP_DATA.Address, RISC_CHP_DATA.SubAddress, 0, RISC_CHP_DATA.Size, ref currMem); + if (cmsError.IsError()) + return cmsError; + + 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... + cmsError = MEM_RWByteList(W, 0, RISC_CHP_DATA.MemType, RISC_CHP_DATA.Address, RISC_CHP_DATA.SubAddress, 0, RISC_CHP_DATA.Size, ref currMem); + if (cmsError.IsError()) + return cmsError; + + return NO_ERROR; + } + /// + /// Write Warmers channels termocam data + /// + /// + /// + public override CmsError PLC_WWarmerChSetpTCam(Dictionary newData) + { + // memory area + byte[] newMem = new byte[newData.Count]; + List currMem = new List(); + +#if false // per fare swapt faccio 2 alla volta e inverto ordine... for (int i = 0; i < RISC_CHP_DATA.Size / 2; i++) { @@ -2577,6 +2605,18 @@ namespace CMS_CORE_Library.S7Net newMem.Add((byte)updtCh[i * 2]); } +#endif + // converto a blocchi di 2 byte... + for (int i = 0; i < RISC_CHP_DATA.Size; i++) + { + //newMem.Add(ThermoWarmChannels[i].SetpointPLC); + newMem[i] = (byte)newData[i]; + } + // converto + currMem = newMem.ToList(); + // scrivo sul PLC array di byte... + CmsError cmsError = MEM_RWByteList(W, 0, RISC_CHP_DATA.MemType, RISC_CHP_DATA.Address, RISC_CHP_DATA.SubAddress, 0, RISC_CHP_DATA.Size, ref currMem); + // error in write WARM area... #if false // write! @@ -2592,7 +2632,7 @@ namespace CMS_CORE_Library.S7Net /// /// /// - public override CmsError PLC_WWarmerChData(Dictionary updtCh) + public override CmsError PLC_WWarmerSetupData(Dictionary updtCh) { // FIXME TODO #if false @@ -3150,15 +3190,7 @@ namespace CMS_CORE_Library.S7Net // try/catch try { - byte[] memByteSwap = new byte[Values.Count]; - // faccio swap a 2 byte x volta... - for (int i = 0; i < Values.Count / 2; i++) - { - memByteSwap[2 * i] = Values.ElementAt(2 * i + 1); - memByteSwap[2 * i + 1] = Values.ElementAt(2 * i); - } - currPLC.WriteBytes(DataType.DataBlock, MemTable, MemIndex, memByteSwap); - //currPLC.WriteBytes(DataType.DataBlock, MemTable, MemIndex, Values.ToArray()); + currPLC.WriteBytes(DataType.DataBlock, MemTable, MemIndex, Values.ToArray()); } catch { @@ -3170,18 +3202,11 @@ namespace CMS_CORE_Library.S7Net // Prevent some exceptions if (Number == 0) return NO_ERROR; - Values.Clear(); try { byte[] memByteRead = currPLC.ReadBytes(DataType.DataBlock, MemTable, MemIndex, Number); - // faccio swap a 2 byte x volta... - for (int i = 0; i < memByteRead.Length / 2; i++) - { - Values.Add(memByteRead[2 * i + 1]); - Values.Add(memByteRead[2 * i]); - } - //Values = memByteRead.ToList(); + Values = memByteRead.ToList(); } catch { @@ -4636,7 +4661,7 @@ namespace CMS_CORE_Library.S7Net // riscaldi internal static MEMORY_CELL RISC_OCC_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 514, 64, 64); - internal static MEMORY_CELL RISC_CHP_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 514, 128, 1024); + 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); internal static MEMORY_CELL RISC_OCS_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 514, 9472, 64); diff --git a/SiemensS7/Siemens-S7-Test/TestMainForm.cs b/SiemensS7/Siemens-S7-Test/TestMainForm.cs index b8af922..216d58f 100644 --- a/SiemensS7/Siemens-S7-Test/TestMainForm.cs +++ b/SiemensS7/Siemens-S7-Test/TestMainForm.cs @@ -223,7 +223,7 @@ namespace Siemens_S7_Test { memByteRead = currPLC.ReadBytes(DataType.DataBlock, memoria.DbNum, memoria.indiceMem, numByte); } - catch(Exception exc) + catch (Exception exc) { lg.Error(exc); } @@ -658,15 +658,26 @@ namespace Siemens_S7_Test break; case "byte": default: - // attenzione: byte sono GIRATI x cui DEVO invertire lettura pari/dispari... - for (int i = 0; i < memByteRead.Length / 2; i++) + if (true) { - // dispari - byteVal = Convert.ToString(memByteRead[i * 2 + 1], 2).PadLeft(8, '0'); - contenuto += string.Format("B{0:000}: {1} | {2}{3}", i * 2, byteVal, memByteRead[i * 2 + 1], Environment.NewLine); - // pari - byteVal = Convert.ToString(memByteRead[i * 2], 2).PadLeft(8, '0'); - contenuto += string.Format("B{0:000}: {1} | {2}{3}", i * 2 + 1, byteVal, memByteRead[i * 2], Environment.NewLine); + for (int i = 0; i < memByteRead.Length; i++) + { + byteVal = Convert.ToString(memByteRead[i], 2).PadLeft(8, '0'); + contenuto += string.Format("B{0:000}: {1} | {2}{3}", i, byteVal, memByteRead[i], Environment.NewLine); + } + } + else + { + // attenzione: byte sono GIRATI x cui DEVO invertire lettura pari/dispari... + for (int i = 0; i < memByteRead.Length / 2; i++) + { + // dispari + byteVal = Convert.ToString(memByteRead[i * 2 + 1], 2).PadLeft(8, '0'); + contenuto += string.Format("B{0:000}: {1} | {2}{3}", i * 2, byteVal, memByteRead[i * 2 + 1], Environment.NewLine); + // pari + byteVal = Convert.ToString(memByteRead[i * 2], 2).PadLeft(8, '0'); + contenuto += string.Format("B{0:000}: {1} | {2}{3}", i * 2 + 1, byteVal, memByteRead[i * 2], Environment.NewLine); + } } break; } @@ -704,7 +715,8 @@ namespace Siemens_S7_Test byte[] DB_Byte = new byte[1]; DB_Byte[0] = num2write; // attenzione endianness! invertire byte... - int fixIndex = memoria.indiceMem % 2 == 0 ? memoria.indiceMem + 1 : memoria.indiceMem - 1; + int fixIndex = memoria.indiceMem; + //int fixIndex = memoria.indiceMem % 2 == 0 ? memoria.indiceMem + 1 : memoria.indiceMem - 1; currPLC.WriteBytes(DataType.DataBlock, memoria.DbNum, fixIndex, DB_Byte); titolo = string.Format("WRITE BLOCK MEM: {0}", txtWriteAddr1.Text); contenuto = ""; From 6e26fcad7a6c55d351068c464ddf4337acad13d5 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 10 Jun 2020 19:14:01 +0200 Subject: [PATCH 2/2] added methods for writing warmers setup params --- CMS_CORE_Library/NcThermo.cs | 28 +++++- CMS_CORE_Library/S7Net/Nc_S7Net.cs | 153 +++++++++++++++++++++-------- 2 files changed, 137 insertions(+), 44 deletions(-) diff --git a/CMS_CORE_Library/NcThermo.cs b/CMS_CORE_Library/NcThermo.cs index 4526bb2..4d523d3 100644 --- a/CMS_CORE_Library/NcThermo.cs +++ b/CMS_CORE_Library/NcThermo.cs @@ -655,21 +655,39 @@ namespace CMS_CORE_Library /// /// Set current Warmers Channels setpoints /// - /// + /// /// public abstract CmsError PLC_WWarmerChSetpHmi(Dictionary newData); /// /// Set current Warmers Channels setpoints /// - /// + /// /// public abstract CmsError PLC_WWarmerChSetpTCam(Dictionary newData); /// - /// Set current Warmers Channels setup data + /// Set current Warmers Channels reflector's data /// - /// + /// /// - public abstract CmsError PLC_WWarmerSetupData(Dictionary currWarmerChannelList); + public abstract CmsError PLC_WWarmerConfRefl(Dictionary newData); + /// + /// Get current Warmers VU min parameter + /// + /// + /// + public abstract CmsError PLC_RWarmerConfVUMin(ref ushort VUmin); + /// + /// Set current Warmers Channels min current's data + /// + /// + /// + public abstract CmsError PLC_WWarmerConfMinCurr(Dictionary newData); + /// + /// Set current Warmers board enabled + /// + /// + /// + public abstract CmsError PLC_WWarmerConfBoardEnabl(Dictionary newData); /// /// Read power gauge data /// diff --git a/CMS_CORE_Library/S7Net/Nc_S7Net.cs b/CMS_CORE_Library/S7Net/Nc_S7Net.cs index 7ae03ad..a762c5b 100644 --- a/CMS_CORE_Library/S7Net/Nc_S7Net.cs +++ b/CMS_CORE_Library/S7Net/Nc_S7Net.cs @@ -2591,36 +2591,28 @@ namespace CMS_CORE_Library.S7Net /// public override CmsError PLC_WWarmerChSetpTCam(Dictionary newData) { + // FIXME TODO serve nuova area termocamera +#if false // memory area byte[] newMem = new byte[newData.Count]; List currMem = new List(); -#if false - // per fare swapt faccio 2 alla volta e inverto ordine... - for (int i = 0; i < RISC_CHP_DATA.Size / 2; i++) - { - // aggiungo bit dispari - newMem.Add((byte)updtCh[i * 2 + 1]); - // aggiungo bit pari - newMem.Add((byte)updtCh[i * 2]); - } + // read actual data on memory... + CmsError cmsError = MEM_RWByteList(R, 0, RISC_CHP_DATA.MemType, RISC_CHP_DATA.Address, RISC_CHP_DATA.SubAddress, 0, RISC_CHP_DATA.Size, ref currMem); + if (cmsError.IsError()) + return cmsError; -#endif - // converto a blocchi di 2 byte... - for (int i = 0; i < RISC_CHP_DATA.Size; i++) + newMem = currMem.ToArray(); + + // update only given data... + foreach (var item in newData) { - //newMem.Add(ThermoWarmChannels[i].SetpointPLC); - newMem[i] = (byte)newData[i]; + newMem[item.Key - 1] = (byte)item.Value; } - // converto + // return as list... currMem = newMem.ToList(); // scrivo sul PLC array di byte... - CmsError cmsError = MEM_RWByteList(W, 0, RISC_CHP_DATA.MemType, RISC_CHP_DATA.Address, RISC_CHP_DATA.SubAddress, 0, RISC_CHP_DATA.Size, ref currMem); - - // error in write WARM area... -#if false - // write! - CmsError cmsError = MEM_RWByteList(W, 0, RISC_CHP_DATA.MemType, RISC_CHP_DATA.Address, RISC_CHP_DATA.SubAddress, 0, RISC_CHP_DATA.Size, ref newMem); + cmsError = MEM_RWByteList(W, 0, RISC_CHP_DATA.MemType, RISC_CHP_DATA.Address, RISC_CHP_DATA.SubAddress, 0, RISC_CHP_DATA.Size, ref currMem); if (cmsError.IsError()) return cmsError; #endif @@ -2628,33 +2620,115 @@ namespace CMS_CORE_Library.S7Net return NO_ERROR; } /// - /// Write Warmers channels setup parameters + /// Set current Warmers Channels reflector's data /// /// /// - public override CmsError PLC_WWarmerSetupData(Dictionary updtCh) + public override CmsError PLC_WWarmerConfRefl(Dictionary newData) { - // FIXME TODO -#if false - // init variabili accessorie + // memory area + byte[] newMem = new byte[newData.Count]; List currMem = new List(); - int packSize = 20; - int memIndex = PARAMETER_DATA.SubAddress + (updtCh.Id - 1) * packSize; - // leggo in primis il parametro che mi richiedono - CmsError cmsError = MEM_RWByteList(R, 0, PARAMETER_DATA.MemType, PARAMETER_DATA.Address, memIndex, 0, packSize, ref currMem); + + // read actual data on memory... + CmsError cmsError = MEM_RWByteList(R, 0, RISC_CFI_DATA.MemType, RISC_CFI_DATA.Address, RISC_CFI_DATA.SubAddress, 0, RISC_CFI_DATA.Size, ref currMem); if (cmsError.IsError()) return cmsError; - // converto in parametro... - PlcParam currParam = new PlcParam(currMem.ToArray()); - // aggiorno SetpointHMI... - currParam.SetpointHMI = (int)updtCh.SetpointHMI; - // converto a NUOVA lista byte - List newMem = currParam.convertToByte().ToList(); - cmsError = MEM_RWByteList(W, 0, PARAMETER_DATA.MemType, PARAMETER_DATA.Address, memIndex, 0, packSize, ref newMem); + 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... + cmsError = MEM_RWByteList(W, 0, RISC_CFI_DATA.MemType, RISC_CFI_DATA.Address, RISC_CFI_DATA.SubAddress, 0, RISC_CFI_DATA.Size, ref currMem); if (cmsError.IsError()) - return cmsError; -#endif + return cmsError; + + return NO_ERROR; + } + /// + /// Set current Warmers Channels reflector's data + /// + /// + /// + public override CmsError PLC_RWarmerConfVUMin(ref ushort VUmin) + { + // leggo da 513.0 + VUmin = 1; + List currMem = new List(); + + // read actual data on memory... + CmsError cmsError = MEM_RWWord(R, 0, RISC_VU_MIN.MemType, RISC_VU_MIN.Address, RISC_VU_MIN.SubAddress, ref VUmin); + if (cmsError.IsError()) + return cmsError; + + return NO_ERROR; + } + /// + /// Set current Warmers Channels reflector's data + /// + /// + /// + public override CmsError PLC_WWarmerConfMinCurr(Dictionary newData) + { + // memory area + List ListValue = new List(); + + // read actual data on memory... + CmsError cmsError = MEM_RWDoubleList(R, 0, RISC_OCC_DATA.MemType, RISC_OCC_DATA.Address, RISC_OCC_DATA.SubAddress, RISC_OCC_DATA.Size, ref ListValue); + if (cmsError.IsError()) + return cmsError; + + var newMem = ListValue.ToArray(); + + // update only given data... + foreach (var item in newData) + { + newMem[item.Key - 1] = item.Value; + } + // return as list... + ListValue = newMem.ToList(); + // scrivo sul PLC array di byte... + cmsError = MEM_RWDoubleList(W, 0, RISC_OCC_DATA.MemType, RISC_OCC_DATA.Address, RISC_OCC_DATA.SubAddress, RISC_OCC_DATA.Size, ref ListValue); + if (cmsError.IsError()) + return cmsError; + + return NO_ERROR; + } + /// + /// Set current Warmers Channels reflector's data + /// + /// + /// + public override CmsError PLC_WWarmerConfBoardEnabl(Dictionary newData) + { + // memory area + byte[] newMem = new byte[newData.Count]; + List currMem = new List(); + + // read actual data on memory... + CmsError cmsError = MEM_RWByteList(R, 0, RISC_OCC_DATA.MemType, RISC_OCC_DATA.Address, RISC_OCC_DATA.SubAddress, 0, RISC_OCC_DATA.Size, ref currMem); + if (cmsError.IsError()) + return cmsError; + + 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... + cmsError = MEM_RWByteList(W, 0, RISC_OCC_DATA.MemType, RISC_OCC_DATA.Address, RISC_OCC_DATA.SubAddress, 0, RISC_OCC_DATA.Size, ref currMem); + if (cmsError.IsError()) + return cmsError; return NO_ERROR; } @@ -4660,6 +4734,7 @@ namespace CMS_CORE_Library.S7Net internal static MEMORY_CELL MODULE_RT_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 603, 12, 1536); // riscaldi + internal static MEMORY_CELL RISC_VU_MIN = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 513, 0, 1); internal static MEMORY_CELL RISC_OCC_DATA = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 514, 64, 64); 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);