diff --git a/CMS_CORE_Library/CMS_CORE_Library.csproj b/CMS_CORE_Library/CMS_CORE_Library.csproj index 507b6c5..c993a90 100644 --- a/CMS_CORE_Library/CMS_CORE_Library.csproj +++ b/CMS_CORE_Library/CMS_CORE_Library.csproj @@ -103,8 +103,8 @@ False libs\CndexLinkDotNet.dll - - ..\packages\S7netplus.0.4.0\lib\net452\S7.Net.dll + + ..\..\cms_thermo_active\packages\S7netplus.0.7.0\lib\net452\S7.Net.dll False diff --git a/CMS_CORE_Library/Demo/Nc_Demo.cs b/CMS_CORE_Library/Demo/Nc_Demo.cs index 9d15eff..f7f3924 100644 --- a/CMS_CORE_Library/Demo/Nc_Demo.cs +++ b/CMS_CORE_Library/Demo/Nc_Demo.cs @@ -27,6 +27,7 @@ namespace CMS_CORE_Library.Demo private DemoEdgesConfiguration DemoEdgesConfiguration = new DemoEdgesConfiguration(); private const string PART_PROGRAM_FOLDER = "C:/CMS/Active/DEMO/part_program/"; private const string JOB_PROGRAM_FOLDER = PART_PROGRAM_FOLDER + "\\job\\"; + private Random rand = new Random(); // Magazine config parameters private List MagazineConfig = new List() @@ -1142,6 +1143,12 @@ namespace CMS_CORE_Library.Demo return NO_ERROR; } + public override CmsError PROC_RFeed(ushort ProcNumber, ref float Feed) + { + Feed = Convert.ToSingle(rand.NextDouble() * 100); + return NO_ERROR; + } + private CmsError ResetStrobe(int bitId, int strobeByte, int ackByte, MEMORY_TYPE memType) { int n = 5; @@ -1419,6 +1426,7 @@ namespace CMS_CORE_Library.Demo // Populate response structure processData.Type = bits[3] ? "AUX" : "WORK"; processData.CanLoadProgram = bits[6]; + processData.IsInPieceWork = rand.NextDouble() > 0.5f; // Choose process status if (bits[4]) diff --git a/CMS_CORE_Library/Fanuc/Nc_Fanuc.cs b/CMS_CORE_Library/Fanuc/Nc_Fanuc.cs index f691abc..2fd1729 100644 --- a/CMS_CORE_Library/Fanuc/Nc_Fanuc.cs +++ b/CMS_CORE_Library/Fanuc/Nc_Fanuc.cs @@ -1615,6 +1615,7 @@ namespace CMS_CORE_Library.Fanuc // Get process part program data public override CmsError PROC_RStatusAndData(ushort procNumber, ref ProcessDataModel processData) { + Boolean Cut = false; processData.Id = procNumber; // Read part program name CmsError cmsError = PROC_RSelectedPPName(procNumber, ref processData.PartProgramName); @@ -1627,6 +1628,15 @@ namespace CMS_CORE_Library.Fanuc if (cmsError.IsError()) return cmsError; + //Read CUT variable + byte CutRaw = 0; + int address = (1000 * (procNumber - 1)) + 2; + cmsError = MEM_RWByte(R, 0, MEMORY_TYPE.Fanuc_F, address, 0, ref CutRaw); + if (cmsError.IsError()) + return cmsError; + + Cut = (CutRaw & 0x40) == 0x40; + byte[] bytes = BitConverter.GetBytes(readValue); // Convert Byte into true/false array @@ -1640,6 +1650,7 @@ namespace CMS_CORE_Library.Fanuc processData.IsSelected = bits[2]; processData.IsInAlarm = bits[3]; processData.CanLoadProgram = bits[4]; + processData.IsInPieceWork = Cut; // Choose process status if (bytes[1] == 1) @@ -2004,6 +2015,28 @@ namespace CMS_CORE_Library.Fanuc return NO_ERROR; } + + + public override CmsError PROC_RFeed(ushort ProcNumber, ref float Feed) + { + CmsError cmsError = CheckConnection(); + if (cmsError.IsError()) + return cmsError; + + if (ProcNumber <= 0) + return PROC_NOT_FOUND_ERROR; + + + ODBACT feedRaw = new ODBACT(); + short nReturn = Focas1.cnc_actf(nLibHandle[ProcNumber - 1], feedRaw); + // Check return value + if (nReturn != 0) + return GetNcError(nReturn); + + Feed = feedRaw.data / 10.0f; + return NO_ERROR; + } + #endregion PROCESS (PATH) High-level data /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/CMS_CORE_Library/Models/DataStructures.cs b/CMS_CORE_Library/Models/DataStructures.cs index d063401..e7c4506 100644 --- a/CMS_CORE_Library/Models/DataStructures.cs +++ b/CMS_CORE_Library/Models/DataStructures.cs @@ -285,6 +285,7 @@ namespace CMS_CORE_Library.Models public bool Visible; public ushort Reps; public bool IsSelected; + public bool IsInPieceWork; public bool CanLoadProgram; } diff --git a/CMS_CORE_Library/Nc.cs b/CMS_CORE_Library/Nc.cs index 95e39b9..b0ee14a 100644 --- a/CMS_CORE_Library/Nc.cs +++ b/CMS_CORE_Library/Nc.cs @@ -775,6 +775,20 @@ namespace CMS_CORE_Library public abstract CmsError PLC_WTerminateAssistedToolingProcedure(); + /** + * + * Read the actual feed of the Process "ProcNumber" + * + * Compatibility: Fanuc | Osai | Demo | Siemens + * + * + * Returns an error when an internal or a library error occours + * Process number which the data refer + * Feed of the Process in mm/min + * */ + + public abstract CmsError PROC_RFeed(ushort ProcNumber, ref float Feed); + #endregion PROCESS (PATH, CHANNEL) data (to override) /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/CMS_CORE_Library/Osai/Nc_Osai.cs b/CMS_CORE_Library/Osai/Nc_Osai.cs index 71fced3..b46c011 100644 --- a/CMS_CORE_Library/Osai/Nc_Osai.cs +++ b/CMS_CORE_Library/Osai/Nc_Osai.cs @@ -1954,9 +1954,18 @@ namespace CMS_CORE_Library.Osai cmsError = MEM_RWInteger(R, 0, PROCESS_STATUS.MemType, PROCESS_STATUS.Address + ((procNumber - 1) * 2), ref readValue); if (cmsError.IsError()) return cmsError; - byte[] bytes = BitConverter.GetBytes(readValue); + + // Read processes status from memory + int index = (20 * procNumber) + 2; + ushort readWord = 0; + bool isInPiece = false; + cmsError = MEM_RWWord(R, 0, MEMORY_TYPE.Osai_SW, PROCESS_STATUS.Address + ((procNumber - 1) * 2), ref readWord); + if (cmsError.IsError()) + return cmsError; + isInPiece = (readWord & 0x1) != 0x1; //Bit 1 + // Convert Byte into true/false array BitArray bits = new BitArray(new byte[] { bytes[0] }); //1st byte -> 0 : Proccess type (AUX-WORK), 1: Process in alarm status, 2: Run, 3: Hold, 4: Read, 5: PartProgramVisible @@ -1968,6 +1977,7 @@ namespace CMS_CORE_Library.Osai processData.IsSelected = bits[2]; processData.IsInAlarm = bits[3]; processData.CanLoadProgram = bits[4]; + processData.IsInPieceWork = isInPiece; // Choose process status if (bytes[1] == 1) @@ -2095,6 +2105,17 @@ namespace CMS_CORE_Library.Osai } + + public override CmsError PROC_RFeed(ushort ProcNumber, ref float Feed) + { + ushort nReturn = OpenNC.GetNcInfo1((ushort)ProcNumber, out GETINFO1DATA info, out uint errorClass, out uint errorNum); + if (errorClass != 0 || errorNum != 0 || nReturn == 0) + return GetNCError(errorClass, errorNum); + + Feed = Convert.ToSingle(info.realfeed); + return NO_ERROR; + } + #endregion PROCESS (PATH) High-level data /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/CMS_CORE_Library/Siemens/Nc_Siemens.cs b/CMS_CORE_Library/Siemens/Nc_Siemens.cs index 8659339..2b9c222 100644 --- a/CMS_CORE_Library/Siemens/Nc_Siemens.cs +++ b/CMS_CORE_Library/Siemens/Nc_Siemens.cs @@ -2325,6 +2325,7 @@ namespace CMS_CORE_Library.Siemens processData.IsSelected = bits[2]; processData.IsInAlarm = bits[3]; processData.CanLoadProgram = bits[4]; + processData.IsInPieceWork = false; // Choose process status if (bytes[1] == 1) @@ -2514,6 +2515,28 @@ namespace CMS_CORE_Library.Siemens return NO_ERROR; } + + + public override CmsError PROC_RFeed(ushort ProcNumber, ref float Feed) + { + if (ProcNumber <= 0) + return PROC_NOT_FOUND_ERROR; + try + { + Item item = new Item { Path = "/Channel/State/actFeedRateIpo[u" + ProcNumber + ", 1]" }; + // Read data + DataSvc dataSvc = new DataSvc(); + dataSvc.Read(item); + Feed = Convert.ToSingle(item.Value); + } + catch (Exception ex) + { + return ManageException(ex); + } + + return NO_ERROR; + } + private CmsError PROC_ReadActiveLine(uint processId, ref string line) { try diff --git a/CMS_CORE_Library/packages.config b/CMS_CORE_Library/packages.config index ed7aa38..7d28004 100644 --- a/CMS_CORE_Library/packages.config +++ b/CMS_CORE_Library/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file