diff --git a/CMS_CORE_Library/S7Net/Nc_S7Net.cs b/CMS_CORE_Library/S7Net/Nc_S7Net.cs index 92e26f0..3619e35 100644 --- a/CMS_CORE_Library/S7Net/Nc_S7Net.cs +++ b/CMS_CORE_Library/S7Net/Nc_S7Net.cs @@ -1,5 +1,6 @@ using CMS_CORE_Library.Models; using S7.Net; +using Siemens.Sinumerik.Operate.Services; using System; using System.Collections; using System.Collections.Generic; @@ -3054,144 +3055,165 @@ namespace CMS_CORE_Library.S7Net var memByteRead = currPLC.ReadBytes(DataType.DataBlock, MemTable, MemIndex, Number); Values = memByteRead.ToList(); -#if false - // ciclo eda ggiungo i bytes... - foreach (var item in memByteRead) - { - Values.Add(item); - } -#endif } return NO_ERROR; } - public override CmsError MEM_RWWordList(bool bWrite, int Process, MEMORY_TYPE MemType, int MemTable, int MemIndex, int Number, ref List Value) + public override CmsError MEM_RWWordList(bool bWrite, int Process, MEMORY_TYPE MemType, int MemTable, int MemIndex, int Number, ref List Values) { ////Check if the NC is Connected CmsError cmsError = CheckConnection(); if (cmsError.IsError()) return cmsError; - //Try to get/set information - try + + if (MemType != MEMORY_TYPE.Siemens_DB) { - //Setup variables - DataSvc Data = HighPriorityDataSvc(); - cmsError = ConvertMemToPath(MemType, MemTable, MemIndex, 0, (bWrite) ? Value.Count : Number, 'W', out string itemString); - - if (cmsError.IsError()) - return cmsError; - Item item = new Item(itemString); - - //Read-Write Data - if (bWrite) - { - item.Value = Value.ToArray(); - Data.Write(item); - } - else - { - Data.Read(item); - if (item.Value.GetType().IsArray) - Value = Array.ConvertAll(((object[])item.Value).Cast().ToArray(), input => (ushort)input).ToList(); - else - { - Value.Clear(); - Value.Add(Convert.ToUInt16((uint)item.Value)); - } - } + return INCORRECT_PARAMETERS_ERROR; } - catch (Exception ex) + + + cmsError = null; + + if (bWrite) { - return ManageException(ex); + //Prevent some exceptions + if (Values.Count == 0) + return NO_ERROR; + + byte[] singleItem = new byte[2]; + List memByteList = new List(); + + foreach(var Item in Values) + { + singleItem = S7.Net.Types.Word.ToByteArray(Item); + memByteList.AddRange(singleItem); + } + + currPLC.WriteBytes(DataType.DataBlock, MemTable, MemIndex, memByteList.ToArray()); + } + else + { + // Prevent some exceptions + if (Number == 0) + return NO_ERROR; + + Values.Clear(); + + byte[] memByteRead = currPLC.ReadBytes(DataType.DataBlock, MemTable, MemIndex, Number); + // converto a word! + ushort shortVal = 0; + for (int i = 0; i < memByteRead.Length / 2; i++) + { + shortVal = S7.Net.Types.Word.FromByteArray(memByteRead.Skip(2 * i).Take(2).ToArray()); + Values.Add(shortVal); + } } return NO_ERROR; } - public override CmsError MEM_RWShortList(bool bWrite, int Process, MEMORY_TYPE MemType, int MemTable, int MemIndex, int Number, ref List Value) + public override CmsError MEM_RWShortList(bool bWrite, int Process, MEMORY_TYPE MemType, int MemTable, int MemIndex, int Number, ref List Values) { //Check if the NC is Connected CmsError cmsError = CheckConnection(); if (cmsError.IsError()) return cmsError; - //Try to get/set information - try + if (MemType != MEMORY_TYPE.Siemens_DB) { - //Setup variables - DataSvc Data = HighPriorityDataSvc(); - cmsError = ConvertMemToPath(MemType, MemTable, MemIndex, 0, (bWrite) ? Value.Count : Number, 'W', out string itemString); - - if (cmsError.IsError()) - return cmsError; - Item item = new Item(itemString); - - //Read-Write Data - if (bWrite) - { - item.Value = Value.ToArray(); - Data.Write(item); - } - else - { - Data.Read(item); - if (item.Value.GetType().IsArray) - Value = Array.ConvertAll(((object[])item.Value).Cast().ToArray(), input => unchecked((short)input)).ToList(); - else - { - Value.Clear(); - Value.Add(unchecked((short)(uint)item.Value)); - } - } + return INCORRECT_PARAMETERS_ERROR; } - catch (Exception ex) + + + cmsError = null; + + if (bWrite) { - return ManageException(ex); + //Prevent some exceptions + if (Values.Count == 0) + return NO_ERROR; + + byte[] singleItem = new byte[2]; + List memByteList = new List(); + + foreach (var Item in Values) + { + singleItem = S7.Net.Types.Int.ToByteArray(Item); + memByteList.AddRange(singleItem); + } + + currPLC.WriteBytes(DataType.DataBlock, MemTable, MemIndex, memByteList.ToArray()); + } + else + { + // Prevent some exceptions + if (Number == 0) + return NO_ERROR; + + Values.Clear(); + + byte[] memByteRead = currPLC.ReadBytes(DataType.DataBlock, MemTable, MemIndex, Number); + // converto a word! + short shortVal = 0; + for (int i = 0; i < memByteRead.Length / 2; i++) + { + shortVal = S7.Net.Types.Int.FromByteArray(memByteRead.Skip(2 * i).Take(2).ToArray()); + Values.Add(shortVal); + } } return NO_ERROR; } - public override CmsError MEM_RWDWordList(bool bWrite, int Process, MEMORY_TYPE MemType, int MemTable, int MemIndex, int Number, ref List Value) + public override CmsError MEM_RWDWordList(bool bWrite, int Process, MEMORY_TYPE MemType, int MemTable, int MemIndex, int Number, ref List Values) { //Check if the NC is Connected CmsError cmsError = CheckConnection(); if (cmsError.IsError()) return cmsError; - //Try to get/set information - try + if (MemType != MEMORY_TYPE.Siemens_DB) { - //Setup variables - DataSvc Data = HighPriorityDataSvc(); - cmsError = ConvertMemToPath(MemType, MemTable, MemIndex, 0, (bWrite) ? Value.Count : Number, 'D', out string itemString); - - if (cmsError.IsError()) - return cmsError; - Item item = new Item(itemString); - //Read-Write Data - if (bWrite) - { - item.Value = Value.ToArray(); - Data.Write(item); - } - else - { - Data.Read(item); - if (item.Value.GetType().IsArray) - Value = ((object[])item.Value).Cast().ToList(); - else - { - Value.Clear(); - Value.Add((uint)item.Value); - } - } + return INCORRECT_PARAMETERS_ERROR; } - catch (Exception ex) + + cmsError = null; + + if (bWrite) { - return ManageException(ex); + //Prevent some exceptions + if (Values.Count == 0) + return NO_ERROR; + + byte[] singleItem = new byte[2]; + List memByteList = new List(); + + foreach (var Item in Values) + { + singleItem = S7.Net.Types.DWord.ToByteArray(Item); + memByteList.AddRange(singleItem); + } + + currPLC.WriteBytes(DataType.DataBlock, MemTable, MemIndex, memByteList.ToArray()); + } + else + { + // Prevent some exceptions + if (Number == 0) + return NO_ERROR; + + Values.Clear(); + + byte[] memByteRead = currPLC.ReadBytes(DataType.DataBlock, MemTable, MemIndex, Number); + // converto a word! + uint shortVal = 0; + for (int i = 0; i < memByteRead.Length / 2; i++) + { + shortVal = S7.Net.Types.DWord.FromByteArray(memByteRead.Skip(2 * i).Take(2).ToArray()); + Values.Add(shortVal); + } } return NO_ERROR;