GEstione reset ODL alternativa

This commit is contained in:
Samuele Locatelli
2021-05-06 18:26:55 +02:00
parent cfb5c47fd8
commit b8908b9c28
2 changed files with 120 additions and 99 deletions
+85 -68
View File
@@ -562,6 +562,11 @@ namespace IOB_WIN_NEXT
}
}
/// <summary>
/// Variabile di appoggio GLOBALE x indicare macchina RUN (es x gestione su reset pezzi)
/// </summary>
protected bool isRunning { get; set; } = false;
/// <summary>
/// Valore limite MASSIMO di invio di dati come array Json
/// </summary>
@@ -607,6 +612,11 @@ namespace IOB_WIN_NEXT
/// </summary>
protected int numSim { get; set; }
/// <summary>
/// Indica se sia stato resettato un contapezzi
/// </summary>
protected bool pzCountResetted { get; set; } = false;
/// <summary>
/// Fornisce il valore letto da BITMAP in formato valido x messa in coda nel formato dtEve#value#cont
/// </summary>
@@ -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;
}
}
}
+35 -31
View File
@@ -116,9 +116,9 @@ namespace IOB_WIN_NEXT
}
/// <summary>
/// Indica se abbia emergenza premuta
/// Indica se abbia emergenza ARMATA (cond normale)
/// </summary>
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;
}
}