From b481b39a488c044381528324d10c5ad02c7c4e2f Mon Sep 17 00:00:00 2001 From: "Samuele E. Locatelli" Date: Wed, 28 Nov 2018 13:00:23 +0100 Subject: [PATCH] Continuo fix letture KAWASAKI --- IOB-UT/baseUtils.cs | 11 ++ IOB-WIN/IobKawasaki.cs | 240 +++++++++++++++++++++++++++++++---------- Jenkinsfile | 2 +- 3 files changed, 198 insertions(+), 55 deletions(-) diff --git a/IOB-UT/baseUtils.cs b/IOB-UT/baseUtils.cs index 33d1e9d5..ec55d536 100644 --- a/IOB-UT/baseUtils.cs +++ b/IOB-UT/baseUtils.cs @@ -150,6 +150,17 @@ namespace IOB_UT return Convert.ToString(theNumber, 2).PadLeft(minimumDigits, '0'); } /// + /// Effettua reverse delal stringa + /// + /// + /// + public static string reverseStr(string s) + { + char[] arr = s.ToCharArray(); + Array.Reverse(arr); + return new string(arr); + } + /// /// imposta un bit al valore richiesto duplicando il valore IN come OUT /// /// valore originale da aggiornare diff --git a/IOB-WIN/IobKawasaki.cs b/IOB-WIN/IobKawasaki.cs index 1be666eb..49d853e1 100644 --- a/IOB-WIN/IobKawasaki.cs +++ b/IOB-WIN/IobKawasaki.cs @@ -35,11 +35,11 @@ namespace IOB_WIN /// /// Variabile STATUS corrente (8bit INT) /// - protected int cStatus; + protected string cStatus; /// /// Variabile SIGNALS corrente (8bit INT) /// - protected int cSignals; + protected string cSignals; /// /// Num pezzi prelevati /// @@ -87,23 +87,23 @@ namespace IOB_WIN { // connect ok resDataArray = KAWASAKI_ref.command("where", 3000); // WHERE [RET] - Console.WriteLine(resDataArray[0]); - // [0] = 0 - // [1] = JT1 JT2 JT3 JT4 JT5 JT6 - // -23.205 - 39.967 - 13.176 95.663 71.402 - 21.512 - // X[mm] Y[mm] Z[mm] O[deg] A[deg] T[deg] - // - 489.620 693.940 1564.733 92.612 131.285 7.482 + // Console.WriteLine(resDataArray[1]); + // [0] = 0 + // [1] = JT1 JT2 JT3 JT4 JT5 JT6 + // -23.205 - 39.967 - 13.176 95.663 71.402 - 21.512 + // X[mm] Y[mm] Z[mm] O[deg] A[deg] T[deg] + // - 489.620 693.940 1564.733 92.612 131.285 7.482 - threadOk = commThreadOk; + threadOk = commThreadOk; -#if true +#if false if (KAWASAKI_ref.IsConnected) { resDataArray = KAWASAKI_ref.command("TYPE TASK (1004)", 3000); // thread 4 ok --> " 1\r\n" } #endif - macName = machineName; + macName = machineName; #if false if (KAWASAKI_ref.IsConnected) { @@ -111,8 +111,8 @@ namespace IOB_WIN } #endif - cStatus = currBitmapStatus; - cSignals = currBitmapSignals; + cStatus = currBitmapStatus; + cSignals = currBitmapSignals; #if false if (KAWASAKI_ref.IsConnected) { @@ -121,9 +121,9 @@ namespace IOB_WIN } #endif - lastCountCNC = pzCounter; - numPzPrel = pzPrelevati; - lastRecTC = lastTC; + lastCountCNC = pzCounter; + numPzPrel = pzPrelevati; + lastRecTC = lastTC; #if false if (KAWASAKI_ref.IsConnected) { @@ -133,7 +133,7 @@ namespace IOB_WIN } #endif - lastMissRobot = lastMission; + lastMissRobot = lastMission; #if false if (KAWASAKI_ref.IsConnected) { @@ -751,7 +751,7 @@ namespace IOB_WIN if (KAWASAKI_ref.IsConnected) { resDataArray = KAWASAKI_ref.command("TYPE i_prelevati", 3000); // num pz prelevati --> "0\r\n" - int.TryParse(resDataArray[0].ToString().Replace("/n", "").Replace("/r", ""), out answ); + int.TryParse(resDataArray[1].ToString().Replace("\n", "").Replace("\r", ""), out answ); } return answ; } @@ -767,7 +767,7 @@ namespace IOB_WIN if (KAWASAKI_ref.IsConnected) { resDataArray = KAWASAKI_ref.command("TYPE r_tempo", 3000); // ultimo TCiclo rilevato --> " 349.19\r\n" - decimal.TryParse(resDataArray[0].ToString().Replace("/n", "").Replace("/r", ""), out answ); + decimal.TryParse(resDataArray[1].ToString().Replace("\n", "").Replace("\r", ""), out answ); } return answ; } @@ -783,7 +783,7 @@ namespace IOB_WIN if (KAWASAKI_ref.IsConnected) { resDataArray = KAWASAKI_ref.command("TYPE i_cicli", 3000); // num cicli depositati/fatti --> " 0\r\n" - int.TryParse(resDataArray[0].ToString().Replace("/n", "").Replace("/r", ""), out answ); + int.TryParse(resDataArray[1].ToString().Replace("\n", "").Replace("\r", ""), out answ); } return answ; } @@ -809,7 +809,7 @@ namespace IOB_WIN { int retVal = 0; resDataArray = KAWASAKI_ref.command("TYPE TASK (1004)", 3000); // thread 4 ok --> " 1\r\n" - int.TryParse(resDataArray[0].ToString().Replace("/n", "").Replace("/r", ""), out retVal); + int.TryParse(resDataArray[1].ToString().Replace("\n", "").Replace("\r", ""), out retVal); answ = (retVal == 1); } return answ; @@ -826,7 +826,7 @@ namespace IOB_WIN if (KAWASAKI_ref.IsConnected) { resDataArray = KAWASAKI_ref.command("TYPE $id_true", 3000); // id macchina --> "BX100N-B001 Sn. 2366\r\n" - answ = resDataArray[0].ToString().Replace("/n", "").Replace("/r", ""); + answ = resDataArray[1].ToString().Replace("\n", "").Replace("\r", ""); } return answ; } @@ -842,66 +842,72 @@ namespace IOB_WIN if (KAWASAKI_ref.IsConnected) { resDataArray = KAWASAKI_ref.command("TYPE $exe", 3000); // missione --> "\r\n" (vuoto, no missione) - answ = resDataArray[0].ToString().Replace("/n", "").Replace("/r", ""); + answ = resDataArray[1].ToString().Replace("\n", "").Replace("\r", ""); } return answ; } } /// - /// Restituisce stato macchina nel formato IOB: + /// Restituisce stato macchina nel formato (da sx a dx): /// B0: POWER_ON - /// B1: RUN - /// B2: pzCount - /// B3: allarme - /// B4: manuale - /// B5: emergenza - /// B6: ??? - /// B7: ??? + /// B1: AUTO + /// B2: RUN + /// B3: ERROR + /// B4: ALLARME + /// B5: EMERGENZA OK + /// B6: PORTA CHIUSA + /// B7: PRONTO AL LOAD /// - protected int currBitmapStatus + protected string currBitmapStatus { get { - int answ = 0; - + string answ = ""; if (KAWASAKI_ref.IsConnected) { resDataArray = KAWASAKI_ref.command("TYPE $status", 3000); // status --> "0|0|1|0|0|1|0|0\r\n" - string szBitmap = resDataArray[0].ToString().Replace("/n", "").Replace("/r", "").Replace("|", ""); + answ = resDataArray[1].ToString().Replace("\n", "").Replace("\r", "").Replace("|", ""); +#if false + // reverse stringa (B0 portato a sx) + szBitmap = utils.reverseStr(szBitmap); // ora converto bitmap string in INT - answ = Convert.ToInt32(szBitmap, 2); + answ = Convert.ToInt32(szBitmap, 2); +#endif } return answ; } } /// /// Restituisce SEGNALI macchina nel formato: - /// B0: ??? - /// B1: ??? - /// B2: ??? - /// B3: ??? - /// B4: ??? - /// B5: ??? - /// B6: ??? - /// B7: ??? + /// B0: Transfer in auto + /// B1: Punzonatrice in AUTO + /// B2: Barriera tavola + /// B3: + /// B4: + /// B5: + /// B6: + /// B7: /// - protected int currBitmapSignals + protected string currBitmapSignals { get { - int answ = 0; - + string answ = ""; if (KAWASAKI_ref.IsConnected) { resDataArray = KAWASAKI_ref.command("TYPE $signal", 3000); // segnali --> "1|0|1|1|1|0|0|0\r\n" - string szBitmap = resDataArray[0].ToString().Replace("/n", "").Replace("/r", "").Replace("|", ""); + answ = resDataArray[1].ToString().Replace("\n", "").Replace("\r", "").Replace("|", ""); +#if false + // reverse stringa (B0 portato a sx) + szBitmap = utils.reverseStr(szBitmap); // ora converto bitmap string in INT - answ = Convert.ToInt32(szBitmap, 2); + answ = Convert.ToInt32(szBitmap, 2); +#endif } return answ; } } - + /// /// Effettua salvataggio del programma corrente /// @@ -1054,12 +1060,138 @@ namespace IOB_WIN // effettuo TUTTE le letture threadOk = commThreadOk; - // imposto valore status bitmap... - B_input = currBitmapStatus; - lastCountCNC = pzCounter; - + cStatus = currBitmapStatus; + cSignals = currBitmapSignals; + lastCountCNC = pzCounter; + // decodifica e gestione + decodeToBaseBitmap(); decodeOtherData(); } + + /// + /// Effettua decodifica aree memoria alla bitmap usata x MAPO + /// + private void decodeToBaseBitmap() + { +#if false + // init a zero... + B_input = 0; + // FAPE: leggo i primi 2 WORD x decodifica stato e posizione... + ushort valStatus = S7.Net.Types.Word.FromByteArray(RawInput.Skip(0).Take(2).ToArray()); + ushort valPosit = S7.Net.Types.Word.FromByteArray(RawInput.Skip(2).Take(2).ToArray()); + statoMacchina _stMacch = ((statoMacchina)valStatus); + posizioneSequenza _posSeq = ((posizioneSequenza)valPosit); + + /* ----------------------------------------------------- + * bitmap MAPO + * B0: POWER_ON + * B1: RUN + * B2: pzCount + * B3: allarme + * B4: manuale + * B5: emergenza + ----------------------------------------------------- */ + + // bit 0 (poweron) imposto a 1 SE connected... + B_input = currPLC.IsConnected ? 1 : 0; + // controllo stato macchina x impostare altri bit... + switch (_stMacch) + { + case statoMacchina.EMERGENZA_INSERITA: + B_input &= (1 << 5); + break; + case statoMacchina.COMUNICAZIONE_ASSENTE: + case statoMacchina.AVARIA_ARIA: + case statoMacchina.AVARIA_PRESSIONE_OLIO: + case statoMacchina.AVARIA_LIVELLO_OLIO: + case statoMacchina.AVARIA_TEMPERATURA_OLIO: + case statoMacchina.AVARIA_MOTORE_POMPA_IDRAULICA: + case statoMacchina.AVARIA_MOTORE_RAFFREDDO_IDRAULICA: + case statoMacchina.AVARIA_SINCRONISMO_PORTE: + case statoMacchina.AVARIA_LIBERA: + case statoMacchina.ATTIVAZIONE_IN_CORSO: + B_input &= (1 << 3); + break; + case statoMacchina.MODO_MANUALE_ATTREZZAGGIO: + B_input &= (1 << 4); + break; + case statoMacchina.CICLO_IN_CORSO: + B_input &= (1 << 1); + break; + case statoMacchina.MODO_AUTOMATICO_LOCALE: + case statoMacchina.MODO_AUTOMATICO_ROBOT: + B_input &= ~(1 << 5); + break; + case statoMacchina.LIBERO: + default: + break; + } + + string currODL = ""; + try + { + currODL = utils.callUrl(urlGetCurrODL); + lgInfo(string.Format("Lettura ODL, {0} --> {1}", currIdxODL, currODL)); + // provo a salvare nuovo ODL + int.TryParse(currODL, out currIdxODL); + } + catch (Exception exc) + { + if (DateTime.Now.Subtract(lastWarnODL).TotalSeconds > 15) + { + lgError(exc, "Errore in fase di chiamata URL x ODL corrente | URL chiamato: {0}", urlGetCurrODL); + lastWarnODL = DateTime.Now; + } + } + if (currODL != null && currODL != "" && currODL != "0") + { + // ora processo il contapezzi... + // controllo se รจ passato intervallo minimo tra 2 controlli/elaborazioni x distanziare invio e ridurre letture + if (DateTime.Now >= lastPzCountSend.AddMilliseconds(pzCountDelay)) + { + // verifico se variato contapezzi... e se passato ritardo minimo... + if (lastCountCNC > contapezzi) + { + // salvo nuovo contapezzi (incremento di 1...) + contapezzi++; + // salvo in semaforo! + B_input &= (1 << 2); + // !!!FARE!!! verifica metodo + //B_input += 1 << 2; + } + // registro contapezzi + lgInfo(string.Format("Contapezzi SIEMENS: {0} | Contapezzi interno {1}", lastCountCNC, contapezzi)); + + // invio a server contapezzi (aggiornato) + string retVal = utils.callUrl(urlSetPzCount + contapezzi.ToString()); + // verifica se tutto OK + if (retVal != "OK") + { + // errore salvataggio contapezzi + lgInfo(string.Format("Errore salvataggio Contapezzi SIEMENS {0} | Contapezzi interno {1} | Errore salvataggio: {2}", lastCountCNC, contapezzi, retVal)); + } + // resetto timer... + lastPzCountSend = DateTime.Now; + } + } + else + { + if (DateTime.Now >= lastPzCountSend.AddMilliseconds(pzCountDelay)) + { + lgInfo(string.Format("Attenzione: mancanza ODL non procedo con gestione contapezzi. Contapezzi SIEMENS {0} | Contapezzi interno {1}", lastCountCNC, contapezzi)); + // resetto timer... + lastPzCountSend = DateTime.Now; + } + } + + // log opzionale! + if (verboseLog) + { + lgInfo(string.Format("Trasformazione B_input: {0}", B_input)); + } +#endif + } + /// /// Decodifica il resto dell'area x i dati accessori (allarmi, ...) /// diff --git a/Jenkinsfile b/Jenkinsfile index 5303193f..716dd3f8 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -16,7 +16,7 @@ pipeline { /* calcolo numero versione... diverso x branch MASTER/DEVELOP */ script { - withEnv(['NEXT_BUILD_NUMBER=310']) { + withEnv(['NEXT_BUILD_NUMBER=311']) { // env.versionNumber = VersionNumber(versionNumberString : '1.18.${BUILD_DATE_FORMATTED, "yyMM"}.${BUILDS_ALL_TIME}', projectStartDate : '2006-01-01', skipFailedBuilds: true) env.versionNumber = VersionNumber(versionNumberString : '1.18.${BUILD_DATE_FORMATTED, "yyMM"}.${BUILDS_ALL_TIME}', projectStartDate : '2006-01-01', skipFailedBuilds: true, overrideBuildsAllTime: '${NEXT_BUILD_NUMBER}') env.APP_NAME = 'MAPO-IOB-WIN'