Merge branch 'develop' into IOB-NET

This commit is contained in:
Samuele E. Locatelli
2020-11-30 17:26:29 +01:00
8 changed files with 4018 additions and 3698 deletions
+1042 -960
View File
File diff suppressed because it is too large Load Diff
+7 -2
View File
@@ -167,13 +167,18 @@ namespace IOB_WIN
/// <summary>
/// ODL attualmente sulla macchina
/// </summary>
public Int32 currIdxODL;
public Int32 currIdxODL = 0;
/// <summary>
/// Modo corrente (da classe ENUM)
/// </summary>
public CNC_MODE currMode;
/// <summary>
/// ODL corrente caricato sulla macchina (stringa, da chiamata MP/IO)
/// </summary>
public string currODL = "";
/// <summary>
/// Indica se sia richiesto campionamento memoria PERIODICO
/// </summary>
@@ -908,7 +913,7 @@ namespace IOB_WIN
}
/// <summary>
/// stato Online/Offline della IOB
/// Indica lo stato Online/Offline della IOB
/// </summary>
public bool IobOnline
{
+972 -903
View File
File diff suppressed because it is too large Load Diff
+683 -622
View File
File diff suppressed because it is too large Load Diff
+752 -696
View File
File diff suppressed because it is too large Load Diff
+278 -253
View File
@@ -4,264 +4,289 @@ using System.Linq;
namespace IOB_WIN
{
public class IobSiemensFape : IobSiemens
{
/* --------------------------------------------------------------------------------
* Controlli SIEMENS FAPE (es punzonatrice Tecnomeccanica di LVF)
* - basasto su SIEMENS
* - S7 vers 1200
* - abilitata 1 area in lettura DB15 ed 1 in scrittura DB16 (NON la usano)
* - x poter funzionare --> protezione: meccanismi di collegamento / consenti put/get
* - lettura/scrittura primi 48 byte (240 max x le due DB)
*
* LETTURA seguenti byte:
* - B0, WORD, Stato Macchina Generale
* - B2, WORD, Posizione sequenza contatore
* - B4, WORD, contatore cicli eseguiti per lubrifica
* - B40, DWORD, contapezzi azzerabile da operatore
* - B44, DWORD, contapezzi ASSOLUTO
*
* -------------------------------------------------------------------------------- */
#region area principale adapter
/// <summary>
/// Enum degli stati macchina (B0)
/// </summary>
public enum statoMacchina
public class IobSiemensFape : IobSiemens
{
COMUNICAZIONE_ASSENTE = 0,
EMERGENZA_INSERITA = 1,
AVARIA_ARIA = 2,
AVARIA_PRESSIONE_OLIO = 3,
AVARIA_LIVELLO_OLIO = 4,
AVARIA_TEMPERATURA_OLIO = 5,
AVARIA_MOTORE_POMPA_IDRAULICA = 6,
AVARIA_MOTORE_RAFFREDDO_IDRAULICA = 7,
AVARIA_SINCRONISMO_PORTE = 8,
AVARIA_LIBERA = 9,
ATTIVAZIONE_IN_CORSO = 10,
MODO_MANUALE_ATTREZZAGGIO = 11,
MODO_AUTOMATICO_LOCALE = 12,
MODO_AUTOMATICO_ROBOT = 13,
CICLO_IN_CORSO = 14,
LIBERO = 15
}
/// <summary>
/// Posizione sequenza ciclo standard punzonatrice
/// </summary>
public enum posizioneSequenza
{
CICLO_AUTOMATICO_FERMO = 0,
CONTROLLO_MODO_OPERATIVO = 5,
MODO_ATTIVO_CON_ROBOT = 8,
SBLOCCAGGIO_PEZZO = 10,
APERTURA_PORTELLO_ROBOT = 11,
CONSENSO_ACCESSO_AL_ROBOT = 12,
CARICO_ROBOT_IN_CORSO = 14,
CARICO_ROBOT_CONCLUSO = 16,
CHIUSURA_PORTELLO_ROBOT = 18,
VERIFICA_POSIZIONE_CARRI = 20,
BLOCCAGGIO_PEZZO = 22,
ATTESA_CARRO_A_DESTRA = 24,
DISCESA_RAPIDO_BROCCIATURA = 25,
CICLO_DI_BROCCIATURA = 26,
RITORNO_BROCCIATRICE = 28,
COMANDO_CARRO_A_SINISTRA = 30,
CICLO_DI_ALESATURA = 32,
RITORNO_CARRO_ALESATURA = 34,
COMANDO_CARRO_A_DESTRA = 36,
INCREMENTO_CONTAPEZZI = 38,
CONTROLLO_TIME_OUT_CICLO = 40,
RILANCIO_CICLO_F42 = 42,
ATTESA_FINE_CICLO = 45
}
/* --------------------------------------------------------------------------------
* Controlli SIEMENS FAPE (es punzonatrice Tecnomeccanica di LVF)
* - basasto su SIEMENS
* - S7 vers 1200
* - abilitata 1 area in lettura DB15 ed 1 in scrittura DB16 (NON la usano)
* - x poter funzionare --> protezione: meccanismi di collegamento / consenti put/get
* - lettura/scrittura primi 48 byte (240 max x le due DB)
*
* LETTURA seguenti byte:
* - B0, WORD, Stato Macchina Generale
* - B2, WORD, Posizione sequenza contatore
* - B4, WORD, contatore cicli eseguiti per lubrifica
* - B40, DWORD, contapezzi azzerabile da operatore
* - B44, DWORD, contapezzi ASSOLUTO
*
* -------------------------------------------------------------------------------- */
/// <summary>
/// Classe base con i metodi x Siemens
/// </summary>
/// <param name="caller"></param>
/// <param name="adpConf"></param>
public IobSiemensFape(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf)
{
// dovebbe fare init della classe base, VERIFICARE...
lgInfo("NEW IOB SIEMENS versione FAPE");
}
#region Public Constructors
#endregion
#region Metodi specifici (da verificare/completare in implementazione)
/// <summary>
/// Effettua processing del recupero delle OVERRIDE (spindle, feedrate, rapid)
/// </summary>
public override void processOverride()
{
}
/// <summary>
/// Recupero dati override in formato dictionary
/// </summary>
/// <returns></returns>
public override Dictionary<string, string> getDynData()
{
Dictionary<string, string> outVal = new Dictionary<string, string>();
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());
outVal.Add("CURR_STATO", ((statoMacchina)valStatus).ToString());
outVal.Add("CURR_POSIT", ((posizioneSequenza)valPosit).ToString());
return outVal;
}
/// <summary>
/// Effettua decodifica aree memoria alla bitmap usata x MAPO
/// </summary>
protected override void decodeToBaseBitmap()
{
// 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.AVARIA_ARIA:
case statoMacchina.AVARIA_PRESSIONE_OLIO:
case statoMacchina.AVARIA_LIVELLO_OLIO:
case statoMacchina.AVARIA_TEMPERATURA_OLIO:
B_input += (1 << 3);
B_input += (1 << 6);
break;
case statoMacchina.AVARIA_MOTORE_POMPA_IDRAULICA:
case statoMacchina.AVARIA_MOTORE_RAFFREDDO_IDRAULICA:
case statoMacchina.COMUNICAZIONE_ASSENTE:
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 << 7);
break;
case statoMacchina.LIBERO:
default:
break;
}
string currODL = "";
try
{
currODL = utils.callUrl(urlGetCurrODL);
// solo SE HO un ODL...
if (string.IsNullOrWhiteSpace(currODL) || currODL == "0")
/// <summary>
/// Classe base con i metodi x Siemens
/// </summary>
/// <param name="caller"></param>
/// <param name="adpConf"></param>
public IobSiemensFape(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf)
{
if (periodicLog)
{
lgInfo(string.Format("SiemensFape | Lettura ODL andata a vuoto: currODL: {0}", currODL));
}
// dovebbe fare init della classe base, VERIFICARE...
lgInfo("NEW IOB SIEMENS versione FAPE");
}
else
{
// se variato o scaduto timeout log...
if (periodicLog || (currIdxODL.ToString() != currODL))
{
lgInfo(string.Format("SiemensFape | Lettura ODL, currODL: {0} --> currIdxODL prec: {1}", currODL, currIdxODL));
}
// 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 (!string.IsNullOrWhiteSpace(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))
{
// se sono differenti MOSTRO...
if (contapezziPLC != contapezziIOB)
{
// registro contapezzi
lgInfo($"Differenza Contapezzi: contapezziPLC: {contapezziPLC} | contapezziIOB {contapezziIOB}");
}
// verifico se variato contapezzi... e se passato ritardo minimo...
if (contapezziPLC > contapezziIOB)
{
// salvo nuovo contapezzi (incremento di 1...) + richiesta refresh conteggio
contapezziIOB++;
needRefreshPzCount = true;
// salvo in semaforo!
B_input += (1 << 2);
// registro contapezzi
lgInfo($"contapezziPLC SIEMENS: {contapezziPLC} | contapezziIOB {contapezziIOB}");
}
// invio a server contapezzi (aggiornato)
string retVal = utils.callUrl(urlSetPzCount + contapezziIOB.ToString());
// verifica se tutto OK
if (retVal != contapezziIOB.ToString())
{
// errore salvataggio contapezzi
lgInfo($"Errore salvataggio Contapezzi SIEMENS: contapezziPLC {contapezziPLC} | contapezziIOB {contapezziIOB} | risposta: {retVal}");
// rileggo il counter pezzi da server
pzCntReload(true);
}
// resetto timer...
lastPzCountSend = DateTime.Now;
}
}
else
{
if (DateTime.Now >= lastPzCountSend.AddMilliseconds(pzCountDelay))
{
lgInfo($"Attenzione: mancanza ODL non procedo con gestione contapezzi. contapezziPLC SIEMENS {contapezziPLC} | contapezziIOB {contapezziIOB}");
// resetto timer...
lastPzCountSend = DateTime.Now;
}
}
#endregion Public Constructors
// log opzionale!
if (verboseLog)
{
lgInfo(string.Format("Trasformazione B_input: {0}", B_input));
}
#region Public Enums
/// <summary>
/// Posizione sequenza ciclo standard punzonatrice
/// </summary>
public enum posizioneSequenza
{
CICLO_AUTOMATICO_FERMO = 0,
CONTROLLO_MODO_OPERATIVO = 5,
MODO_ATTIVO_CON_ROBOT = 8,
SBLOCCAGGIO_PEZZO = 10,
APERTURA_PORTELLO_ROBOT = 11,
CONSENSO_ACCESSO_AL_ROBOT = 12,
CARICO_ROBOT_IN_CORSO = 14,
CARICO_ROBOT_CONCLUSO = 16,
CHIUSURA_PORTELLO_ROBOT = 18,
VERIFICA_POSIZIONE_CARRI = 20,
BLOCCAGGIO_PEZZO = 22,
ATTESA_CARRO_A_DESTRA = 24,
DISCESA_RAPIDO_BROCCIATURA = 25,
CICLO_DI_BROCCIATURA = 26,
RITORNO_BROCCIATRICE = 28,
COMANDO_CARRO_A_SINISTRA = 30,
CICLO_DI_ALESATURA = 32,
RITORNO_CARRO_ALESATURA = 34,
COMANDO_CARRO_A_DESTRA = 36,
INCREMENTO_CONTAPEZZI = 38,
CONTROLLO_TIME_OUT_CICLO = 40,
RILANCIO_CICLO_F42 = 42,
ATTESA_FINE_CICLO = 45
}
/// <summary>
/// Enum degli stati macchina (B0)
/// </summary>
public enum statoMacchina
{
COMUNICAZIONE_ASSENTE = 0,
EMERGENZA_INSERITA = 1,
AVARIA_ARIA = 2,
AVARIA_PRESSIONE_OLIO = 3,
AVARIA_LIVELLO_OLIO = 4,
AVARIA_TEMPERATURA_OLIO = 5,
AVARIA_MOTORE_POMPA_IDRAULICA = 6,
AVARIA_MOTORE_RAFFREDDO_IDRAULICA = 7,
AVARIA_SINCRONISMO_PORTE = 8,
AVARIA_LIBERA = 9,
ATTIVAZIONE_IN_CORSO = 10,
MODO_MANUALE_ATTREZZAGGIO = 11,
MODO_AUTOMATICO_LOCALE = 12,
MODO_AUTOMATICO_ROBOT = 13,
CICLO_IN_CORSO = 14,
LIBERO = 15
}
#endregion Public Enums
#region Protected Methods
/// <summary>
/// Effettua decodifica aree memoria alla bitmap usata x MAPO
/// </summary>
protected override void decodeToBaseBitmap()
{
// 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.AVARIA_ARIA:
case statoMacchina.AVARIA_PRESSIONE_OLIO:
case statoMacchina.AVARIA_LIVELLO_OLIO:
case statoMacchina.AVARIA_TEMPERATURA_OLIO:
B_input += (1 << 3);
B_input += (1 << 6);
break;
case statoMacchina.AVARIA_MOTORE_POMPA_IDRAULICA:
case statoMacchina.AVARIA_MOTORE_RAFFREDDO_IDRAULICA:
case statoMacchina.COMUNICAZIONE_ASSENTE:
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 << 7);
break;
case statoMacchina.LIBERO:
default:
break;
}
// procedo SOLO SE è enabled IOB
if (IobOnline)
{
try
{
currODL = utils.callUrl(urlGetCurrODL);
// solo SE HO un ODL...
if (string.IsNullOrWhiteSpace(currODL) || currODL == "0")
{
if (periodicLog)
{
lgInfo(string.Format("SiemensFape | Lettura ODL andata a vuoto: currODL: {0}", currODL));
}
}
else
{
// se variato o scaduto timeout log...
if (periodicLog || (currIdxODL.ToString() != currODL))
{
lgInfo(string.Format("SiemensFape | Lettura ODL, currODL: {0} --> currIdxODL prec: {1}", currODL, currIdxODL));
}
// 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;
}
}
}
else
{
// imposto currODL a vuoto!
currODL = "";
if (periodicLog)
{
lgInfo($"Fanuc | Lettura ODL non effettuata: IobOnline: {IobOnline} | currODL impostato a vuoto");
}
}
if (!string.IsNullOrWhiteSpace(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))
{
// se sono differenti MOSTRO...
if (contapezziPLC != contapezziIOB)
{
// registro contapezzi
lgInfo($"Differenza Contapezzi: contapezziPLC: {contapezziPLC} | contapezziIOB {contapezziIOB}");
}
// verifico se variato contapezzi... e se passato ritardo minimo...
if (contapezziPLC > contapezziIOB)
{
// salvo nuovo contapezzi (incremento di 1...) + richiesta refresh conteggio
contapezziIOB++;
needRefreshPzCount = true;
// salvo in semaforo!
B_input += (1 << 2);
// registro contapezzi
lgInfo($"contapezziPLC SIEMENS: {contapezziPLC} | contapezziIOB {contapezziIOB}");
}
// invio a server contapezzi (aggiornato)
string retVal = utils.callUrl(urlSetPzCount + contapezziIOB.ToString());
// verifica se tutto OK
if (retVal != contapezziIOB.ToString())
{
// errore salvataggio contapezzi
lgInfo($"Errore salvataggio Contapezzi SIEMENS: contapezziPLC {contapezziPLC} | contapezziIOB {contapezziIOB} | risposta: {retVal}");
// rileggo il counter pezzi da server
pzCntReload(true);
}
// resetto timer...
lastPzCountSend = DateTime.Now;
}
}
else
{
if (DateTime.Now >= lastPzCountSend.AddMilliseconds(pzCountDelay))
{
lgInfo($"Attenzione: mancanza ODL non procedo con gestione contapezzi. contapezziPLC SIEMENS {contapezziPLC} | contapezziIOB {contapezziIOB}");
// resetto timer...
lastPzCountSend = DateTime.Now;
}
}
// log opzionale!
if (verboseLog)
{
lgInfo(string.Format("Trasformazione B_input: {0}", B_input));
}
}
#endregion Protected Methods
#region Public Methods
/// <summary>
/// Recupero dati override in formato dictionary
/// </summary>
/// <returns></returns>
public override Dictionary<string, string> getDynData()
{
Dictionary<string, string> outVal = new Dictionary<string, string>();
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());
outVal.Add("CURR_STATO", ((statoMacchina)valStatus).ToString());
outVal.Add("CURR_POSIT", ((posizioneSequenza)valPosit).ToString());
return outVal;
}
/// <summary>
/// Effettua processing del recupero delle OVERRIDE (spindle, feedrate, rapid)
/// </summary>
public override void processOverride()
{
}
#endregion Public Methods
}
#endregion
}
}
}
+283 -260
View File
@@ -8,15 +8,16 @@ namespace IOB_WIN
{
public class IobSiemensTorri : IobSiemens
{
/* --------------------------------------------------------------------------------
/* --------------------------------------------------------------------------------
* Controlli SIEMENS TORRI
* - basasto su SIEMENS
* - S7 vers 1200
*
*
* mod: 2019.01.19: aggiunta gestione segnale test/accensione/spegnimento (DB700.B1.4) --> mod StateMachine!
* mod: 2019.04.06: aggiunta indicazione (IOB--> PLC) di stato setup su DB701.B0.4
* -------------------------------------------------------------------------------- */
#region Public Constructors
/// <summary>
/// estende l'init della classe base con i metodi x Siemens specifici x Torri
@@ -28,6 +29,183 @@ namespace IOB_WIN
// dovebbe fare init della classe base, VERIFICARE...
lgInfo("NEW IOB SIEMENS versione TORRI");
}
#endregion Public Constructors
#region Protected Methods
/// <summary>
/// Decodifica il resto dell'area TORRI x i dati accessori (allarmi, ...)
/// </summary>
protected override void decodeOtherData()
{
if (verboseLog)
{
}
}
/// <summary>
/// Effettua decodifica aree memoria alla bitmap usata x MAPO
/// </summary>
protected override void decodeToBaseBitmap()
{
// init a zero...
B_input = 0;
// TORRI: leggo i primi 8 bit hard coded...
int byteSem = RawInput[0];
// azzero powerOn...
byteSem &= ~(1 << 0);
// bit 0 (powerOn) imposto a 1 SE connected...
if (currPLC.IsConnected)
{
byteSem += (1 << 0);
}
// azzero i bit NON gestiti (2-5-6-7)
byteSem &= ~(1 << 2);
byteSem &= ~(1 << 5);
byteSem &= ~(1 << 6);
byteSem &= ~(1 << 7);
// leggo bit DB700.B1.4 e lo porto al bit 5 --> ciclo test/accensione/spegnimento
if ((RawInput[1] & (1 << 4)) != 0) //se RawInput[1] & 16-- > 5° bit-- > TEST
{
byteSem += (1 << 5);
}
// salvo infine variabile bit x invio
B_input = byteSem;
// procedo SOLO SE è enabled IOB
if (IobOnline)
{
try
{
currODL = utils.callUrl(urlGetCurrODL);
// solo SE HO un ODL...
if (string.IsNullOrEmpty(currODL) || currODL == "0")
{
if (periodicLog)
{
lgInfo($"SiemensTorri | Lettura ODL andata a vuoto: currODL: {currODL}");
}
}
else
{
// se variato o scaduto timeout log...
if (periodicLog || (currIdxODL.ToString() != currODL))
{
lgInfo($"SiemensTorri | Lettura ODL, currODL: {currODL} --> currIdxODL prec: {currIdxODL}");
}
// 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: {urlGetCurrODL}");
lastWarnODL = DateTime.Now;
}
}
}
else
{
// imposto currODL a vuoto!
currODL = "";
if (periodicLog)
{
lgInfo($"Fanuc | Lettura ODL non effettuata: IobOnline: {IobOnline} | currODL impostato a vuoto");
}
}
if (!string.IsNullOrEmpty(currODL) && currODL != "0")
{
// ora processo il contapezzi...
string retVal = "";
// controllo se è passato intervallo minimo tra 2 controlli/elaborazioni x distanziare invio e ridurre letture
if (DateTime.Now >= lastPzCountSend.AddMilliseconds(pzCountDelay))
{
// Salvo il contapezzi della macchina
retVal = utils.callUrlNow(urlSetPzCountMAC + contapezziPLC.ToString());
// verifica se tutto OK, ovvero conferma i pezzi inviati
if (retVal != contapezziPLC.ToString())
{
// errore salvataggio contapezzi
lgInfo($"Errore salvataggio Contapezzi PLC SIEMENST-TORRI: {contapezziPLC} | contapezziIOB {contapezziIOB} | Valore tornato: {retVal}");
// rileggo il counter pezzi da server
pzCntReload(true);
}
// se sono differenti MOSTRO...
if (contapezziPLC != contapezziIOB)
{
// registro contapezzi
lgInfo($"Differenza Contapezzi: contapezziPLC: {contapezziPLC} | contapezziIOB: {contapezziIOB}");
}
if ((contapezziPLC > contapezziIOB))
{
// salvo nuovo contapezzi (incremento di 1...) + richiesta refresh conteggio
contapezziIOB++;
needRefreshPzCount = true;
// salvo in semaforo!
B_input += 1 << 2;
// registro contapezzi
lgInfo($"contapezziPLC SIEMENST-TORRI: {contapezziPLC} | contapezziIOB {contapezziIOB}");
}
// Salvo il contapezzi della macchina
retVal = utils.callUrlNow(urlSetPzCount + contapezziIOB.ToString());
// verifica se tutto OK, ovvero conferma i pezzi inviati
if (retVal != contapezziIOB.ToString())
{
// errore salvataggio contapezzi
lgInfo($"Errore salvataggio contapezziPLC SIEMENST-TORRI: {contapezziPLC} | contapezziIOB {contapezziIOB} | Valore tornato: {retVal}");
// rileggo il counter pezzi da server
pzCntReload(true);
}
// verifico se variato contapezzi... e se passato ritardo minimo...
if ((contapezziPLC - contapezziIOB) > minSendPzCountBlock)
{
trySendPzCountBlock();
}
// invio a server contapezzi (aggiornato)
retVal = utils.callUrlNow(urlSetPzCount + contapezziIOB.ToString());
// verifica se tutto OK
if (retVal != contapezziIOB.ToString())
{
// errore salvataggio contapezzi
lgInfo($"Errore salvataggio Contapezzi SIEMENS-TORRI: contapezziPLC {contapezziPLC} | contapezziIOB {contapezziIOB} | risposta: {retVal}");
// rileggo il counter pezzi da server
pzCntReload(true);
}
// resetto timer...
lastPzCountSend = DateTime.Now;
}
}
else
{
if (DateTime.Now >= lastPzCountSend.AddMilliseconds(pzCountDelay))
{
lgInfo($"Attenzione: mancanza ODL non procedo con gestione contapezzi. contapezziPLC SIEMENST-TORRI: {contapezziPLC} | contapezziIOB: {contapezziIOB}");
// resetto timer...
lastPzCountSend = DateTime.Now;
}
}
// log opzionale!
if (verboseLog)
{
lgInfo("Trasformazione B_input: {B_input}");
}
}
#endregion Protected Methods
#region Public Methods
/// <summary>
/// Processo i task richiesti e li elimino dalla coda 1:1
/// </summary>
@@ -63,19 +241,23 @@ namespace IOB_WIN
taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | SKIPPED | NO EXEC";
lgInfo($"Chiamata senza processing: taskOk: {taskOk} | taskVal: {taskVal}");
break;
case taskType.fixStopSetup:
taskVal = "VALUE DB701.0.4 --> 0";
lgInfo($"Chiamata fixStopSetup: taskOk: {taskOk} | taskVal: {taskVal}");
break;
case taskType.startSetup:
MemBlock[0] += (1 << 4);
taskVal = "VALUE DB701.0.4 --> 1";
lgInfo($"Chiamata startSetup: taskOk: {taskOk} | taskVal: {taskVal}");
break;
case taskType.stopSetup:
taskVal = "VALUE DB701.0.4 --> 0";
lgInfo($"Chiamata stopSetup: taskOk: {taskOk} | taskVal: {taskVal}");
break;
default:
taskVal = "SKIPPED | NO EXEC";
lgInfo($"Chiamata default senza processing: taskOk: {taskOk} | taskVal: {taskVal}");
@@ -89,269 +271,24 @@ namespace IOB_WIN
return taskDone;
}
#region da verificare
/// <summary>
/// Recupero dati override in formato dictionary
/// Recupera ULTIMO allarme...
/// </summary>
/// <returns></returns>
public override Dictionary<string, string> getOverrides()
{
Dictionary<string, string> outVal = new Dictionary<string, string>();
uint valDW = 0;
// !!!FARE!!! recuperare da conf memoria, ora HARD CODED
outVal.Add("FEED_OVER", RawInput[19].ToString());
outVal.Add("RAPID_OVER", RawInput[20].ToString());
outVal.Add("CURR_MODE", decodeCurrMode(RawInput[21]));
// recupero RPM pezzo/mola !!!FARE!!! cambio nome da config, qui sono 01:conduttrice e 02:operatrice (3013), mentre sono pezzo/mola nella V100
valDW = S7.Net.Types.DWord.FromByteArray(RawInput.Skip(24).Take(4).ToArray());
outVal.Add("RPM_01", valDW.ToString());
valDW = S7.Net.Types.DWord.FromByteArray(RawInput.Skip(28).Take(4).ToArray());
outVal.Add("RPM_02", valDW.ToString());
return outVal;
}
/// <summary>
/// Decodifica il resto dell'area TORRI x i dati accessori (allarmi, ...)
/// </summary>
protected override void decodeOtherData()
{
if (verboseLog)
{
}
}
/// <summary>
/// Effettua decodifica aree memoria alla bitmap usata x MAPO
/// </summary>
protected override void decodeToBaseBitmap()
{
// init a zero...
B_input = 0;
// TORRI: leggo i primi 8 bit hard coded...
int byteSem = RawInput[0];
// azzero powerOn...
byteSem &= ~(1 << 0);
// bit 0 (powerOn) imposto a 1 SE connected...
if (currPLC.IsConnected)
{
byteSem += (1 << 0);
}
// azzero i bit NON gestiti (2-5-6-7)
byteSem &= ~(1 << 2);
byteSem &= ~(1 << 5);
byteSem &= ~(1 << 6);
byteSem &= ~(1 << 7);
// leggo bit DB700.B1.4 e lo porto al bit 5 --> ciclo test/accensione/spegnimento
if ((RawInput[1] & (1 << 4)) != 0) //se RawInput[1] & 16-- > 5° bit-- > TEST
{
byteSem += (1 << 5);
}
// salvo infine variabile bit x invio
B_input = byteSem;
string currODL = "";
try
{
currODL = utils.callUrl(urlGetCurrODL);
// solo SE HO un ODL...
if (string.IsNullOrEmpty(currODL) || currODL == "0")
{
if (periodicLog)
{
lgInfo($"SiemensTorri | Lettura ODL andata a vuoto: currODL: {currODL}");
}
}
else
{
// se variato o scaduto timeout log...
if (periodicLog || (currIdxODL.ToString() != currODL))
{
lgInfo($"SiemensTorri | Lettura ODL, currODL: {currODL} --> currIdxODL prec: {currIdxODL}");
}
// 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: {urlGetCurrODL}");
lastWarnODL = DateTime.Now;
}
}
if (!string.IsNullOrEmpty(currODL) && currODL != "0")
{
// ora processo il contapezzi...
string retVal = "";
// controllo se è passato intervallo minimo tra 2 controlli/elaborazioni x distanziare invio e ridurre letture
if (DateTime.Now >= lastPzCountSend.AddMilliseconds(pzCountDelay))
{
// Salvo il contapezzi della macchina
retVal = utils.callUrlNow(urlSetPzCountMAC + contapezziPLC.ToString());
// verifica se tutto OK, ovvero conferma i pezzi inviati
if (retVal != contapezziPLC.ToString())
{
// errore salvataggio contapezzi
lgInfo($"Errore salvataggio Contapezzi PLC SIEMENST-TORRI: {contapezziPLC} | contapezziIOB {contapezziIOB} | Valore tornato: {retVal}");
// rileggo il counter pezzi da server
pzCntReload(true);
}
// se sono differenti MOSTRO...
if (contapezziPLC != contapezziIOB)
{
// registro contapezzi
lgInfo($"Differenza Contapezzi: contapezziPLC: {contapezziPLC} | contapezziIOB: {contapezziIOB}");
}
if ((contapezziPLC > contapezziIOB))
{
// salvo nuovo contapezzi (incremento di 1...) + richiesta refresh conteggio
contapezziIOB++;
needRefreshPzCount = true;
// salvo in semaforo!
B_input += 1 << 2;
// registro contapezzi
lgInfo($"contapezziPLC SIEMENST-TORRI: {contapezziPLC} | contapezziIOB {contapezziIOB}");
}
// Salvo il contapezzi della macchina
retVal = utils.callUrlNow(urlSetPzCount + contapezziIOB.ToString());
// verifica se tutto OK, ovvero conferma i pezzi inviati
if (retVal != contapezziIOB.ToString())
{
// errore salvataggio contapezzi
lgInfo($"Errore salvataggio contapezziPLC SIEMENST-TORRI: {contapezziPLC} | contapezziIOB {contapezziIOB} | Valore tornato: {retVal}");
// rileggo il counter pezzi da server
pzCntReload(true);
}
// verifico se variato contapezzi... e se passato ritardo minimo...
if ((contapezziPLC - contapezziIOB) > minSendPzCountBlock)
{
trySendPzCountBlock();
}
// invio a server contapezzi (aggiornato)
retVal = utils.callUrlNow(urlSetPzCount + contapezziIOB.ToString());
// verifica se tutto OK
if (retVal != contapezziIOB.ToString())
{
// errore salvataggio contapezzi
lgInfo($"Errore salvataggio Contapezzi SIEMENS-TORRI: contapezziPLC {contapezziPLC} | contapezziIOB {contapezziIOB} | risposta: {retVal}");
// rileggo il counter pezzi da server
pzCntReload(true);
}
// resetto timer...
lastPzCountSend = DateTime.Now;
}
}
else
{
if (DateTime.Now >= lastPzCountSend.AddMilliseconds(pzCountDelay))
{
lgInfo($"Attenzione: mancanza ODL non procedo con gestione contapezzi. contapezziPLC SIEMENST-TORRI: {contapezziPLC} | contapezziIOB: {contapezziIOB}");
// resetto timer...
lastPzCountSend = DateTime.Now;
}
}
// log opzionale!
if (verboseLog)
{
lgInfo("Trasformazione B_input: {B_input}");
}
}
/// <summary>
/// Recupero programma in lavorazione
/// </summary>
/// <returns></returns>
public override string getPrgName()
{
string prgName = "";
#if false
// recupero NUOVO prgName...
try
{
// recupero nome programma MAIN
prgName = utils.purgedChar2String(FANUC_ref.getPrgNameMain());
// trimmo path del programma, ovvero "CNCMEMUSERPATH1"
prgName = prgName.Replace(utils.CRS("basePrgMemPath"), "");
}
catch (Exception exc)
{
lgError(string.Format("Eccezione in recupero PRG NAME MAIN:{0}{1}", Environment.NewLine, exc));
}
#endif
return prgName;
}
/// <summary>
/// Recupero programma in lavorazione come Dictionary FANUC...
/// - SYSINFO: (prima KEY globale) TUTTI i valori separati da # (x fare check modifica)
/// - altre stringhe: ogni singolo parametro / valore
/// </summary>
/// <returns></returns>
public override Dictionary<string, string> getSysInfo()
public override Dictionary<string, string> getCncAlarms()
{
Dictionary<string, string> outVal = new Dictionary<string, string>();
try
{
outVal.Add("CPU", currPLC.CPU.ToString());
outVal.Add("MAX_PDU", currPLC.MaxPDUSize.ToString());
outVal.Add("RACK", currPLC.Rack.ToString());
outVal.Add("SLOT", currPLC.Slot.ToString());
string almMsg = string.Format("{0} | {1}", currPLC.LastErrorCode.ToString(), currPLC.LastErrorString);
outVal.Add("CNC_ALARM", almMsg);
}
catch (Exception exc)
{
lgError(exc, "Errore in getSysInfo");
lgError(exc, "Errore in getCncAlarms");
}
return outVal;
}
/// <summary>
/// Esegue processing MODE (e nel contempo recupera altri dati dell'area G)
/// </summary>
public override void processMode()
{
if (utils.CRB("enableMode"))
{
#if false
try
{
inizio = DateTime.Now;
// leggo tutto da 0 a 43...
int memIndex = 0;
FanucMemRW(R, FANUC.MemType.G, memIndex, ref MemBlockG);
if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-G-AREA", MemBlockG.Length), DateTime.Now.Subtract(inizio).Ticks);
// verifico modo con valore corrente, se cambia aggiorno...
CNC_MODE newMode = decodeG43(MemBlockG[43]);
if (newMode != currMode)
{
// aggiorno!
currMode = newMode;
// conversione NUM MODE in descrizione da ENUM
string descrMode = Enum.GetName(typeof(CNC_MODE), currMode);
// accodo x invio
string sVal = string.Format("[CNC_MODE]{0}", descrMode);
// chiamo accodamento...
accodaFLog(sVal, qEncodeFLog("CNC_MODE", descrMode));
}
}
catch (Exception exc)
{
lgError(exc, "Errore in process Mode G43");
}
#endif
}
}
/// <summary>
/// Recupero dati dinamici...
@@ -393,29 +330,115 @@ namespace IOB_WIN
catch (Exception exc)
{
lgError(exc, "Errore in getDynData");
}
}
#endif
return outVal;
}
/// <summary>
/// Recupera ULTIMO allarme...
/// Recupero dati override in formato dictionary
/// </summary>
/// <returns></returns>
public override Dictionary<string, string> getCncAlarms()
public override Dictionary<string, string> getOverrides()
{
Dictionary<string, string> outVal = new Dictionary<string, string>();
uint valDW = 0;
// !!!FARE!!! recuperare da conf memoria, ora HARD CODED
outVal.Add("FEED_OVER", RawInput[19].ToString());
outVal.Add("RAPID_OVER", RawInput[20].ToString());
outVal.Add("CURR_MODE", decodeCurrMode(RawInput[21]));
// recupero RPM pezzo/mola !!!FARE!!! cambio nome da config, qui sono 01:conduttrice e 02:operatrice (3013), mentre sono pezzo/mola nella V100
valDW = S7.Net.Types.DWord.FromByteArray(RawInput.Skip(24).Take(4).ToArray());
outVal.Add("RPM_01", valDW.ToString());
valDW = S7.Net.Types.DWord.FromByteArray(RawInput.Skip(28).Take(4).ToArray());
outVal.Add("RPM_02", valDW.ToString());
return outVal;
}
/// <summary>
/// Recupero programma in lavorazione
/// </summary>
/// <returns></returns>
public override string getPrgName()
{
string prgName = "";
#if false
// recupero NUOVO prgName...
try
{
// recupero nome programma MAIN
prgName = utils.purgedChar2String(FANUC_ref.getPrgNameMain());
// trimmo path del programma, ovvero "CNCMEMUSERPATH1"
prgName = prgName.Replace(utils.CRS("basePrgMemPath"), "");
}
catch (Exception exc)
{
lgError(string.Format("Eccezione in recupero PRG NAME MAIN:{0}{1}", Environment.NewLine, exc));
}
#endif
return prgName;
}
/// <summary>
/// Recupero programma in lavorazione come Dictionary FANUC...
/// - SYSINFO: (prima KEY globale) TUTTI i valori separati da # (x fare check modifica)
/// - altre stringhe: ogni singolo parametro / valore
/// </summary>
/// <returns></returns>
public override Dictionary<string, string> getSysInfo()
{
Dictionary<string, string> outVal = new Dictionary<string, string>();
try
{
string almMsg = string.Format("{0} | {1}", currPLC.LastErrorCode.ToString(), currPLC.LastErrorString);
outVal.Add("CNC_ALARM", almMsg);
outVal.Add("CPU", currPLC.CPU.ToString());
outVal.Add("MAX_PDU", currPLC.MaxPDUSize.ToString());
outVal.Add("RACK", currPLC.Rack.ToString());
outVal.Add("SLOT", currPLC.Slot.ToString());
}
catch (Exception exc)
{
lgError(exc, "Errore in getCncAlarms");
lgError(exc, "Errore in getSysInfo");
}
return outVal;
}
/// <summary>
/// Esegue processing MODE (e nel contempo recupera altri dati dell'area G)
/// </summary>
public override void processMode()
{
if (utils.CRB("enableMode"))
{
#if false
try
{
inizio = DateTime.Now;
// leggo tutto da 0 a 43...
int memIndex = 0;
FanucMemRW(R, FANUC.MemType.G, memIndex, ref MemBlockG);
if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-G-AREA", MemBlockG.Length), DateTime.Now.Subtract(inizio).Ticks);
// verifico modo con valore corrente, se cambia aggiorno...
CNC_MODE newMode = decodeG43(MemBlockG[43]);
if (newMode != currMode)
{
// aggiorno!
currMode = newMode;
// conversione NUM MODE in descrizione da ENUM
string descrMode = Enum.GetName(typeof(CNC_MODE), currMode);
// accodo x invio
string sVal = string.Format("[CNC_MODE]{0}", descrMode);
// chiamo accodamento...
accodaFLog(sVal, qEncodeFLog("CNC_MODE", descrMode));
}
}
catch (Exception exc)
{
lgError(exc, "Errore in process Mode G43");
}
#endif
}
}
/// <summary>
/// Override salvataggio valori in memoria...
/// </summary>
@@ -424,6 +447,6 @@ namespace IOB_WIN
{
}
#endregion
#endregion Public Methods
}
}
}
Vendored
+1 -2
View File
@@ -9,7 +9,7 @@ pipeline {
steps {
/* calcolo numero versione... diverso x branch MASTER/DEVELOP */
script {
withEnv(['NEXT_BUILD_NUMBER=750']) {
withEnv(['NEXT_BUILD_NUMBER=751']) {
// env.versionNumber = VersionNumber(versionNumberString : '3.4.${BUILD_DATE_FORMATTED, "yyMM"}.${BUILDS_ALL_TIME}', projectStartDate : '2006-01-01', skipFailedBuilds: true)
env.versionNumber = VersionNumber(versionNumberString : '3.4.${BUILD_DATE_FORMATTED, "yyMM"}.${BUILDS_ALL_TIME}', projectStartDate : '2006-01-01', skipFailedBuilds: true, overrideBuildsAllTime: '${NEXT_BUILD_NUMBER}')
env.APP_NAME = 'MAPO-IOB-WIN'
@@ -24,7 +24,6 @@ pipeline {
currentBuild.description = "TEST ${env.versionNumber}"
}
}
/* CAMBIO numero versione in file sorgente!!! */
bat "e:\\fart.exe VersGen\\VersGen.cs 1.0.0.0 ${env.versionNumber} || EXIT /B 0"
}