diff --git a/CMS_CORE_Application/Form1.cs b/CMS_CORE_Application/Form1.cs index 308b329..c810c98 100644 --- a/CMS_CORE_Application/Form1.cs +++ b/CMS_CORE_Application/Form1.cs @@ -1,10 +1,10 @@ -using CMS_CORE_Library.Demo; +using CMS_CORE_Application.ToolDatabase; +using CMS_CORE_Library; +using CMS_CORE_Library.Demo; using CMS_CORE_Library.Fanuc; +using CMS_CORE_Library.Models; using CMS_CORE_Library.Osai; using CMS_CORE_Library.Siemens; -using CMS_CORE_Application.ToolDatabase; -using CMS_CORE_Library; -using CMS_CORE_Library.Models; using System; using System.Collections.Generic; using System.Diagnostics; @@ -69,7 +69,7 @@ namespace CMS_CORE_Application Dictionary Axes = new Dictionary(); Stopwatch sw = new Stopwatch(); List procAlarms = new List(); - List Msg = new List(); + List plcMsg = new List(); PreAndPostPowerOnModel powerOn = new PreAndPostPowerOnModel(); List ncAlarms = new List(); List Lines = new List(); @@ -113,7 +113,7 @@ namespace CMS_CORE_Application SetError(Lines, cmsError); } - cmsError = N.PLC_RActiveMessages(ref Msg); + cmsError = N.PLC_RActiveMessages(ref plcMsg); if (cmsError.IsError()) { error = true; @@ -147,12 +147,15 @@ namespace CMS_CORE_Application // cmsError = N.MEM_RWIntegerList(false, 0, Nc.MEMORY_TYPE.Osai_GW, 0, 512, ref list); // cmsError = N.MEM_RWWordList(false, 0, Nc.MEMORY_TYPE.Fanuc_R, 0, 512, ref listS); cmsError = N.MEM_RWIntegerList(false, 0, Nc.MEMORY_TYPE.Siemens_DB, 258, 0, 512, ref list); - st.Stop(); + Console.WriteLine(st.ElapsedMilliseconds); ActiveProgramDataModel info = new ActiveProgramDataModel(); - cmsError = N.FILES_RActiveProgramData(1, ref info); - cmsError = N.PLC_RPowerOnData(ref powerOn); + sw.Restart(); + cmsError = N.PLC_RPowerOnData(ref powerOn); + cmsError = N.PLC_RActiveMessages(ref plcMsg); + + Console.WriteLine("ICON" + sw.ElapsedMilliseconds); sw.Stop(); if (!this.IsDisposed && this.InvokeRequired) { @@ -167,7 +170,7 @@ namespace CMS_CORE_Application TXTTime.Text = sw.ElapsedMilliseconds.ToString() + " mS"; TXTAlm.Text = string.Join(Environment.NewLine, procAlarms.Select(x => x.Message)); TXTAlmNc.Text = string.Join(Environment.NewLine, ncAlarms.Select(x => x.Message)); - TXTMsg.Text = string.Join(Environment.NewLine, Msg.Select(x => x.Id)); + TXTMsg.Text = string.Join(Environment.NewLine, plcMsg.Select(x => x.Id)); TXTPPName.Text = PPName; TXTNow.Text = NcTime.ToString(); @@ -190,7 +193,7 @@ namespace CMS_CORE_Application public void ChangeTool() { - if (NCType != "Fanuc") + // if (NCType != "Fanuc") return; Nc ncFanuc = SetNcByType(); @@ -334,7 +337,8 @@ namespace CMS_CORE_Application { TXTip.Enabled = true; TXTport.Enabled = true; - TXTip.Text = "192.168.139.1"; + // TXTip.Text = "192.168.139.1"; + TXTip.Text = "10.69.36.33"; TXTport.Text = "8193"; } else if (NcCombo.SelectedItem.ToString().Equals("Osai")) diff --git a/CMS_CORE_Library/Demo/Nc_Demo.cs b/CMS_CORE_Library/Demo/Nc_Demo.cs index bf5306f..c28b806 100644 --- a/CMS_CORE_Library/Demo/Nc_Demo.cs +++ b/CMS_CORE_Library/Demo/Nc_Demo.cs @@ -692,7 +692,7 @@ namespace CMS_CORE_Library.Demo List readInts = new List(); List readValues = new List(); // Find the size of a single head - int headsByte = (HEADS_DATA.Size / HEADS_NUMBER); + int headsByte = (HEADS_DATA.Size / MAX_HEADS_NUMBER); double headsInts = Math.Ceiling((double)(headsByte / 4) + 1); // Read data for N heads @@ -726,7 +726,7 @@ namespace CMS_CORE_Library.Demo public override CmsError PLC_WHeadOverride(uint id, HEAD_OVERRIDE_SIGN sign) { - if (id > HEADS_NUMBER) + if (id > MAX_HEADS_NUMBER) return INCORRECT_PARAMETERS_ERROR; CmsError cmsError; diff --git a/CMS_CORE_Library/Fanuc/Nc_Fanuc.cs b/CMS_CORE_Library/Fanuc/Nc_Fanuc.cs index 518f779..bf65190 100644 --- a/CMS_CORE_Library/Fanuc/Nc_Fanuc.cs +++ b/CMS_CORE_Library/Fanuc/Nc_Fanuc.cs @@ -8,8 +8,10 @@ using System.Linq; using System.Threading; using System.Windows.Forms; using static CMS_CORE_Library.Models.DataStructures; -using static CMS_CORE_Library.Siemens.MEMORY_ADDRESS; +using static CMS_CORE_Library.Fanuc.MEMORY_ADDRESS; using static CMS_CORE_Library.Utils.Nc_Utils; +using static CMS_CORE_Library.Nc; +using static Focas1; #pragma warning disable 1591 @@ -382,50 +384,102 @@ namespace CMS_CORE_Library.Fanuc //Get the PMC Messages public override CmsError PLC_RActiveMessages(ref List alarms) { - //Check if the NC is Connected - CmsError cmsError = CheckConnection(); + ////Check if the NC is Connected + //CmsError cmsError = CheckConnection(); + //if (cmsError.IsError()) + // return cmsError; + + //Focas1.OPMSG3 Messg = new Focas1.OPMSG3(); + //short nReturn = 0; + //short count = FANUC_MAXMSGPMC; + + ////Execute the method + //nReturn = Focas1.cnc_rdopmsg3(nLibHandle[0], -1, ref count, Messg); + + ////Throw Exception if there's an error + //if (nReturn != 0) + // return GetNcError(nReturn); + + //// Add Alarm in List + //alarms.Clear(); + + //if (count >= 1 && Messg.msg1.datano >= 0) + // AddPlcAlarmsToList((ushort)Messg.msg1.datano, false, false, new List() { 1 }, alarms); + + //if (count >= 2 && Messg.msg2.datano >= 0) + // AddPlcAlarmsToList((ushort)Messg.msg2.datano, false, false, new List() { 1 }, alarms); + + //if (count >= 3 && Messg.msg3.datano >= 0) + // AddPlcAlarmsToList((ushort)Messg.msg3.datano, false, false, new List() { 1 }, alarms); + + //if (count >= 4 && Messg.msg4.datano >= 0) + // AddPlcAlarmsToList((ushort)Messg.msg4.datano, false, false, new List() { 1 }, alarms); + + //if (count >= 5 && Messg.msg5.datano >= 0) + // AddPlcAlarmsToList((ushort)Messg.msg5.datano, false, false, new List() { 1 }, alarms); + + alarms.Clear(); + List readValues = new List(); + + // Read on data from memory + CmsError cmsError = MEM_RWIntegerList(R, 0, + ALARMS_STATUS.MemType, + ALARMS_STATUS.Address, + (ALARMS_STATUS.Size + ALARMS_DATA.Size) / 4, // byte / 4 + ref readValues); + if (cmsError.IsError()) return cmsError; + // Convert integer array into bit array + bool[] statusBits = IntToBool(readValues.ToArray()); - Focas1.OPMSG3 Messg = new Focas1.OPMSG3(); - short nReturn = 0; - short count = FANUC_MAXMSGPMC; + for (int i = 0; i < ALARMS_STATUS.Size * 8; i++) + { + // If alarm is active + if (statusBits[i]) + { + // Calculate matching alarm byte info address + int dataByteAddress = i * 8 + ALARMS_NUMBER; - //Execute the method - nReturn = Focas1.cnc_rdopmsg3(nLibHandle[0], -1, ref count, Messg); + var processList = new List(); - //Throw Exception if there's an error - if (nReturn != 0) - return GetNcError(nReturn); - - // Add Alarm in List - alarms.Clear(); - - if (count >= 1 && Messg.msg1.datano >= 0) - AddPlcAlarmsToList((ushort)Messg.msg1.datano, false, false, new List() { 1 }, alarms); - - if (count >= 2 && Messg.msg2.datano >= 0) - AddPlcAlarmsToList((ushort)Messg.msg2.datano, false, false, new List() { 1 }, alarms); - - if (count >= 3 && Messg.msg3.datano >= 0) - AddPlcAlarmsToList((ushort)Messg.msg3.datano, false, false, new List() { 1 }, alarms); - - if (count >= 4 && Messg.msg4.datano >= 0) - AddPlcAlarmsToList((ushort)Messg.msg4.datano, false, false, new List() { 1 }, alarms); - - if (count >= 5 && Messg.msg5.datano >= 0) - AddPlcAlarmsToList((ushort)Messg.msg5.datano, false, false, new List() { 1 }, alarms); + // Get processes on which alarm is active + for (int j = dataByteAddress; j < dataByteAddress + 6; j++) + { + if (statusBits[j]) + processList.Add(j + 1 - dataByteAddress); + } + // Add alarm info into active alarms list + alarms.Add(new PlcAlarmModel() + { + Id = (uint)i + 1, + IsWarning = statusBits[dataByteAddress + 7], + RestorationIsActive = statusBits[dataByteAddress + 6], + Process = processList + }); + } + } return NO_ERROR; } public override CmsError PLC_WRefreshMessage(uint id) - { + { + // Set to 1 refresh strobe + CmsError cmsError = PLC_WStrobe(ALARM_ACK, ALARM_RESTORATION_STROBE, id); + if (cmsError.IsError()) + return cmsError; + return NO_ERROR; } public override CmsError PLC_WRestoreMessage(uint id) { + // Set to 1 restore strobe + CmsError cmsError = PLC_WStrobe(ALARM_ACK, ALARM_REFRESH_STROBE, id); + if (cmsError.IsError()) + return cmsError; + return NO_ERROR; } @@ -477,19 +531,68 @@ namespace CMS_CORE_Library.Fanuc // Write power on data public override CmsError PLC_WPowerOnData(uint id, bool value) { + // Check bit range + if (id > 16) + return INCORRECT_PARAMETERS_ERROR; + + // Call restore message + CmsError cmsError = PLC_WStrobe(PRE_POST_POWER_ON_ACK, PRE_POST_POWER_ON_CLICKED, id); + if (cmsError.IsError()) + return cmsError; + return NO_ERROR; } // Get functionality data public override CmsError PLC_RFunctionAccess(ref List functions) { + List readValues = new List(); + int numberOfIntegers = FUNCTION_ACCESS.Size / 4; + // Read functions access data from memory + CmsError cmsError = MEM_RWIntegerList(R, 0, FUNCTION_ACCESS.MemType, FUNCTION_ACCESS.Address, numberOfIntegers, ref readValues); + if (cmsError.IsError()) + return cmsError; + functions = new List(); + // Convert int into to true/false array + bool[] bits = IntToBool(readValues.ToArray()); + + // Convert array into structured data + for (int i = 0; i < bits.Count(); i++) + { + functions.Add(new FunctionalityModel() + { + Id = (uint)i + 1, + IsActive = bits[i] + }); + } + return NO_ERROR; } // Get axis reset procedure data public override CmsError PLC_RAxesResetData(ref AxisResetDataModel axisResetData) { + byte value = 0; + // Read byte from memory + CmsError cmsError = MEM_RWByte(R, 0, AXIS_RESET_PROCEDURE.MemType, AXIS_RESET_PROCEDURE.Address, 0, ref value); + if (cmsError.IsError()) + return cmsError; + + // Check last bit if is active + if ((value & 128) == 128) + { + // Set to 0 last bit( isActive bit x - 128 ) + // From 0 to 6 bits represent percentage + // If higher than 100 then value = 100 + byte percentage = value - 128 > 100 ? (byte)100 : (byte)(value - 128); + axisResetData = new AxisResetDataModel() + { + IsActive = true, + Percentage = percentage + }; + } + return NO_ERROR; } @@ -501,31 +604,103 @@ namespace CMS_CORE_Library.Fanuc public override CmsError PLC_RNcSoftKeys(ref List ncSoftKeys) { + CmsError cmsError = PLC_RSoftKeys(NC_SOFTKEYS_VALUE, NC_SOFTKEYS_CLICKABLE, ref ncSoftKeys); + if (cmsError.IsError()) + return cmsError; + return NO_ERROR; } public override CmsError PLC_RUserSoftKeys(ref List softKeys) { + CmsError cmsError = PLC_RSoftKeys(USER_SOFTKEYS_VALUE, USER_SOFTKEYS_CLICKABLE, ref softKeys); + if (cmsError.IsError()) + return cmsError; + return NO_ERROR; } public override CmsError PLC_WNcSoftKey(uint id) { + // Check id range + if (id > NC_SOFTKEYS_NUMBER) + return INCORRECT_PARAMETERS_ERROR; + + // Write strobe into memory + CmsError cmsError = PLC_WStrobe(NC_SOFT_KEYS_ACK, NC_SOFT_KEYS_CLICKED, id); + if (cmsError.IsError()) + return cmsError; + return NO_ERROR; } public override CmsError PLC_WUserSoftKey(uint id) { + // Check id range + if (id > USER_SOFTKEYS_NUMBER) + return INCORRECT_PARAMETERS_ERROR; + + // Write strobe into memory + CmsError cmsError = PLC_WStrobe(USER_SOFT_KEYS_ACK, USER_SOFT_KEYS_CLICKED, id); + if (cmsError.IsError()) + return cmsError; + return NO_ERROR; } public override CmsError PLC_RHeadsData(List heads, int number) { + // Check parameters + if (number > MAX_HEADS_NUMBER) + return INCORRECT_PARAMETERS_ERROR; + heads.Clear(); + + List readInts = new List(); + List readValues = new List(); + // Find the size of a single head + int headsByte = (HEADS_DATA.Size / MAX_HEADS_NUMBER); + double headsInts = Math.Ceiling((double)(headsByte / 4) + 1); + + // Read data for N heads + CmsError cmsError = MEM_RWIntegerList(R, 0, HEADS_DATA.MemType, 0, HEADS_DATA.Address, (int)headsInts * number, ref readInts); + if (cmsError.IsError()) + return cmsError; + readValues = readInts.SelectMany(BitConverter.GetBytes).ToList(); + + // Parse and format read data + for (int i = 0; i < number; i++) + { + // Head address = posizion * size of single head in memory + var headOffset = i * headsByte; + heads.Add(new HeadDataModel() + { + Id = (uint)i + 1, + Process = readValues[headOffset], + Override = readValues[headOffset + 1], + Load_Abrasive = BitConverter.ToUInt16(readValues.ToArray(), headOffset + 2), // Uint 16 = 2byte + MountedTool_Vacum = BitConverter.ToInt16(readValues.ToArray(), headOffset + 4), // Uint 16 = 2byte + ActualSpeed_Pressure = BitConverter.ToInt32(readValues.ToArray(), headOffset + 6), // Int32 = 4byte + IsActive = (readValues[headOffset + 10] & 1) != 0, // bit 0 + IsSelected = (readValues[headOffset + 10] & 2) != 0, // bit 1 + OverrideEditable = (readValues[headOffset + 10] & 4) != 0 // bit 2 + }); + } + return NO_ERROR; } public override CmsError PLC_WHeadOverride(uint id, HEAD_OVERRIDE_SIGN sign) { + if (id > MAX_HEADS_NUMBER) + return INCORRECT_PARAMETERS_ERROR; + + MEMORY_CELL currentStrobeCell = sign == HEAD_OVERRIDE_SIGN.PLUS ? HEADS_STROBE_INCREMENT : HEADS_STROBE_DECREMENT; + + // Write strobe into memory + CmsError cmsError = PLC_WStrobe(HEADS_ACK, currentStrobeCell, id); + if (cmsError.IsError()) + return cmsError; + return NO_ERROR; } @@ -578,7 +753,7 @@ namespace CMS_CORE_Library.Fanuc } //Get the process Alarms - public override CmsError PROC_RActiveAlarms(ushort ProcNumber, ref List Alarms) + public override CmsError PROC_RActiveAlarms(ushort procNumber, ref List Alarms) { Alarms.Clear(); @@ -586,7 +761,7 @@ namespace CMS_CORE_Library.Fanuc } //Get PP Lines - public override CmsError PROC_RPPLines(ushort ProcNumber, ref List Lines) + public override CmsError PROC_RPPLines(ushort procNumber, ref List lines) { //Check if the NC is Connected CmsError cmsError = CheckConnection(); @@ -600,7 +775,7 @@ namespace CMS_CORE_Library.Fanuc char[] Chars = new char[255]; string[] newLines; - short path = GetHandleIndexFromPath(ProcNumber); + short path = GetHandleIndexFromPath(procNumber); if (path < 0) return PROC_NOT_FOUND_ERROR; @@ -612,7 +787,7 @@ namespace CMS_CORE_Library.Fanuc if (nReturn != 0) return GetNcError(nReturn); - path = GetHandleIndexFromPath(ProcNumber); + path = GetHandleIndexFromPath(procNumber); if (path < 0) return PROC_NOT_FOUND_ERROR; @@ -625,15 +800,15 @@ namespace CMS_CORE_Library.Fanuc return GetNcError(nReturn); //Setup the return values - Lines.Clear(); + lines.Clear(); foreach (string Line in newLines) - Lines.Add(Line); + lines.Add(Line); return NO_ERROR; } //Get Active PP Name - public override CmsError PROC_RSelectedPPName(ushort ProcNumber, ref string Name) + public override CmsError PROC_RSelectedPPName(ushort procNumber, ref string name) { //Check if the NC is Connected CmsError cmsError = CheckConnection(); @@ -641,29 +816,29 @@ namespace CMS_CORE_Library.Fanuc return cmsError; short nReturn = 0; - Focas1.ODBEXEPRG Prg = new Focas1.ODBEXEPRG(); ; + Focas1.ODBEXEPRG partPrg = new Focas1.ODBEXEPRG(); // Get path index - short path = GetHandleIndexFromPath(ProcNumber); + short path = GetHandleIndexFromPath(procNumber); if (path < 0) return PROC_NOT_FOUND_ERROR; //Execute the method - nReturn = Focas1.cnc_exeprgname(nLibHandle[path], Prg); + nReturn = Focas1.cnc_exeprgname(nLibHandle[path], partPrg); //Throw Exception if there's an error if (nReturn != 0) return GetNcError(nReturn); - Name = new string(Prg.name).Replace("\0", string.Empty); + name = new string(partPrg.name).Replace("\0", string.Empty); return NO_ERROR; } //Get the process status - public override CmsError PROC_RStatus(ushort Number, ref PROC_STATUS Status) + public override CmsError PROC_RStatus(ushort procNumber, ref PROC_STATUS Status) { - Focas1.ODBST StatInfo = new Focas1.ODBST(); + Focas1.ODBST statusInfo = new Focas1.ODBST(); short nReturn; //Check if the NC is Connected @@ -672,26 +847,26 @@ namespace CMS_CORE_Library.Fanuc return cmsError; // Get path index - short path = GetHandleIndexFromPath(Number); + short path = GetHandleIndexFromPath(procNumber); if (path < 0) return PROC_NOT_FOUND_ERROR; //Execute the method - nReturn = Focas1.cnc_statinfo(nLibHandle[path], StatInfo); + nReturn = Focas1.cnc_statinfo(nLibHandle[path], statusInfo); //Throw Exception if there's an error if (nReturn != 0) return GetNcError(nReturn); - Status = ConverToSTEPStatus(StatInfo); + Status = ConverToSTEPStatus(statusInfo); return NO_ERROR; } //Get the process Mode - public override CmsError PROC_RMode(ushort Number, ref PROC_MODE Mode) + public override CmsError PROC_RMode(ushort procNumber, ref PROC_MODE Mode) { - Focas1.ODBST StatInfo = new Focas1.ODBST(); + Focas1.ODBST statusInfo = new Focas1.ODBST(); short nReturn = 0; //Check if the NC is Connected @@ -700,30 +875,56 @@ namespace CMS_CORE_Library.Fanuc return cmsError; // Get path index - short path = GetHandleIndexFromPath(Number); + short path = GetHandleIndexFromPath(procNumber); if (path < 0) return PROC_NOT_FOUND_ERROR; //Execute the method - nReturn = Focas1.cnc_statinfo(nLibHandle[path], StatInfo); + nReturn = Focas1.cnc_statinfo(nLibHandle[path], statusInfo); //Throw Exception if there's an error if (nReturn != 0) return GetNcError(nReturn); - Mode = ConverToSTEPMode(StatInfo); + Mode = ConverToSTEPMode(statusInfo); return NO_ERROR; } public override CmsError PROC_RSelectedProcess(ref ushort procNumber) { - procNumber = 1; + CmsError cmsError; + bool readValue = false; + + for (int i = 0; i < PROCESS_NUMBER; i++) + { + int memoryAddress = SELECTED_PROCESS.Address + i * (2); + // Read memory from plc + cmsError = MEM_RWBoolean(R, 0, SELECTED_PROCESS.MemType, memoryAddress, SELECTED_PROCESS.SubAddress, ref readValue); + if (cmsError.IsError()) + return cmsError; + + if (readValue) + procNumber = (ushort)(i + 1); + } + return NO_ERROR; } public override CmsError PROC_WSelectProcess(ushort procNumber) { + CmsError cmsError; + byte processNum = (byte)procNumber; + + // Check parameter + if (processNum > PROCESS_NUMBER) + return INCORRECT_PARAMETERS_ERROR; + + // Write process number + cmsError = MEM_RWByte(W, 0, SELECT_PROCESS.MemType, SELECT_PROCESS.Address, SELECT_PROCESS.SubAddress, ref processNum); + if (cmsError.IsError()) + return cmsError; + return NO_ERROR; } @@ -760,9 +961,7 @@ namespace CMS_CORE_Library.Fanuc //If an axis goes out from Process Clear the List if (Axes.Count > NumAxes) - { Axes.Clear(); - } //Fill all the List for (i = 1; i <= NumAxes; i++) @@ -1002,16 +1201,99 @@ namespace CMS_CORE_Library.Fanuc public override CmsError AXES_RAxesNames(ushort process, ref List axesData) { + short numAxesRead = MAX_AXIS; + + ODBEXAXISNAME sOdbExAxisName = new ODBEXAXISNAME(); + // Read from NC + short nReturn = Focas1.cnc_exaxisname(nLibHandle[process], 0, ref numAxesRead, sOdbExAxisName); + if (nReturn != 0) + return GetNcError(nReturn); + // Parse data + if (numAxesRead >= 1) + axesData.Add(new AxisModel() { Id = 1, Name = sOdbExAxisName.axname1 }); + if (numAxesRead >= 2) + axesData.Add(new AxisModel() { Id = 2, Name = sOdbExAxisName.axname2 }); + if (numAxesRead >= 3) + axesData.Add(new AxisModel() { Id = 3, Name = sOdbExAxisName.axname3 }); + if (numAxesRead >= 4) + axesData.Add(new AxisModel() { Id = 4, Name = sOdbExAxisName.axname4 }); + if (numAxesRead >= 5) + axesData.Add(new AxisModel() { Id = 5, Name = sOdbExAxisName.axname5 }); + if (numAxesRead >= 6) + axesData.Add(new AxisModel() { Id = 6, Name = sOdbExAxisName.axname6 }); + if (numAxesRead >= 7) + axesData.Add(new AxisModel() { Id = 7, Name = sOdbExAxisName.axname7 }); + if (numAxesRead >= 8) + axesData.Add(new AxisModel() { Id = 8, Name = sOdbExAxisName.axname8 }); + if (numAxesRead >= 9) + axesData.Add(new AxisModel() { Id = 9, Name = sOdbExAxisName.axname9 }); + if (numAxesRead >= 10) + axesData.Add(new AxisModel() { Id = 10, Name = sOdbExAxisName.axname10 }); + if (numAxesRead >= 11) + axesData.Add(new AxisModel() { Id = 11, Name = sOdbExAxisName.axname11 }); + if (numAxesRead >= 12) + axesData.Add(new AxisModel() { Id = 12, Name = sOdbExAxisName.axname12 }); + if (numAxesRead >= 13) + axesData.Add(new AxisModel() { Id = 13, Name = sOdbExAxisName.axname13 }); + if (numAxesRead >= 14) + axesData.Add(new AxisModel() { Id = 14, Name = sOdbExAxisName.axname14 }); + if (numAxesRead >= 15) + axesData.Add(new AxisModel() { Id = 15, Name = sOdbExAxisName.axname15 }); + if (numAxesRead >= 16) + axesData.Add(new AxisModel() { Id = 16, Name = sOdbExAxisName.axname16 }); + if (numAxesRead >= 17) + axesData.Add(new AxisModel() { Id = 17, Name = sOdbExAxisName.axname17 }); + if (numAxesRead >= 18) + axesData.Add(new AxisModel() { Id = 18, Name = sOdbExAxisName.axname18 }); + if (numAxesRead >= 19) + axesData.Add(new AxisModel() { Id = 19, Name = sOdbExAxisName.axname19 }); + if (numAxesRead >= 20) + axesData.Add(new AxisModel() { Id = 20, Name = sOdbExAxisName.axname20 }); + if (numAxesRead >= 21) + axesData.Add(new AxisModel() { Id = 21, Name = sOdbExAxisName.axname21 }); + if (numAxesRead >= 22) + axesData.Add(new AxisModel() { Id = 22, Name = sOdbExAxisName.axname22 }); + if (numAxesRead >= 23) + axesData.Add(new AxisModel() { Id = 23, Name = sOdbExAxisName.axname23 }); + if (numAxesRead >= 24) + axesData.Add(new AxisModel() { Id = 24, Name = sOdbExAxisName.axname24 }); + if (numAxesRead >= 25) + axesData.Add(new AxisModel() { Id = 25, Name = sOdbExAxisName.axname25 }); + if (numAxesRead >= 26) + axesData.Add(new AxisModel() { Id = 26, Name = sOdbExAxisName.axname26 }); + if (numAxesRead >= 27) + axesData.Add(new AxisModel() { Id = 27, Name = sOdbExAxisName.axname27 }); + if (numAxesRead >= 28) + axesData.Add(new AxisModel() { Id = 28, Name = sOdbExAxisName.axname28 }); + if (numAxesRead >= 29) + axesData.Add(new AxisModel() { Id = 29, Name = sOdbExAxisName.axname29 }); + if (numAxesRead >= 30) + axesData.Add(new AxisModel() { Id = 30, Name = sOdbExAxisName.axname30 }); + if (numAxesRead >= 31) + axesData.Add(new AxisModel() { Id = 31, Name = sOdbExAxisName.axname31 }); + if (numAxesRead >= 32) + axesData.Add(new AxisModel() { Id = 32, Name = sOdbExAxisName.axname31 }); + return NO_ERROR; } public override CmsError AXES_RSelectedAxis(ref byte axisId) { + // Read byte from memory + CmsError cmsError = MEM_RWByte(R, 0, SELECTED_AXIS.MemType, SELECTED_AXIS.Address, SELECTED_AXIS.SubAddress, ref axisId); + if (cmsError.IsError()) + return cmsError; + return NO_ERROR; } public override CmsError AXES_WSelectAxis(byte axisId) { + // Write new axis id to memory + CmsError cmsError = MEM_RWByte(W, 0, SELECT_AXIS.MemType, SELECT_AXIS.Address, SELECT_AXIS.SubAddress, ref axisId); + if (cmsError.IsError()) + return cmsError; + return NO_ERROR; } @@ -2033,6 +2315,137 @@ namespace CMS_CORE_Library.Fanuc #region Subordinate Private Functions + #region Memory private Functions + + private CmsError PLC_WStrobe(MEMORY_CELL ackCell, MEMORY_CELL strobeCell, uint id) + { + CmsError cmsError; + bool readValue = false; + bool writeValue = true; + + SetupAckStrobeAddresses(ackCell.Address, strobeCell.Address, id, out int ackWord, out int strobeWord, out int bitIndex); + + // Check Strobe + cmsError = MEM_RWBoolean(R, 0, strobeCell.MemType, strobeWord, bitIndex, ref readValue); + if (cmsError.IsError()) + return cmsError; + + // If strobe == 1 return + if (readValue) + return NO_ERROR; + + // Check ACK + cmsError = MEM_RWBoolean(R, 0, ackCell.MemType, ackWord, bitIndex, ref readValue); + if (cmsError.IsError()) + return cmsError; + + // If PLC it's performing another request then return + if (readValue) + return NO_ERROR; + + // Write strobe into memory + cmsError = MEM_RWBoolean(W, 0, strobeCell.MemType, strobeWord, bitIndex, ref writeValue); + if (cmsError.IsError()) + return cmsError; + + // Reset wait ack = 1 and reset the strobe + cmsError = ResetStrobe(bitIndex, strobeWord, ackWord, ackCell.MemType); + if (cmsError.IsError()) + return cmsError; + + return NO_ERROR; + } + + private void SetupAckStrobeAddresses(int ackAddress, int strobeAddress, uint id, out int ackWord, out int strobeWord, out int bit) + { + ackWord = ackAddress + (((int)id - 1) / 8); + strobeWord = strobeAddress + (((int)id - 1) / 8); + bit = (((int)id - 1) % 8); + } + + private CmsError ResetStrobe(int bit, int strobeByte, int ackByte, MEMORY_TYPE memType) + { + int n = 1200; // 30 seconds + bool readValue = false; + bool writeValue = false; + bool ok = false; + + CmsError cmsError; + do + { + // Check ACK + cmsError = MEM_RWBoolean(R, 0, memType, ackByte, bit, ref readValue); + if (cmsError.IsError()) + return cmsError; + + // If true reset strobe + if (readValue) + { + // Reset strobe + cmsError = MEM_RWBoolean(W, 0, memType, strobeByte, bit, ref writeValue); + if (cmsError.IsError()) + return cmsError; + // Exit from cycle + n = 0; + ok = true; + } + else + { + // Decrement + n--; + // Wait befor next cycle + Thread.Sleep(25); + } + } while (n > 0); + + // If loop timeout goes in timeout + if (!ok) + { + // Reset strobe + cmsError = MEM_RWBoolean(W, 0, memType, strobeByte, bit, ref writeValue); + if (cmsError.IsError()) + return cmsError; + } + + return cmsError; + } + + private CmsError PLC_RSoftKeys(MEMORY_CELL softKeyStatusMemory, MEMORY_CELL softKeysClickableMemory, ref List softKeys) + { + softKeys = new List(); + List readValue = new List(); + + int memorySizeToRead = (softKeyStatusMemory.Size + softKeysClickableMemory.Size); + // Offset between status and clickable data + int offset = softKeyStatusMemory.Size * 8; + + // Read on data from memory + CmsError cmsError = MEM_RWIntegerList(R, 0, + softKeyStatusMemory.MemType, + softKeyStatusMemory.Address, + memorySizeToRead / 4, + ref readValue); + + if (cmsError.IsError()) + return cmsError; + + bool[] bits = IntToBool(readValue.ToArray()); + + // Convert array into structured data + for (ushort i = 0; i < bits.Count() / 2; i++) + { + softKeys.Add(new SoftKeysModel() + { + Id = (uint)i + 1, + Value = bits[i], + Active = bits[i + offset] + }); + } + + return NO_ERROR; + } + #endregion + private Focas1.page_code ConvertStepToFanucScreen(SCREEN_PAGE page) { switch (page) @@ -2473,71 +2886,137 @@ namespace CMS_CORE_Library.Fanuc #endregion Subordinate Private Functions /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + //internal static class MEMORY_ADDRESS + //{ + // internal const int STARTING_ADDRESS = 50000; + // internal static MEMORY_CELL FUNCTION_ACCESS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 50005, 8); - internal static class MEMORY_ADDRESS - { - internal const int STARTING_ADDRESS = 50000; - internal static MEMORY_CELL FUNCTION_ACCESS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 50005, 8); + // internal static MEMORY_CELL PRE_POST_POWER_ON = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52573, 2); + // internal static MEMORY_CELL PRE_POST_POWER_ON_CLICKABLE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52575, 2); + // internal static MEMORY_CELL PRE_POST_POWER_ON_ACK = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52577, 2); + // internal static MEMORY_CELL PRE_POST_POWER_ON_CLICKED = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52579, 2); - internal static MEMORY_CELL PRE_POST_POWER_ON = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52573, 2); - internal static MEMORY_CELL PRE_POST_POWER_ON_CLICKABLE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52575, 2); - internal static MEMORY_CELL PRE_POST_POWER_ON_ACK = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52577, 2); - internal static MEMORY_CELL PRE_POST_POWER_ON_CLICKED = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52579, 2); + // internal static MEMORY_CELL AXIS_RESET_PROCEDURE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52607, 7, 1); - internal static MEMORY_CELL AXIS_RESET_PROCEDURE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52607, 7, 1); + // internal static MEMORY_CELL PROCESS_STATUS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52581, 0, 24); + // internal static MEMORY_CELL SELECTED_PROCESS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52581, 2, 24); + // internal static MEMORY_CELL SELECT_PROCESS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52605, 1); - internal static MEMORY_CELL PROCESS_STATUS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52581, 0, 24); - internal static MEMORY_CELL SELECTED_PROCESS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52581, 2, 24); - internal static MEMORY_CELL SELECT_PROCESS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52605, 1); + // internal static MEMORY_CELL COUNTERS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 43, 0, 40); - internal static MEMORY_CELL COUNTERS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 43, 0, 40); + // internal static MEMORY_CELL SELECTED_AXIS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52624, 0, 1); + // internal static MEMORY_CELL SELECT_AXIS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52625, 1, 1); - internal static MEMORY_CELL SELECTED_AXIS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52624, 0, 1); - internal static MEMORY_CELL SELECT_AXIS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52625, 1, 1); + // internal static MEMORY_CELL NC_SOFTKEYS_VALUE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52608, 0, 4); + // internal static MEMORY_CELL NC_SOFTKEYS_CLICKABLE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52612, 0, 4); + // internal static MEMORY_CELL NC_SOFT_KEYS_ACK = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52616, 4); + // internal static MEMORY_CELL NC_SOFT_KEYS_CLICKED = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52620, 4); - internal static MEMORY_CELL NC_SOFTKEYS_VALUE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52608, 0, 4); - internal static MEMORY_CELL NC_SOFTKEYS_CLICKABLE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52612, 0, 4); - internal static MEMORY_CELL NC_SOFT_KEYS_ACK = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52616, 4); - internal static MEMORY_CELL NC_SOFT_KEYS_CLICKED = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52620, 4); + // internal static MEMORY_CELL USER_SOFTKEYS_VALUE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52626, 0, 16); + // internal static MEMORY_CELL USER_SOFTKEYS_CLICKABLE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52642, 0, 16); + // internal static MEMORY_CELL USER_SOFT_KEYS_ACK = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52658, 16); + // internal static MEMORY_CELL USER_SOFT_KEYS_CLICKED = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52674, 16); - internal static MEMORY_CELL USER_SOFTKEYS_VALUE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52626, 0, 16); - internal static MEMORY_CELL USER_SOFTKEYS_CLICKABLE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52642, 0, 16); - internal static MEMORY_CELL USER_SOFT_KEYS_ACK = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52658, 16); - internal static MEMORY_CELL USER_SOFT_KEYS_CLICKED = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52674, 16); + // internal static MEMORY_CELL ALARMS_STATUS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 50013, 128); + // internal static MEMORY_CELL ALARMS_DATA = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 50141, 1024); - internal static MEMORY_CELL ALARMS_STATUS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 50013, 128); - internal static MEMORY_CELL ALARMS_DATA = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 50141, 1024); + // internal static MEMORY_CELL ALARM_ACK = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52189, 128); + // internal static MEMORY_CELL ALARM_RESTORATION_STROBE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52445, 128); + // internal static MEMORY_CELL ALARM_REFRESH_STROBE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52445, 128); - internal static MEMORY_CELL ALARM_ACK = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52189, 128); - internal static MEMORY_CELL ALARM_RESTORATION_STROBE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52445, 128); - internal static MEMORY_CELL ALARM_REFRESH_STROBE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52445, 128); + // internal static MEMORY_CELL HEADS_DATA = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52690, 240); - internal static MEMORY_CELL HEADS_DATA = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52690, 240); + // internal static MEMORY_CELL HEADS_ACK = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52921, 4); + // internal static MEMORY_CELL HEADS_STROBE_INCREMENT = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52924, 4); + // internal static MEMORY_CELL HEADS_STROBE_DECREMENT = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52927, 4); - internal static MEMORY_CELL HEADS_ACK = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52921, 4); - internal static MEMORY_CELL HEADS_STROBE_INCREMENT = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52924, 4); - internal static MEMORY_CELL HEADS_STROBE_DECREMENT = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52927, 4); + // // Tool manager areas + // internal static MEMORY_CELL TOOL_MANAGER_COMMAND = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 13000, 2); - // Tool manager areas - internal static MEMORY_CELL TOOL_MANAGER_COMMAND = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 13000, 2); + // internal static MEMORY_CELL TOOL_MANAGER_STATUS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 13001, 2); - internal static MEMORY_CELL TOOL_MANAGER_STATUS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 13001, 2); + // internal static MEMORY_CELL TOOL_MANAGER_OPTIONS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 13002, 2); - internal static MEMORY_CELL TOOL_MANAGER_OPTIONS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 13002, 2); + // internal static MEMORY_CELL MAGAZINE_TYPES = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 13062, 4); + // internal static MEMORY_CELL MAGAZINE_POSITIONS_NUMBER = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 13072, 4); - internal static MEMORY_CELL MAGAZINE_TYPES = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 13062, 4); - internal static MEMORY_CELL MAGAZINE_POSITIONS_NUMBER = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 13072, 4); + // internal static MEMORY_CELL MAGAZINES_ENABLED_CMD = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 13082, 2); + // internal static MEMORY_CELL MAGAZINES_TOOLING_CMD = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 13084, 2); - internal static MEMORY_CELL MAGAZINES_ENABLED_CMD = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 13082, 2); - internal static MEMORY_CELL MAGAZINES_TOOLING_CMD = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 13084, 2); + // internal static MEMORY_CELL TOOL_STATUS_UPDATED_CMD = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 13003, 2); + // internal static MEMORY_CELL TOOL_LIFE_UPDATED_CMD = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 13005, 2); + // internal static MEMORY_CELL TOOL_STATUS_UPDATED_ACK = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 13007, 2); + // internal static MEMORY_CELL TOOL_LIFE_UPDATED_ACK = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 13009, 2); - internal static MEMORY_CELL TOOL_STATUS_UPDATED_CMD = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 13003, 2); - internal static MEMORY_CELL TOOL_LIFE_UPDATED_CMD = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 13005, 2); - internal static MEMORY_CELL TOOL_STATUS_UPDATED_ACK = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 13007, 2); - internal static MEMORY_CELL TOOL_LIFE_UPDATED_ACK = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 13009, 2); - - internal static MEMORY_CELL TOOL_STATUS_UPDATED_DATA = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 13011, 10); - internal static MEMORY_CELL TOOL_LIFE_UPDATED_DATA = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 13022, 40); - } + // internal static MEMORY_CELL TOOL_STATUS_UPDATED_DATA = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 13011, 10); + // internal static MEMORY_CELL TOOL_LIFE_UPDATED_DATA = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 13022, 40); + //} } + internal static class MEMORY_ADDRESS + { + internal const int STARTING_ADDRESS = 50000; + internal static MEMORY_CELL FUNCTION_ACCESS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 50005, 8); + + internal static MEMORY_CELL PRE_POST_POWER_ON = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 1000, 2); + internal static MEMORY_CELL PRE_POST_POWER_ON_CLICKABLE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 1002, 2); + internal static MEMORY_CELL PRE_POST_POWER_ON_ACK = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 1004, 2); + internal static MEMORY_CELL PRE_POST_POWER_ON_CLICKED = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 1006, 2); + + internal static MEMORY_CELL AXIS_RESET_PROCEDURE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52607, 7, 1); + + internal static MEMORY_CELL PROCESS_STATUS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52581, 0, 24); + internal static MEMORY_CELL SELECTED_PROCESS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52581, 2, 24); + internal static MEMORY_CELL SELECT_PROCESS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52605, 1); + + internal static MEMORY_CELL COUNTERS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 43, 0, 40); + + internal static MEMORY_CELL SELECTED_AXIS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52624, 0, 1); + internal static MEMORY_CELL SELECT_AXIS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52625, 1, 1); + + internal static MEMORY_CELL NC_SOFTKEYS_VALUE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52608, 0, 4); + internal static MEMORY_CELL NC_SOFTKEYS_CLICKABLE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52612, 0, 4); + internal static MEMORY_CELL NC_SOFT_KEYS_ACK = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52616, 4); + internal static MEMORY_CELL NC_SOFT_KEYS_CLICKED = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52620, 4); + + internal static MEMORY_CELL USER_SOFTKEYS_VALUE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52626, 0, 16); + internal static MEMORY_CELL USER_SOFTKEYS_CLICKABLE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52642, 0, 16); + internal static MEMORY_CELL USER_SOFT_KEYS_ACK = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52658, 16); + internal static MEMORY_CELL USER_SOFT_KEYS_CLICKED = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52674, 16); + + internal static MEMORY_CELL ALARMS_STATUS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 1000, 128); + internal static MEMORY_CELL ALARMS_DATA = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 1128, 1024); + + internal static MEMORY_CELL ALARM_ACK = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 2152, 128); + internal static MEMORY_CELL ALARM_RESTORATION_STROBE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 2280, 128); + internal static MEMORY_CELL ALARM_REFRESH_STROBE = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 2408, 128); + + internal static MEMORY_CELL HEADS_DATA = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52690, 240); + + internal static MEMORY_CELL HEADS_ACK = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52921, 4); + internal static MEMORY_CELL HEADS_STROBE_INCREMENT = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52924, 4); + internal static MEMORY_CELL HEADS_STROBE_DECREMENT = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 52927, 4); + + // Tool manager areas + internal static MEMORY_CELL TOOL_MANAGER_COMMAND = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 13000, 2); + + internal static MEMORY_CELL TOOL_MANAGER_STATUS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 13001, 2); + + internal static MEMORY_CELL TOOL_MANAGER_OPTIONS = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 13002, 2); + + internal static MEMORY_CELL MAGAZINE_TYPES = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 13062, 4); + internal static MEMORY_CELL MAGAZINE_POSITIONS_NUMBER = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 13072, 4); + + internal static MEMORY_CELL MAGAZINES_ENABLED_CMD = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 13082, 2); + internal static MEMORY_CELL MAGAZINES_TOOLING_CMD = new MEMORY_CELL(MEMORY_TYPE.Fanuc_R, 13084, 2); + + internal static MEMORY_CELL TOOL_STATUS_UPDATED_CMD = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 13003, 2); + internal static MEMORY_CELL TOOL_LIFE_UPDATED_CMD = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 13005, 2); + internal static MEMORY_CELL TOOL_STATUS_UPDATED_ACK = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 13007, 2); + internal static MEMORY_CELL TOOL_LIFE_UPDATED_ACK = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 13009, 2); + + internal static MEMORY_CELL TOOL_STATUS_UPDATED_DATA = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 13011, 10); + internal static MEMORY_CELL TOOL_LIFE_UPDATED_DATA = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 13022, 40); + } + } \ No newline at end of file diff --git a/CMS_CORE_Library/Models/DataStructures.cs b/CMS_CORE_Library/Models/DataStructures.cs index c658c76..ad46c79 100644 --- a/CMS_CORE_Library/Models/DataStructures.cs +++ b/CMS_CORE_Library/Models/DataStructures.cs @@ -194,7 +194,7 @@ namespace CMS_CORE_Library.Models public const int NC_SOFTKEYS_NUMBER = 32; public const int PROCESS_NUMBER = 6; public const int ALARMS_NUMBER = 1024; - public const int HEADS_NUMBER = 20; + public const int MAX_HEADS_NUMBER = 20; public enum HEAD_OVERRIDE_SIGN { diff --git a/CMS_CORE_Library/Osai/Nc_Osai.cs b/CMS_CORE_Library/Osai/Nc_Osai.cs index 3ba6040..47a933b 100644 --- a/CMS_CORE_Library/Osai/Nc_Osai.cs +++ b/CMS_CORE_Library/Osai/Nc_Osai.cs @@ -527,13 +527,6 @@ namespace CMS_CORE_Library.Osai public override CmsError PLC_WRefreshAllMessages() { - int numberOfInteger = (ALARMS_NUMBER / 8) / 4; // Number of integers to write 1024 / 8 = byte number - List defaultValue = Enumerable.Repeat(uint.MaxValue, numberOfInteger).ToList(); - - CmsError cmsError = MEM_RWDWordList(W, 0, ALARM_REFRESH_STROBE.MemType, ALARM_REFRESH_STROBE.Address, numberOfInteger, ref defaultValue); - if (cmsError.IsError()) - return cmsError; - return NO_ERROR; } @@ -729,14 +722,14 @@ namespace CMS_CORE_Library.Osai public override CmsError PLC_RHeadsData(List heads, int number) { // Check parameters - if (number > HEADS_NUMBER) + if (number > MAX_HEADS_NUMBER) return INCORRECT_PARAMETERS_ERROR; heads.Clear(); List readInts = new List(); List readValues = new List(); // Find the size of a single head - int headsByte = (HEADS_DATA.Size / HEADS_NUMBER); + int headsByte = (HEADS_DATA.Size / MAX_HEADS_NUMBER); double headsInts = Math.Ceiling((double)(headsByte / 4) + 1); // Read data for N heads @@ -769,7 +762,7 @@ namespace CMS_CORE_Library.Osai public override CmsError PLC_WHeadOverride(uint id, HEAD_OVERRIDE_SIGN sign) { - if (id > HEADS_NUMBER) + if (id > MAX_HEADS_NUMBER) return INCORRECT_PARAMETERS_ERROR; MEMORY_CELL currentStrobeCell = sign == HEAD_OVERRIDE_SIGN.PLUS ? HEADS_STROBE_INCREMENT : HEADS_STROBE_DECREMENT; @@ -782,6 +775,7 @@ namespace CMS_CORE_Library.Osai return NO_ERROR; } + private CmsError PLC_WStrobe(MEMORY_CELL ackCell, MEMORY_CELL strobeCell, uint id) { CmsError cmsError; @@ -1076,10 +1070,10 @@ namespace CMS_CORE_Library.Osai return NO_ERROR; } - //Get Active PP Name + // Get Active PP Name public override CmsError PROC_RSelectedPPName(ushort ProcNumber, ref string Name) { - //Check if the NC is Connected + // Check if the NC is Connected CmsError cmsError = CheckConnection(); if (cmsError.IsError()) return cmsError; @@ -1088,17 +1082,17 @@ namespace CMS_CORE_Library.Osai string MainName = ""; string SubName = ""; - //Try to get information + // Try to get information try { - //Execute the method + // Execute the method nReturn = OpenNC.GetActivePartProgram(ProcNumber, out Level, out MainName, out SubName, out uint errorClass, out uint errorNum); - //If there's an error launch exception + // If there's an error launch exception if (errorClass != 0 || errorNum != 0 || nReturn == 0) return GetNCError(errorClass, errorNum); - //Build the new String + // Build the new String Name = MainName; } catch (Exception ex) @@ -1168,10 +1162,7 @@ namespace CMS_CORE_Library.Osai return cmsError; if (readValue) - { procNumber = (ushort)(i + 1); - return NO_ERROR; - } } return NO_ERROR; @@ -1542,7 +1533,7 @@ namespace CMS_CORE_Library.Osai public override CmsError AXES_WSelectAxis(byte axisId) { - // Write byte from memory + // Write new axis id to memory CmsError cmsError = MEM_RWByte(W, 0, SELECT_AXIS.MemType, SELECT_AXIS.Address, SELECT_AXIS.SubAddress, ref axisId); if (cmsError.IsError()) return cmsError; diff --git a/CMS_CORE_Library/Siemens/Nc_Siemens.cs b/CMS_CORE_Library/Siemens/Nc_Siemens.cs index 8777645..883819e 100644 --- a/CMS_CORE_Library/Siemens/Nc_Siemens.cs +++ b/CMS_CORE_Library/Siemens/Nc_Siemens.cs @@ -824,14 +824,14 @@ namespace CMS_CORE_Library.Siemens public override CmsError PLC_RHeadsData(List heads, int number) { // Check parameters - if (number > HEADS_NUMBER) + if (number > MAX_HEADS_NUMBER) return INCORRECT_PARAMETERS_ERROR; heads.Clear(); List readInts = new List(); List readValues = new List(); // Find the size of a single head - int headsByte = (HEADS_DATA.Size / HEADS_NUMBER); + int headsByte = (HEADS_DATA.Size / MAX_HEADS_NUMBER); double headsInts = Math.Ceiling((double)(headsByte / 4) + 1); // Read data for N heads @@ -870,7 +870,7 @@ namespace CMS_CORE_Library.Siemens public override CmsError PLC_WHeadOverride(uint id, HEAD_OVERRIDE_SIGN sign) { - if (id > HEADS_NUMBER) + if (id > MAX_HEADS_NUMBER) return INCORRECT_PARAMETERS_ERROR; MEMORY_CELL currentStrobeCell = sign == HEAD_OVERRIDE_SIGN.PLUS ? HEADS_STROBE_INCREMENT : HEADS_STROBE_DECREMENT;