diff --git a/IOB-WIN-NEXT/IobGeneric.cs b/IOB-WIN-NEXT/IobGeneric.cs index 7accd397..bb912c8a 100644 --- a/IOB-WIN-NEXT/IobGeneric.cs +++ b/IOB-WIN-NEXT/IobGeneric.cs @@ -562,6 +562,11 @@ namespace IOB_WIN_NEXT } } + /// + /// Variabile di appoggio GLOBALE x indicare macchina RUN (es x gestione su reset pezzi) + /// + protected bool isRunning { get; set; } = false; + /// /// Valore limite MASSIMO di invio di dati come array Json /// @@ -607,6 +612,11 @@ namespace IOB_WIN_NEXT /// protected int numSim { get; set; } + /// + /// Indica se sia stato resettato un contapezzi + /// + protected bool pzCountResetted { get; set; } = false; + /// /// Fornisce il valore letto da BITMAP in formato valido x messa in coda nel formato dtEve#value#cont /// @@ -3601,63 +3611,91 @@ namespace IOB_WIN_NEXT bool.TryParse(getOptPar("AUTO_CHANGE_ODL"), out doProc); if (doProc) { - // carico i parametri di configurazione x reset ODL... - string CHANGE_ODL_HOURS = getOptPar("CHANGE_ODL_HOURS"); - string CHANGE_ODL_IDLE_MIN = getOptPar("CHANGE_ODL_IDLE_MIN"); - if (!string.IsNullOrEmpty(CHANGE_ODL_HOURS) && !string.IsNullOrEmpty(CHANGE_ODL_IDLE_MIN)) + bool callChangeODL = false; + // modalità change ODL + string CHANGE_ODL_MODE = "TIME"; + if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE"))) { - int minOdlDurHours = -1; - int minPlcIdelMin = -1; - int.TryParse(CHANGE_ODL_HOURS, out minOdlDurHours); - int.TryParse(CHANGE_ODL_IDLE_MIN, out minPlcIdelMin); - // controllo parametri validi - if (minOdlDurHours > 0 && minPlcIdelMin >= 0) + CHANGE_ODL_MODE = getOptPar("CHANGE_ODL_MODE"); + } + if (CHANGE_ODL_MODE == "PZCOUNT_RESET") + { + /* verifico se sia "armato" il reset cambio ODL, DEVO essere : + * - NON in produzione + * - contapezzi ACT < contapezzi LAST + * */ + if (!isRunning && pzCountResetted) { - // leggo da server inizio ODL... se non multi 1 solo... - DateTime inizioOdl = DateTime.Now; - string rawDataInizio = ""; - if (!isMulti) + callChangeODL = true; + } + } + else if (CHANGE_ODL_MODE == "TIME") + { + // carico i parametri di configurazione x reset ODL... + string CHANGE_ODL_HOURS = getOptPar("CHANGE_ODL_HOURS"); + string CHANGE_ODL_IDLE_MIN = getOptPar("CHANGE_ODL_IDLE_MIN"); + if (!string.IsNullOrEmpty(CHANGE_ODL_HOURS) && !string.IsNullOrEmpty(CHANGE_ODL_IDLE_MIN)) + { + int minOdlDurHours = -1; + int minPlcIdelMin = -1; + int.TryParse(CHANGE_ODL_HOURS, out minOdlDurHours); + int.TryParse(CHANGE_ODL_IDLE_MIN, out minPlcIdelMin); + // controllo parametri validi + if (minOdlDurHours > 0 && minPlcIdelMin >= 0) { - rawDataInizio = callUrl(urlInizioOdlIob, false); - DateTime.TryParse(rawDataInizio, out inizioOdl); - } - else - { - DateTime tmpData = DateTime.Now; - // prendo il + vecchio... - foreach (var item in elencoMulti) - { - fullUrl = $"{urlInizioOdlIob}|{item}"; - rawDataInizio = callUrl(fullUrl, false); - DateTime.TryParse(rawDataInizio, out tmpData); - inizioOdl = (tmpData < inizioOdl) ? tmpData : inizioOdl; - } - } - // verifico se sia scaduto... - if (inizioOdl.AddHours(minOdlDurHours) < adesso) - { - string rawIdle = ""; - int idlePeriod = 0; + // leggo da server inizio ODL... se non multi 1 solo... + DateTime inizioOdl = DateTime.Now; + string rawDataInizio = ""; if (!isMulti) { - // controllo SE sono fermo (spento o in manuale) per il periodo minimo richiesto... - rawIdle = callUrl(urlIdleTime, false); - int.TryParse(rawIdle, out idlePeriod); + rawDataInizio = callUrl(urlInizioOdlIob, false); + DateTime.TryParse(rawDataInizio, out inizioOdl); } else { - int tmpIdle = 0; - // prendo il + grande... + DateTime tmpData = DateTime.Now; + // prendo il + vecchio... foreach (var item in elencoMulti) { - fullUrl = $"{urlIdleTime}|{item}"; - rawIdle = callUrl(fullUrl, false); - int.TryParse(rawIdle, out tmpIdle); - idlePeriod = tmpIdle > idlePeriod ? tmpIdle : idlePeriod; + fullUrl = $"{urlInizioOdlIob}|{item}"; + rawDataInizio = callUrl(fullUrl, false); + DateTime.TryParse(rawDataInizio, out tmpData); + inizioOdl = (tmpData < inizioOdl) ? tmpData : inizioOdl; } } - if (idlePeriod >= minPlcIdelMin) + // verifico se sia scaduto... + if (inizioOdl.AddHours(minOdlDurHours) < adesso) { + string rawIdle = ""; + int idlePeriod = 0; + if (!isMulti) + { + // controllo SE sono fermo (spento o in manuale) per il periodo minimo richiesto... + rawIdle = callUrl(urlIdleTime, false); + int.TryParse(rawIdle, out idlePeriod); + } + else + { + int tmpIdle = 0; + // prendo il + grande... + foreach (var item in elencoMulti) + { + fullUrl = $"{urlIdleTime}|{item}"; + rawIdle = callUrl(fullUrl, false); + int.TryParse(rawIdle, out tmpIdle); + idlePeriod = tmpIdle > idlePeriod ? tmpIdle : idlePeriod; + } + } + if (idlePeriod >= minPlcIdelMin) + { + callChangeODL = true; + } + } + } + } + } + if (callChangeODL) + { #if false /*************************************************** * Descrizione procedura (OK X SIMULATORI...) @@ -3681,31 +3719,10 @@ namespace IOB_WIN_NEXT * - serve NUOVA TABELLA delle macchine LEADER | FOLLOWER (1:n) e gestione da MP/IO * ***************************************************/ - - string rawSplit = ""; - // se multi gestisco il bit delle tavole... - if (!isMulti) - { - // invio chiamata URL x reset ODL su macchina - rawSplit = callUrl(urlForceSplit, false); - fatto = (rawSplit == "OK") ? true : false; - } - else - { - foreach (string item in elencoMulti) - { - // invio chiamata URL x reset ODL su macchina, ATTENZIONE scriviamo | al posto di "#" che in URL sarebbe filtrato... - fullUrl = $"{urlForceSplit}|{item}"; - rawSplit = callUrl(fullUrl, true); - } - fatto = (rawSplit == "OK") ? true : false; - } #endif - fatto = forceSplitOdl(); - lgInfo("Chiamata: processAutoOdl --> forceSplitODL"); - } - } - } + fatto = forceSplitOdl(); + lgInfo("Chiamata: processAutoOdl --> forceSplitODL"); + pzCountResetted = false; } } } diff --git a/IOB-WIN-NEXT/IobOpcUa.cs b/IOB-WIN-NEXT/IobOpcUa.cs index 4d1d17cc..f6bb6bdc 100644 --- a/IOB-WIN-NEXT/IobOpcUa.cs +++ b/IOB-WIN-NEXT/IobOpcUa.cs @@ -116,9 +116,9 @@ namespace IOB_WIN_NEXT } /// - /// Indica se abbia emergenza premuta + /// Indica se abbia emergenza ARMATA (cond normale) /// - protected bool hasEStopTriggered + protected bool hasEStopArmed { get { @@ -279,8 +279,6 @@ namespace IOB_WIN_NEXT { numCondOk++; } - // FIXME DELETEME !!! - lgInfo($"getDataItemValue(item.keyName): {getDataItemValue(item.keyName)} | item.targetValue: {item.targetValue}"); } } if (checkMode == boolCheckMode.AND) @@ -291,16 +289,6 @@ namespace IOB_WIN_NEXT { answ = numCondOk > 0; } - - if (!answ) - { - string outData = ""; - foreach (var item in checkList) - { - outData += $"{item.keyName} "; - }; - lgInfo($"checkMultiCondition | test: {outData} | checkMode: {checkMode} | numCond: {numCond} | numCondOk: {numCondOk}"); - } return answ; } @@ -339,29 +327,32 @@ namespace IOB_WIN_NEXT // variabili RUN... string currRun = getDataItemValue(opcUaParams.keyRunMode); + // salvo running come = working... + isRunning = isWorking; + + // se ho emergenza premuta --> emergenza! + if (hasEStopArmed) + { + B_input += (1 << 7); + } + // se ho emergenza premuta --> emergenza! + if (isWarmUpCoolDown) + { + B_input += (1 << 6); + } + // se ho almeno 1 allarme E NON SONO IN AUTO --> ALARM! + if (hasError) + { + B_input += (1 << 3); + } if (isWorking) { // RUN = LAVORA! B_input += (1 << 1); } - // se ho emergenza premuta --> emergenza! - else if (hasEStopTriggered) + else if (!isReady) { - B_input += (1 << 7); - } - // se ho almeno 1 allarme E NON SONO IN AUTO --> ALARM! - else if (hasError) - { - B_input += (1 << 3); - } - // se ho emergenza premuta --> emergenza! - else if (isWarmUpCoolDown) - { - B_input += (1 << 6); - } - else if (isReady) - { - // se ho run mode != auto --> manual + // se NON ready --> manual B_input += (1 << 4); } @@ -840,6 +831,19 @@ namespace IOB_WIN_NEXT { int newVal = -1; Int32.TryParse(currPzCount, out newVal); + + // gestione decremento contapezzi: viene "messo via" solo SE c'è un effettivo decremento contapezzi... + if (newVal < contapezziPLC) + { + pzCountResetted = true; + } + else if (isRunning) + { + // eliminazione semaforo decremento contapezzi SE aumenta e siamo in lavorazione + pzCountResetted = false; + } + + // salvo nuovo valore contapezziPLC contapezziPLC = newVal > -1 ? newVal : contapezziPLC; } }