diff --git a/CMS_CORE_Library/Models/DataStructures.cs b/CMS_CORE_Library/Models/DataStructures.cs
index ea484d1..fecec47 100644
--- a/CMS_CORE_Library/Models/DataStructures.cs
+++ b/CMS_CORE_Library/Models/DataStructures.cs
@@ -171,6 +171,7 @@ namespace CMS_CORE_Library.Models
public static CmsError NO_ERROR = new CmsError(CMS_ERROR_CODES.OK, "");
public static CmsError NOT_CONNECTED_ERROR = new CmsError(CMS_ERROR_CODES.NOT_CONNECTED, "error_not_connected");
+ public static CmsError NOT_FOUND_ERROR = new CmsError(CMS_ERROR_CODES.INTERNAL_ERROR, "error_not_found");
public static CmsError PROC_NOT_FOUND_ERROR = new CmsError(CMS_ERROR_CODES.FUNCTION_NOT_ALLOWED, "error_process_not_found");
public static CmsError FUNCTION_NOT_ALLOWED_ERROR = new CmsError(CMS_ERROR_CODES.FUNCTION_NOT_ALLOWED, "error_function_not_allowed");
public static CmsError BIT_NOT_IN_RANGE_ERROR = new CmsError(CMS_ERROR_CODES.BIT_NOT_IN_RANGE, "error_bit_not_in_range");
diff --git a/CMS_CORE_Library/Models/ThermoModels.cs b/CMS_CORE_Library/Models/ThermoModels.cs
index 52a9732..324a9e4 100644
--- a/CMS_CORE_Library/Models/ThermoModels.cs
+++ b/CMS_CORE_Library/Models/ThermoModels.cs
@@ -147,9 +147,11 @@ namespace CMS_CORE_Library.Models
public class WarmerChannel
{
public int IdChannel { get; set; } = 0;
+ public double SetpointRecipe { get; set; } = 0;
public double SetpointThermoCam { get; set; } = 0;
public double SetpointPLC { get; set; } = 0;
public byte ChStatus { get; set; } = 0;
+ public double CurrAct { get; set; } = 0;
public byte PercAct { get; set; } = 0;
public override bool Equals(object obj)
@@ -160,12 +162,16 @@ namespace CMS_CORE_Library.Models
if (IdChannel != item.IdChannel)
return false;
+ if (SetpointRecipe != item.SetpointRecipe)
+ return false;
if (SetpointThermoCam != item.SetpointThermoCam)
return false;
if (SetpointPLC != item.SetpointPLC)
return false;
if (ChStatus != item.ChStatus)
return false;
+ if (CurrAct != item.CurrAct)
+ return false;
if (PercAct != item.PercAct)
return false;
diff --git a/CMS_CORE_Library/NcThermo.cs b/CMS_CORE_Library/NcThermo.cs
index f01dbc4..cc622b8 100644
--- a/CMS_CORE_Library/NcThermo.cs
+++ b/CMS_CORE_Library/NcThermo.cs
@@ -653,6 +653,18 @@ namespace CMS_CORE_Library
///
public abstract CmsError PLC_RWarmerChannelList(ref Dictionary currWarmerChannelList);
///
+ /// Set current Warmers Channels setpoints
+ ///
+ ///
+ ///
+ public abstract CmsError PLC_WWarmerChSetpoints(Dictionary currWarmerChannelList);
+ ///
+ /// Set current Warmers Channels setup data
+ ///
+ ///
+ ///
+ public abstract CmsError PLC_WWarmerChData(Dictionary currWarmerChannelList);
+ ///
/// Read power gauge data
///
/// Compatibility: S7Net
diff --git a/CMS_CORE_Library/S7Net/Nc_S7Net.cs b/CMS_CORE_Library/S7Net/Nc_S7Net.cs
index 71bf528..53f2902 100644
--- a/CMS_CORE_Library/S7Net/Nc_S7Net.cs
+++ b/CMS_CORE_Library/S7Net/Nc_S7Net.cs
@@ -1912,6 +1912,8 @@ namespace CMS_CORE_Library.S7Net
// refresh % attuale
refreshRiscPerc();
// refresh setpoint PLC
+ refreshRiscActCurr();
+ // refresh setpoint PLC
refreshRiscSetpointPLC();
// refresh setpoint termocamera ???
refreshRiscSetpointTermoCam();
@@ -2005,7 +2007,7 @@ namespace CMS_CORE_Library.S7Net
}
///
- /// Refresh recip parameters RT
+ /// Refresh recipE parameters RT
///
protected void refreshMemRecipeParameterRT()
{
@@ -2368,6 +2370,42 @@ namespace CMS_CORE_Library.S7Net
// leggo DB500 x area Ich
List currMem = new List();
+ // leggo da PLC a array di byte di appoggio...
+ 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);
+
+ // copio! controllo SE ho dati...
+ if (currMem.Count > 0)
+ {
+ // converto a blocchi di 8 byte...
+ byte[] memArray = currMem.ToArray();
+ double currVal = 0;
+ for (int i = 0; i < RISC_CHP_DATA.Size / 4; i++)
+ {
+ 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))
+ {
+ ThermoWarmChannels[i + 1].SetpointPLC = currVal;
+ }
+ else
+ {
+ ThermoWarmChannels.Add(i + 1, new ThermoModels.WarmerChannel()
+ {
+ IdChannel = i + 1,
+ SetpointPLC = currVal
+ });
+ }
+ }
+ }
+ }
+ ///
+ /// Refresh Canali Riscaldi: actual current PLC
+ ///
+ private void refreshRiscActCurr()
+ {
+ // leggo DB500 x area Ich
+ List currMem = new List();
+
// leggo da PLC a array di byte di appoggio...
CmsError cmsError = MEM_RWByteList(R, 0, RISC_ICH_DATA.MemType, RISC_ICH_DATA.Address, RISC_ICH_DATA.SubAddress, 0, RISC_ICH_DATA.Size, ref currMem);
@@ -2383,14 +2421,14 @@ namespace CMS_CORE_Library.S7Net
// cerco id + 1 (su memoria è base 0)
if (ThermoWarmChannels.ContainsKey(i + 1))
{
- ThermoWarmChannels[i + 1].SetpointPLC = currVal;
+ ThermoWarmChannels[i + 1].CurrAct = currVal;
}
else
{
ThermoWarmChannels.Add(i + 1, new ThermoModels.WarmerChannel()
{
IdChannel = i + 1,
- SetpointPLC = currVal
+ CurrAct = currVal
});
}
}
@@ -2465,6 +2503,66 @@ namespace CMS_CORE_Library.S7Net
}
}
+ ///
+ /// Write Warmers channels load data
+ ///
+ ///
+ ///
+ public override CmsError PLC_WWarmerChSetpoints(Dictionary updtCh)
+ {
+ // memory area
+ List newMem = new List();
+
+ // 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]);
+ }
+
+ // 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);
+ if (cmsError.IsError())
+ return cmsError;
+#endif
+
+ return NO_ERROR;
+ }
+ ///
+ /// Write Warmers channels setup parameters
+ ///
+ ///
+ ///
+ public override CmsError PLC_WWarmerChData(Dictionary updtCh)
+ {
+ // FIXME TODO
+#if false
+ // init variabili accessorie
+ 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);
+ 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);
+ if (cmsError.IsError())
+ return cmsError;
+#endif
+
+ return NO_ERROR;
+ }
#endregion
@@ -2860,6 +2958,9 @@ namespace CMS_CORE_Library.S7Net
cmsError = null;
+ // attenzione endianness! invertire byte...
+ int fixIndex = MemIndex % 2 == 0 ? MemIndex + 1 : MemIndex - 1;
+
if (bWrite)
{
// try/catch
@@ -2867,7 +2968,7 @@ namespace CMS_CORE_Library.S7Net
{
byte[] DB_Byte = new byte[1];
DB_Byte[0] = Value;
- currPLC.WriteBytes(DataType.DataBlock, MemTable, MemIndex, DB_Byte);
+ currPLC.WriteBytes(DataType.DataBlock, MemTable, fixIndex, DB_Byte);
}
catch
{
@@ -2878,7 +2979,7 @@ namespace CMS_CORE_Library.S7Net
{
try
{
- var memByteRead = currPLC.ReadBytes(DataType.DataBlock, MemTable, MemIndex, 1);
+ var memByteRead = currPLC.ReadBytes(DataType.DataBlock, MemTable, fixIndex, 1);
Value = memByteRead[0];
}
catch
diff --git a/SiemensS7/Siemens-S7-Test/TestMainForm.cs b/SiemensS7/Siemens-S7-Test/TestMainForm.cs
index f34fda3..e139812 100644
--- a/SiemensS7/Siemens-S7-Test/TestMainForm.cs
+++ b/SiemensS7/Siemens-S7-Test/TestMainForm.cs
@@ -219,7 +219,12 @@ namespace Siemens_S7_Test
{
sw.Restart();
// eseguo test
- memByteRead = currPLC.ReadBytes(DataType.DataBlock, memoria.DbNum, memoria.indiceMem, numByte);
+ try
+ {
+ memByteRead = currPLC.ReadBytes(DataType.DataBlock, memoria.DbNum, memoria.indiceMem, numByte);
+ }
+ catch
+ { }
sw.Stop();
// salvo risultati
PerfStats.addValue((double)sw.ElapsedMilliseconds);
@@ -651,10 +656,15 @@ namespace Siemens_S7_Test
break;
case "byte":
default:
- for (int i = 0; i < memByteRead.Length; i++)
+ // attenzione: byte sono GIRATI x cui DEVO invertire lettura pari/dispari...
+ for (int i = 0; i < memByteRead.Length / 2; 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);
+ // 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;
}
@@ -691,7 +701,9 @@ namespace Siemens_S7_Test
byte.TryParse(txtWriteVal1.Text, out num2write);
byte[] DB_Byte = new byte[1];
DB_Byte[0] = num2write;
- currPLC.WriteBytes(DataType.DataBlock, memoria.DbNum, memoria.indiceMem, DB_Byte);
+ // attenzione endianness! invertire byte...
+ 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 = "";
contenuto += string.Format("DT: {0} | DbNum: {1} | indiceMem: {2} | num2write: {3}{4}{4}", DataType.DataBlock, memoria.DbNum, memoria.indiceMem, num2write, Environment.NewLine);