From f7ddda9fc858106c75e9be40d4f319d7101faad4 Mon Sep 17 00:00:00 2001 From: "Samuele E. Locatelli" Date: Wed, 26 Apr 2017 12:16:54 +0200 Subject: [PATCH] Implementazione gestione VitaUT x OSAI (da testare con veri prog) --- MTC_Adapter/MTC_Adapter/AdapterGeneric.cs | 205 ++++++++++++++++++ MTC_Adapter/MTC_Adapter/AdapterOsai.cs | 242 +++++++++------------- 2 files changed, 302 insertions(+), 145 deletions(-) diff --git a/MTC_Adapter/MTC_Adapter/AdapterGeneric.cs b/MTC_Adapter/MTC_Adapter/AdapterGeneric.cs index ed4b3ef..302f0b3 100644 --- a/MTC_Adapter/MTC_Adapter/AdapterGeneric.cs +++ b/MTC_Adapter/MTC_Adapter/AdapterGeneric.cs @@ -2439,6 +2439,211 @@ namespace MTC_Adapter } } } + /// + /// procedura di lettura (multistep) dati da memoria x caricare dati utensile + /// + /// num max di teste da recuperare + public virtual void getDatiUt(int maxNumOp) + { + // variabili "Indice" utensile e famiglia da decodificare + utils + int maxMemAddr = 200; + byte[] elencoUtMem = new byte[2 * maxNumOp]; + byte[] tabUt_UT = new byte[2 * maxMemAddr]; + byte[] tabFam_FamUt = new byte[2 * maxMemAddr]; + + // altre variabili + int[] idUtMontato = new int[maxNumOp]; + int[] idFamUt = new int[maxNumOp]; + int[] idTipoVitaUt = new int[maxNumOp]; + int[] valVitaUtRes = new int[maxNumOp]; + int[] tabUt = new int[maxMemAddr]; + int[] tabFamUt = new int[maxMemAddr]; + int memIndex = 0; + byte[] int32Mem = new byte[4]; + byte[] int16Mem = new byte[2]; + byte int8Mem = new byte(); + + // step 1: lettura ID dell'utensile x ogni testa... leggo area memoria degli UT montati + memIndex = getDatiUt_step1(ref elencoUtMem); + // decodifica da byte a int16 dell'ID Utensile + for (int i = 0; i < maxNumOp; i++) + { + idUtMontato[i] = BitConverter.ToUInt16(elencoUtMem, 2 * i); + } + + // step 2a: leggo vettore memoria dei maxMemAddr(200) UT in Tabella Utensili + memIndex = getDatiUt_step2a(ref tabUt_UT); + // decodifico TUTTI i maxMemAddr utensili + for (int i = 0; i < maxMemAddr; i++) + { + tabUt[i] = BitConverter.ToUInt16(tabUt_UT, 2 * i); + } + // step 2b: devo cercare l'UT di ogni UnOp nella Tabella Utensili + for (int i = 0; i < maxNumOp; i++) + { + // spazzo la tab Utensili x cercare quelli delle UnOp... + for (int j = 0; j < maxMemAddr; j++) + { + // controllo, se l'id utensile è quello dell'attuale UnOp... + if (tabUt[j] == idUtMontato[i]) + { + // leggo FamUt puntuale.. + memIndex = getDatiUt_step2b(ref int16Mem, j); + // step 2b: leggo puntualmente la FamUt dal suo indice... + idFamUt[i] = BitConverter.ToUInt16(int16Mem, 0); + } + } + } + + + // step 3a: leggo vettore memoria dei maxMemAddr(200) FamUT in Tabella Famiglie Utensili (x ricavare unità misura vita) + memIndex = getDatiUt_step3a(ref tabFam_FamUt); + // decodifico TUTTI i maxMemAddr utensili + for (int i = 0; i < maxMemAddr; i++) + { + tabFamUt[i] = BitConverter.ToUInt16(tabFam_FamUt, 2 * i); + } + // step 3b: devo cercare la famiglia dell'UT di ogni UnOp nella Tabella Famiglie + for (int i = 0; i < maxNumOp; i++) + { + // poiché potrei trovarlo replicato dopo la prima volta che lo trovo evito di ricontrollare... + bool found = false; + // spazzo la tab Utensili x cercare quelli delle UnOp... + for (int j = 0; j < maxMemAddr; j++) + { + // controllo, se l'id utensile è quello dell'attuale UnOp... + if (tabFamUt[j] == idFamUt[i] && !found) + { + // leggo FamUt puntuale.. + memIndex = getDatiUt_step3b(ref int8Mem, j); + // step 3b: leggo puntualmente il TIPO DI vita UT dal suo indice... + idTipoVitaUt[i] = int8Mem; + found = true; + } + } + } + + // step 4: recupero la vita residua dell'utente + for (int i = 0; i < maxNumOp; i++) + { + // spazzo la tab Utensili x cercare quelli delle UnOp... + for (int j = 0; j < maxMemAddr; j++) + { + // controllo, se l'id utensile è quello dell'attuale UnOp... + if (tabUt[j] == idUtMontato[i]) + { + // leggo FamUt puntuale.. + memIndex = getDatiUt_step4(ref int32Mem, j); + // leggo puntualmente valore della vita ut residua da indice utensile... + valVitaUtRes[i] = BitConverter.ToInt32(int32Mem, 0); + } + } + } + + // salvo in adapter vita UT residua... + for (int i = 0; i < maxNumOp; i++) + { + vettUnOp[i].mUnOpToolId.Value = idUtMontato[i]; + vettUnOp[i].mUnOpVitaRes.Value = valVitaUtRes[i]; + // decodifico valore tipo VitaRes... + string tipoVitaRes = "ND"; + switch (idTipoVitaUt[i]) + { + case 1: + tipoVitaRes = "Time"; + break; + case 2: + tipoVitaRes = "Stroke"; + break; + case 3: + tipoVitaRes = "Distance"; + break; + default: break; + } + vettUnOp[i].mUnOpVitaResType.Value = tipoVitaRes; + } + } + /// + /// Procedura di processing lettura memoria x DatiUt - Step 4 + /// + /// + /// + /// + public virtual int getDatiUt_step4(ref byte[] int32Mem, int j) + { + int memIndex = 13100 + 4 * j; + //inizio = DateTime.Now; + //OsaiMemRW(R, FANUC.MemType.D, memIndex, ref int32Mem); + //if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-TabUT-VitaRes", int32Mem.Length), DateTime.Now.Subtract(inizio).Ticks); + return memIndex; + } + /// + /// Procedura di processing lettura memoria x DatiUt - Step 3b + /// + /// + /// + /// + public virtual int getDatiUt_step3b(ref byte int8Mem, int j) + { + int memIndex = 10700 + 1 * j; + //inizio = DateTime.Now; + //OsaiMemRW(R, FANUC.MemType.D, memIndex, ref int8Mem); + //if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-TabUT-FamUT", 8), DateTime.Now.Subtract(inizio).Ticks); + return memIndex; + } + /// + /// Procedura di processing lettura memoria x DatiUt - Step 3a + /// + /// + /// + public virtual int getDatiUt_step3a(ref byte[] tabFam_FamUt) + { + int memIndex = 8900; + //inizio = DateTime.Now; + //OsaiMemRW(R, FANUC.MemType.D, memIndex, ref tabFam_FamUt); + //if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-TabFamUT-FamUT", tabFam_FamUt.Length), DateTime.Now.Subtract(inizio).Ticks); + return memIndex; + } + /// + /// Procedura di processing lettura memoria x DatiUt - Step 2b + /// + /// + /// + /// + public virtual int getDatiUt_step2b(ref byte[] int16Mem, int j) + { + int memIndex = 11700 + 2 * j; + //inizio = DateTime.Now; + //OsaiMemRW(R, FANUC.MemType.D, memIndex, ref int16Mem); + //if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-TabUT-FamUT", int16Mem.Length), DateTime.Now.Subtract(inizio).Ticks); + return memIndex; + } + /// + /// Procedura di processing lettura memoria x DatiUt - Step 2a + /// + /// + /// + public virtual int getDatiUt_step2a(ref byte[] tabUt_UT) + { + int memIndex = 11300; + //inizio = DateTime.Now; + //OsaiMemRW(R, FANUC.MemType.D, memIndex, ref tabUt_UT); + //if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-TabUT-UT", tabUt_UT.Length), DateTime.Now.Subtract(inizio).Ticks); + return memIndex; + } + /// + /// Procedura di processing lettura memoria x DatiUt - Step 1 + /// + /// + /// + public virtual int getDatiUt_step1(ref byte[] elencoUtMem) + { + int memIndex = 2960; + //inizio = DateTime.Now; + //OsaiMemRW(R, FANUC.MemType.D, memIndex, ref elencoUtMem); + //if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-NUMUT", elencoUtMem.Length), DateTime.Now.Subtract(inizio).Ticks); + return memIndex; + } #endregion diff --git a/MTC_Adapter/MTC_Adapter/AdapterOsai.cs b/MTC_Adapter/MTC_Adapter/AdapterOsai.cs index 3da430c..075349e 100644 --- a/MTC_Adapter/MTC_Adapter/AdapterOsai.cs +++ b/MTC_Adapter/MTC_Adapter/AdapterOsai.cs @@ -1096,7 +1096,7 @@ namespace MTC_Adapter reloadDataFromFile(); // area gestione dati utensili... in base al num max di UnOp recupero i dati utensile... PROCEDURA AD HOC!!! - getDatiUt_Osai(currAdpConf.nUnOp); + getDatiUt(currAdpConf.nUnOp); } /// /// Gestione lettura dati manutenzione @@ -1143,10 +1143,11 @@ namespace MTC_Adapter parentForm.dataMonitor_3 = ""; // accodo dati path in DataMonitor...... - StringBuilder sb = new StringBuilder(); + StringBuilder sb1 = new StringBuilder(); + StringBuilder sb2 = new StringBuilder(); // dati base... - sb.AppendLine(string.Format("POWER {0}: | EmStop:{1:N3} | ProcSel: {2}", mPower.Value, mEStop.Value, mProcSel.Value)); + sb1.AppendLine(string.Format("POWER {0}: | EmStop:{1:N3} | ProcSel: {2}", mPower.Value, mEStop.Value, mProcSel.Value)); // leggo dati globali... inizio = DateTime.Now; @@ -1165,26 +1166,26 @@ namespace MTC_Adapter if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-PathData", PathData_mem.Length * 2), DateTime.Now.Subtract(inizio).Ticks); // inizio indicando feed... - sb.AppendLine(string.Format("FeedRate: {0} mm/min", FeedRate)); - sb.AppendLine(string.Format("SpeedRate: {0} mm/min", SpeedRate)); + sb1.AppendLine(string.Format("FeedRate: {0} mm/min", FeedRate)); + sb1.AppendLine(string.Format("SpeedRate: {0} mm/min", SpeedRate)); // 2017.04.20: recupero OVER per Jog/Feed/Rapid/Spindle x i path multipli (qui cablati 1-2) ushort[] currPathData = new ushort[7]; // processo ora i dai dei path... di sicuro il primo Array.Copy(PathData_mem, 0, currPathData, 0, 7); - procPathOverride(0, currPathData, ref sb); + procPathOverride(0, currPathData, ref sb1); //...e se c'è pure il secondo... if (currAdpConf.nPath > 1) { Array.Copy(PathData_mem, 7, currPathData, 0, 7); // anche il secondo! - procPathOverride(1, currPathData, ref sb); + procPathOverride(1, currPathData, ref sb1); } // se ho allarmi li accodo... if (allNcData.lastncerror != 0) { - sb.AppendLine(string.Format("Allarmi CNC: {0}", allNcData.lastncerror)); + sb1.AppendLine(string.Format("Allarmi CNC: {0}", allNcData.lastncerror)); inizio = DateTime.Now; OSAI_ref.O_ReadCurrentErrorMsg(ref allarmiCNC); @@ -1204,7 +1205,14 @@ namespace MTC_Adapter allarmiCNC = new CMSCncLib.OPENcontrol.MSGERROR(); } - parentForm.dataMonitor_1 = sb.ToString(); + // accodo dati base! + parentForm.dataMonitor_1 = sb1.ToString(); + // accodo dati UT... + for (int i = 0; i < currAdpConf.nUnOp; i++) + { + sb2.AppendLine(string.Format("UT: ToolId {0} | VitaRes {1} | TipoVita {2} ", vettUnOp[i].mUnOpToolId.Value, vettUnOp[i].mUnOpVitaRes.Value, vettUnOp[i].mUnOpVitaResType.Value)); + } + parentForm.dataMonitor_2 = sb2.ToString(); // gestisco lettura dati manutenzione da PLC... getMtzDataFromPlc(); @@ -1402,148 +1410,91 @@ namespace MTC_Adapter parentForm.dataMonitor += sb.ToString(); #endif } + /// - /// procedura di lettura (Multipla) dati da memoria x caricare dati utensile + /// Procedura di processing lettura memoria x DatiUt - Step 4 /// - /// num max di teste da recuperare - private void getDatiUt_Osai(int maxNumOp) + /// + /// + /// + public override int getDatiUt_step4(ref byte[] int32Mem, int j) { -#if false - // variabili "Indice" utensile e famiglia da decodificare + utils - int maxMemAddr = 200; - int[] idUtMontato = new int[maxNumOp]; - int[] idFamUt = new int[maxNumOp]; - int[] idTipoVitaUt = new int[maxNumOp]; - int[] valVitaUtRes = new int[maxNumOp]; - int[] tabUt = new int[maxMemAddr]; - int[] tabFamUt = new int[maxMemAddr]; - int memIndex = 0; - byte[] int32Mem = new byte[4]; - byte[] int16Mem = new byte[2]; - byte int8Mem = new byte(); - - // step 1: lettura ID dell'utensile x ogni testa... - byte[] elencoUtMem = new byte[2 * maxNumOp]; - // leggo area memoria degli UT montati - memIndex = 2960; + int memIndex = 6200 + 2 * j; inizio = DateTime.Now; - OsaiMemRW(R, FANUC.MemType.D, memIndex, ref elencoUtMem); - if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-NUMUT", elencoUtMem.Length), DateTime.Now.Subtract(inizio).Ticks); - // decodifica da byte a int16 dell'ID Utensile - for (int i = 0; i < maxNumOp; i++) - { - idUtMontato[i] = BitConverter.ToUInt16(elencoUtMem, 2 * i); - } - - // step 2a: leggo vettore memoria dei maxMemAddr(200) UT in Tabella Utensili - memIndex = 11300; - byte[] tabUt_UT = new byte[2 * maxMemAddr]; + OsaiMemRW_Byte(R, OSAI.MemTypeWord.MW_CODE, memIndex, 0, ref int32Mem); + if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-TabUT-VitaRes", int32Mem.Length), DateTime.Now.Subtract(inizio).Ticks); + return memIndex; + } + /// + /// Procedura di processing lettura memoria x DatiUt - Step 3b + /// + /// + /// + /// + public override int getDatiUt_step3b(ref byte int8Mem, int j) + { + int memIndex = 5000 + 1 * j / 2; // dovrebeb leggere correttamente solo 1 byte... + byte[] byteMtrx = new byte[1]; + int resto = 0; + Math.DivRem(j, 2, out resto); inizio = DateTime.Now; - OsaiMemRW(R, FANUC.MemType.D, memIndex, ref tabUt_UT); - if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-TabUT-UT", tabUt_UT.Length), DateTime.Now.Subtract(inizio).Ticks); - // decodifico TUTTI i maxMemAddr utensili - for (int i = 0; i < maxMemAddr; i++) - { - tabUt[i] = BitConverter.ToUInt16(tabUt_UT, 2 * i); - } - // step 2a: devo cercare l'UT di ogni UnOp nella Tabella Utensili - for (int i = 0; i < maxNumOp; i++) - { - // spazzo la tab Utensili x cercare quelli delle UnOp... - for (int j = 0; j < maxMemAddr; j++) - { - // controllo, se l'id utensile è quello dell'attuale UnOp... - if (tabUt[j] == idUtMontato[i]) - { - // leggo FamUt puntuale.. - memIndex = 11700 + 2 * j; - inizio = DateTime.Now; - OsaiMemRW(R, FANUC.MemType.D, memIndex, ref int16Mem); - if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-TabUT-FamUT", int16Mem.Length), DateTime.Now.Subtract(inizio).Ticks); - // step 2b: leggo puntualmente la FamUt dal suo indice... - idFamUt[i] = BitConverter.ToUInt16(int16Mem, 0); - } - } - } - - - // step 3: leggo vettore memoria dei maxMemAddr(200) FamUT in Tabella Famiglie Utensili (x ricavare unità misura vita) - memIndex = 8900; - byte[] tabFam_FamUt = new byte[2 * maxMemAddr]; + OsaiMemRW_Byte(R, OSAI.MemTypeWord.MW_CODE, memIndex, resto, ref byteMtrx); + int8Mem = byteMtrx[0]; + if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-TabUT-FamUT", 8), DateTime.Now.Subtract(inizio).Ticks); + return memIndex; + } + /// + /// Procedura di processing lettura memoria x DatiUt - Step 3a + /// + /// + /// + public override int getDatiUt_step3a(ref byte[] tabFam_FamUt) + { + int memIndex = 4100; inizio = DateTime.Now; - OsaiMemRW(R, FANUC.MemType.D, memIndex, ref tabFam_FamUt); + OsaiMemRW_Byte(R, OSAI.MemTypeWord.MW_CODE, memIndex, 0, ref tabFam_FamUt); if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-TabFamUT-FamUT", tabFam_FamUt.Length), DateTime.Now.Subtract(inizio).Ticks); - // decodifico TUTTI i maxMemAddr utensili - for (int i = 0; i < maxMemAddr; i++) - { - tabFamUt[i] = BitConverter.ToUInt16(tabFam_FamUt, 2 * i); - } - // step 3a: devo cercare la famiglia dell'UT di ogni UnOp nella Tabella Famiglie - for (int i = 0; i < maxNumOp; i++) - { - // poiché potrei trovarlo replicato dopo la prima volta che lo trovo evito di ricontrollare... - bool found = false; - // spazzo la tab Utensili x cercare quelli delle UnOp... - for (int j = 0; j < maxMemAddr; j++) - { - // controllo, se l'id utensile è quello dell'attuale UnOp... - if (tabFamUt[j] == idFamUt[i] && !found) - { - // leggo FamUt puntuale.. - memIndex = 10700 + 1 * j; - inizio = DateTime.Now; - OsaiMemRW(R, FANUC.MemType.D, memIndex, ref int8Mem); - if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-TabUT-FamUT", 8), DateTime.Now.Subtract(inizio).Ticks); - // step 3b: leggo puntualmente il TIPO DI vita UT dal suo indice... - idTipoVitaUt[i] = int8Mem; - found = true; - } - } - } - - // step 4: recupero la vita residua dell'utente - for (int i = 0; i < maxNumOp; i++) - { - // spazzo la tab Utensili x cercare quelli delle UnOp... - for (int j = 0; j < maxMemAddr; j++) - { - // controllo, se l'id utensile è quello dell'attuale UnOp... - if (tabUt[j] == idUtMontato[i]) - { - // leggo FamUt puntuale.. - memIndex = 13100 + 4 * j; - inizio = DateTime.Now; - OsaiMemRW(R, FANUC.MemType.D, memIndex, ref int32Mem); - if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-TabUT-VitaRes", int32Mem.Length), DateTime.Now.Subtract(inizio).Ticks); - // leggo puntualmente valore della vita ut residua da indice utensile... - valVitaUtRes[i] = BitConverter.ToInt32(int32Mem, 0); - } - } - } - - // salvo in adapter vita UT residua... - for (int i = 0; i < maxNumOp; i++) - { - vettUnOp[i].mUnOpToolId.Value = idUtMontato[i]; - vettUnOp[i].mUnOpVitaRes.Value = valVitaUtRes[i]; - // decodifico valore tipo VitaRes... - string tipoVitaRes = "ND"; - switch (idTipoVitaUt[i]) - { - case 1: - tipoVitaRes = "Time"; - break; - case 2: - tipoVitaRes = "Stroke"; - break; - case 3: - tipoVitaRes = "Distance"; - break; - default: break; - } - vettUnOp[i].mUnOpVitaResType.Value = tipoVitaRes; - } -#endif + return memIndex; + } + /// + /// Procedura di processing lettura memoria x DatiUt - Step 2b + /// + /// + /// + /// + public override int getDatiUt_step2b(ref byte[] int16Mem, int j) + { + int memIndex = 5500 + j; + inizio = DateTime.Now; + OsaiMemRW_Byte(R, OSAI.MemTypeWord.MW_CODE, memIndex, 0, ref int16Mem); + if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-TabUT-FamUT", int16Mem.Length), DateTime.Now.Subtract(inizio).Ticks); + return memIndex; + } + /// + /// Procedura di processing lettura memoria x DatiUt - Step 2a + /// + /// + /// + public override int getDatiUt_step2a(ref byte[] tabUt_UT) + { + int memIndex = 5300; + inizio = DateTime.Now; + OsaiMemRW_Byte(R, OSAI.MemTypeWord.MW_CODE, memIndex, 0, ref tabUt_UT); + if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-TabUT-UT", tabUt_UT.Length), DateTime.Now.Subtract(inizio).Ticks); + return memIndex; + } + /// + /// Procedura di processing lettura memoria x DatiUt - Step 1 + /// + /// + /// + public override int getDatiUt_step1(ref byte[] elencoUtMem) + { + int memIndex = 3020; + inizio = DateTime.Now; + OsaiMemRW_Byte(R, OSAI.MemTypeWord.MW_CODE, memIndex, 0, ref elencoUtMem); + if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-NUMUT", elencoUtMem.Length), DateTime.Now.Subtract(inizio).Ticks); + return memIndex; } public override void getPath() @@ -1577,6 +1528,7 @@ namespace MTC_Adapter #endif + // NON ci sono nella documentazione metodi x recuperare posizione PuntaUtensile, verificare con Andrea... #if false inizio = DateTime.Now; @@ -1637,7 +1589,7 @@ namespace MTC_Adapter OSAI_ref.getAllAxisPos(2, ref posAssi); if (utils.CRB("recTime")) TimingData.addResult("R-AXIS_POS", DateTime.Now.Subtract(inizio).Ticks); - // NON c'è LOAD assi... + // NON c'è LOAD assi... verificare con Andrea #if false inizio = DateTime.Now; CMSCncLib.Focas1.ODBSVLOAD loadAssi = OSAI_ref.getAllAxisLoad();