Completata bozza (solo stato) della Fape V3/V2, da riunificare con V1... + decodifica allarmi

This commit is contained in:
Samuele Locatelli
2024-11-14 19:32:58 +01:00
parent 7423e919ee
commit f3f03f2ffe
2 changed files with 242 additions and 90 deletions
-13
View File
@@ -723,7 +723,6 @@ namespace IOB_UT_NEXT
#endregion Public Properties
}
/// <summary>
/// Classe gestione configurazione parametri specifici Rest Client da BaseParamConf
/// </summary>
@@ -744,18 +743,6 @@ namespace IOB_UT_NEXT
/// </summary>
public Dictionary<string, CallStruc> CallList { get; set; } = new Dictionary<string, CallStruc>();
#if false
/// <summary>
/// Dizionario "tampone" di variabili da poter reimpiegare in chiamate successive (es token)
/// </summary>
public Dictionary<string, string> TempVars { get; set; } = new Dictionary<string, string>();
/// <summary>
/// Elenco delle chiamate VIETATE (con nota opzionale sul motivo)
/// </summary>
public Dictionary<string, string> CallVeto { get; set; } = new Dictionary<string, string>();
#endif
public class CallStruc
{
/// <summary>
+242 -77
View File
@@ -39,9 +39,16 @@ namespace IOB_WIN_NEXT.IobSiemens
/// <param name="adpConf"></param>
public SiemensFapeV2(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf)
{
lgInfo("NEW IOB SIEMENS versione FAPE v2.0 - 2024+");
string sFapeVers = getOptPar("FAPE_VERS");
if (!string.IsNullOrEmpty(sFapeVers))
{
int.TryParse(sFapeVers, out FapeVers);
}
lgInfo($"NEW IOB SIEMENS versione FAPE v.{FapeVers} - 2024+");
}
private int FapeVers = 1;
#endregion Public Constructors
#region Public Enums
@@ -49,7 +56,7 @@ namespace IOB_WIN_NEXT.IobSiemens
/// <summary>
/// Posizione sequenza ciclo standard punzonatrice
/// </summary>
public enum posizioneSequenza
public enum posSeq2024
{
CICLO_NON_ATTIVO_0 = 0,
CONTROLLO_TIPO_CARICO_5 = 5,
@@ -98,7 +105,18 @@ namespace IOB_WIN_NEXT.IobSiemens
/// <summary>
/// Enum degli stati macchina (B0)
/// </summary>
public enum statoMacchina
public enum mainState
{
ND = 0,
Pronta = 1,
Lavora = 2,
Warning = 3,
Allarme = 4
}
/// <summary>
/// Enum degli stati macchina (B0)
/// </summary>
public enum stMacc2024
{
COMUNICAZIONE_ASSENTE = 0,
EMERGENZA_RIPRISTINATA = 5,
@@ -130,7 +148,7 @@ namespace IOB_WIN_NEXT.IobSiemens
SOVRAPRESSIONE_PUNZONATURA_1 = 210,
OLTRE_QUOTA_MASSIMA_PUNZONATURA_1 = 215,
SOVRAPRESSIONE_PUNZONATURA_2 = 220,
OLTRE_QUOTA_MASSIMA_PUNZONATURA_1_225 = 225,
OLTRE_QUOTA_MASSIMA_PUNZONATURA_2 = 225,
SOVRAPRESSIONE_TRASLAZIONE_CARRO = 230,
TIMEOUT_AVVIO_DRIVE_POMPA_IDRAULICA = 235,
SOVRAPRESSIONE_MOVIMENTO_PUNZONE = 240,
@@ -143,7 +161,7 @@ namespace IOB_WIN_NEXT.IobSiemens
ALLARME_AREA_TRASLAZIONE_NON_LIBERA = 275,
ANOMALIA_SALITA_PUNZONATORE = 301,
ANOMALIA_TRASLAZIONE_CARRO = 303,
ANOMALIA_ARRETRAMENTO_CONTRASTO = 305,
ANOMALIA_ARRETRAMENTO_CONTRASTO_305 = 305,
ANOMALIA_APERTURA_STAFFAGGIO = 307,
ANOMALIA_STAFFAGGIO_PEZZO = 403,
ANOMALIA_POSIZIONE_CONTRASTO = 405,
@@ -161,6 +179,18 @@ namespace IOB_WIN_NEXT.IobSiemens
#region Public Methods
/// <summary>
/// Stato impianto codificato come valore mainState
/// </summary>
protected ushort valMain = 0;
/// <summary>
/// Stato Dettagliato macchina
/// </summary>
protected ushort valStatus = 0;
/// <summary>
/// Posizione corrente ciclo
/// </summary>
protected ushort valPosit = 0;
/// <summary>
/// Recupero dati override in formato dictionary
/// </summary>
@@ -168,12 +198,41 @@ namespace IOB_WIN_NEXT.IobSiemens
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());
ExtractFapeData();
if (FapeVers > 2)
{
outVal.Add("CURR_LAMP", ((stMacc2024)valMain).ToString());
}
outVal.Add("CURR_STATO", ((stMacc2024)valStatus).ToString());
outVal.Add("CURR_POSIT", ((posSeq2024)valPosit).ToString());
return outVal;
}
/// <summary>
/// recupero dati specifici FAPE da struttura array memoria e versione adapter
/// </summary>
private void ExtractFapeData()
{
/* ----------------------------------------------
* NOTA:
* - v1 (2018): 2 blocchi memoria, area DB15
* - v2 (2024): 2 blocchi area DB17
* - v3 (2024): 3 blocchi area DB17 (MacroStato, stato, ciclo)
*
* decodifico secondo conf
* ----------------------------------------------*/
// leggo secondo versione adapter 1/2/3...
if (FapeVers <= 2)
{
valStatus = S7.Net.Types.Word.FromByteArray(RawInput.Skip(0).Take(2).ToArray());
valPosit = S7.Net.Types.Word.FromByteArray(RawInput.Skip(2).Take(2).ToArray());
}
else
{
valMain = S7.Net.Types.Word.FromByteArray(RawInput.Skip(0).Take(2).ToArray());
valStatus = S7.Net.Types.Word.FromByteArray(RawInput.Skip(2).Take(2).ToArray());
valPosit = S7.Net.Types.Word.FromByteArray(RawInput.Skip(4).Take(2).ToArray());
}
}
/// <summary>
/// Effettua processing del recupero delle OVERRIDE (spindle, feedrate, rapid)
@@ -186,6 +245,160 @@ namespace IOB_WIN_NEXT.IobSiemens
#region Protected Methods
/// <summary>
/// Esegue decodificada stati in modalità "classica" (2018)
/// </summary>
/// <returns></returns>
protected void DecodeV1(ref int B_input)
{
// FixMe ToDo: riportare stati 2018 e decodifica relativa...
// Guardo SOLO stato macchina V1 (2018)
stMacc2024 _stMacch = ((stMacc2024)valStatus);
// controllo stato macchina x impostare altri bit...
switch (_stMacch)
{
// emergenza? poweroff?
case stMacc2024.COMUNICAZIONE_ASSENTE:
case stMacc2024.EMERGENZA_RIPRISTINATA:
B_input += (1 << 5);
break;
case stMacc2024.MACCHINA_NON_ATTIVA:
case stMacc2024.MACCHINA_IN_POTENZA:
case stMacc2024.MACCHINA_PRONTA_PER_CICLO_LOCALE:
case stMacc2024.MACCHINA_PRONTA_PER_CICLO_CON_ROBOT:
case stMacc2024.CICLO_RESET_ATTIVO:
B_input = 1;
break;
case stMacc2024.CICLO_AUTOMATICO_LOCALE_ATTIVO:
case stMacc2024.CICLO_AUTOMATICO_CON_ROBOT_ATTIVO:
B_input += (1 << 1);
break;
case stMacc2024.ALLARME_DRIVE_POMPA_IDRAULICA:
case stMacc2024.ALLARME_AREA_TRASLAZIONE_NON_LIBERA:
case stMacc2024.ANOMALIA_ALIMENTAZIONE_PNEUMATICA:
case stMacc2024.ANOMALIA_APERTURA_STAFFAGGIO:
case stMacc2024.ANOMALIA_ARRETRAMENTO_CONTRASTO_305:
case stMacc2024.ANOMALIA_ARRETRAMENTO_CONTRASTO_413:
case stMacc2024.ANOMALIA_DISATTIVAZIONE_DRIVE_POMPA:
case stMacc2024.ANOMALIA_POSIZIONE_CONTRASTO:
case stMacc2024.ANOMALIA_POSIZIONE_PER_CARICO_ROBOT:
case stMacc2024.ANOMALIA_PUNZONATURA_1:
case stMacc2024.ANOMALIA_PUNZONATURA_2:
case stMacc2024.ANOMALIA_SALITA_PUNZONATORE:
case stMacc2024.ANOMALIA_SALITA_STAFFAGGIO:
case stMacc2024.ANOMALIA_STAFFAGGIO_PEZZO:
case stMacc2024.LIVELLO_OLIO_BASSO_LUBRIFICA_CILINDRO:
case stMacc2024.LIVELLO_OLIO_BASSO_LUBRIFICA_PEZZO:
case stMacc2024.SOVRAPRESSIONE_MOVIMENTO_PUNZONE:
case stMacc2024.SOVRAPRESSIONE_PUNZONATURA_1:
case stMacc2024.SOVRAPRESSIONE_PUNZONATURA_2:
case stMacc2024.SOVRAPRESSIONE_TRASLAZIONE_CARRO:
case stMacc2024.TIMEOUT_AVVIO_DRIVE_POMPA_IDRAULICA:
case stMacc2024.TIMEOUT_LUBRIFICAZIONE_CILINDRO:
B_input += (1 << 3);
break;
case stMacc2024.MACCHINA_IN_MANUALE:
case stMacc2024.ATTESA_AREA_TRASLAZIONE_LIBERA:
case stMacc2024.ATTESA_ASSE_PUNZONATURA_ALTO:
case stMacc2024.ATTESA_BARRIERE_LIBERE:
case stMacc2024.ATTESA_BLOCCAGGIO_PEZZO:
case stMacc2024.ATTESA_BLOCCAGGIO_PEZZO_ALTO:
case stMacc2024.ATTESA_BLOCCAGGIO_PORTELLO_ANTERIORE:
case stMacc2024.ATTESA_CARRO_IN_POSIZIONE_1:
case stMacc2024.ATTESA_CHIUSURA_PORTELLO_ROBOT:
case stMacc2024.ATTESA_CONTRASTO_PEZZO_DISINSERITO:
case stMacc2024.ATTESA_RILASCIO_PULSANTE_RESET:
case stMacc2024.ATTESA_ROBOT_FUORI_INGOMBRO:
case stMacc2024.ATTESA_TERMINE_CICLO_RESET:
B_input += (1 << 4);
break;
default:
break;
}
}
/// <summary>
/// Esegue decodificada stati in modalità "v2" (2024) con 2 valori senza macro stato
/// </summary>
/// <returns></returns>
protected void DecodeV2(ref int B_input)
{
// Guardo SOLO stato macchina V2 (2024)
stMacc2024 _stMacch = ((stMacc2024)valStatus);
// controllo stato macchina x impostare altri bit... semplificato sui VALORI interi val status...
// da 00..50 -> pronta NON faccio nulla
if(valStatus < 51)
{
//B_input = 1;
}
// lavora
else if (valStatus >= 51 && valStatus < 100)
{
B_input += (1 << 1);
}
// manuale/warning
else if (valStatus >= 100 && valStatus < 199)
{
B_input += (1 << 3);
}
// allarme
else if (valStatus >= 200)
{
B_input += (1 << 4);
}
// controllo COMUNQUE emergenza premuta...
if (_stMacch == stMacc2024.MACCHINA_NON_ATTIVA)
{
B_input += (1 << 5);
}
}
/// <summary>
/// Esegue decodificada stati in modalità "v3" (2024) con 3 valori guardando SOLO macro stato
/// </summary>
/// <returns></returns>
protected void DecodeV3(ref int B_input)
{
// Guardo SOLO stato MAIN V3 (2024)
mainState _stMain = ((mainState)valMain);
stMacc2024 _stMacch = ((stMacc2024)valStatus);
// controllo stato macchina x impostare altri bit...
switch (_stMain)
{
case mainState.Pronta:
break;
case mainState.Lavora:
B_input += (1 << 1);
break;
case mainState.Warning:
B_input += (1 << 4);
break;
case mainState.Allarme:
B_input += (1 << 3);
break;
case mainState.ND:
default:
break;
}
// controllo COMUNQUE emergenza premuta...
if(_stMacch == stMacc2024.MACCHINA_NON_ATTIVA)
{
B_input += (1 << 5);
}
}
/// <summary>
/// Effettua decodifica aree memoria alla bitmap usata x MAPO
/// </summary>
@@ -194,10 +407,10 @@ namespace IOB_WIN_NEXT.IobSiemens
// 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);
ExtractFapeData();
mainState _stMain = ((mainState)valMain);
stMacc2024 _stMacch = ((stMacc2024)valStatus);
posSeq2024 _posSeq = ((posSeq2024)valPosit);
/* -----------------------------------------------------
* bitmap MAPO - 47
@@ -211,72 +424,24 @@ namespace IOB_WIN_NEXT.IobSiemens
// bit 0 (poweron) imposto a 1 SE connected...
B_input = currPLC.IsConnected ? 1 : 0;
// controllo stato macchina x impostare altri bit...
switch (_stMacch)
// verifico versione decodifica da + recente a + vecchia...
if (FapeVers == 3)
{
// emergenza? poweroff?
case statoMacchina.COMUNICAZIONE_ASSENTE:
case statoMacchina.EMERGENZA_RIPRISTINATA:
B_input += (1 << 5);
break;
case statoMacchina.MACCHINA_NON_ATTIVA:
case statoMacchina.MACCHINA_IN_POTENZA:
case statoMacchina.MACCHINA_PRONTA_PER_CICLO_LOCALE:
case statoMacchina.MACCHINA_PRONTA_PER_CICLO_CON_ROBOT:
case statoMacchina.CICLO_RESET_ATTIVO:
B_input = 1;
break;
case statoMacchina.CICLO_AUTOMATICO_LOCALE_ATTIVO:
case statoMacchina.CICLO_AUTOMATICO_CON_ROBOT_ATTIVO:
B_input += (1 << 1);
break;
case statoMacchina.ALLARME_DRIVE_POMPA_IDRAULICA:
case statoMacchina.ALLARME_AREA_TRASLAZIONE_NON_LIBERA:
case statoMacchina.ANOMALIA_ALIMENTAZIONE_PNEUMATICA:
case statoMacchina.ANOMALIA_APERTURA_STAFFAGGIO:
case statoMacchina.ANOMALIA_ARRETRAMENTO_CONTRASTO:
case statoMacchina.ANOMALIA_ARRETRAMENTO_CONTRASTO_413:
case statoMacchina.ANOMALIA_DISATTIVAZIONE_DRIVE_POMPA:
case statoMacchina.ANOMALIA_POSIZIONE_CONTRASTO:
case statoMacchina.ANOMALIA_POSIZIONE_PER_CARICO_ROBOT:
case statoMacchina.ANOMALIA_PUNZONATURA_1:
case statoMacchina.ANOMALIA_PUNZONATURA_2:
case statoMacchina.ANOMALIA_SALITA_PUNZONATORE:
case statoMacchina.ANOMALIA_SALITA_STAFFAGGIO:
case statoMacchina.ANOMALIA_STAFFAGGIO_PEZZO:
case statoMacchina.LIVELLO_OLIO_BASSO_LUBRIFICA_CILINDRO:
case statoMacchina.LIVELLO_OLIO_BASSO_LUBRIFICA_PEZZO:
case statoMacchina.SOVRAPRESSIONE_MOVIMENTO_PUNZONE:
case statoMacchina.SOVRAPRESSIONE_PUNZONATURA_1:
case statoMacchina.SOVRAPRESSIONE_PUNZONATURA_2:
case statoMacchina.SOVRAPRESSIONE_TRASLAZIONE_CARRO:
case statoMacchina.TIMEOUT_AVVIO_DRIVE_POMPA_IDRAULICA:
case statoMacchina.TIMEOUT_LUBRIFICAZIONE_CILINDRO:
B_input += (1 << 3);
break;
case statoMacchina.MACCHINA_IN_MANUALE:
case statoMacchina.ATTESA_AREA_TRASLAZIONE_LIBERA:
case statoMacchina.ATTESA_ASSE_PUNZONATURA_ALTO:
case statoMacchina.ATTESA_BARRIERE_LIBERE:
case statoMacchina.ATTESA_BLOCCAGGIO_PEZZO:
case statoMacchina.ATTESA_BLOCCAGGIO_PEZZO_ALTO:
case statoMacchina.ATTESA_BLOCCAGGIO_PORTELLO_ANTERIORE:
case statoMacchina.ATTESA_CARRO_IN_POSIZIONE_1:
case statoMacchina.ATTESA_CHIUSURA_PORTELLO_ROBOT:
case statoMacchina.ATTESA_CONTRASTO_PEZZO_DISINSERITO:
case statoMacchina.ATTESA_RILASCIO_PULSANTE_RESET:
case statoMacchina.ATTESA_ROBOT_FUORI_INGOMBRO:
case statoMacchina.ATTESA_TERMINE_CICLO_RESET:
B_input += (1 << 4);
break;
default:
break;
DecodeV3(ref B_input);
}
else if (FapeVers == 2)
{
DecodeV2(ref B_input);
}
else
{
DecodeV1(ref B_input);
}
// FIXME ToDo !!! verificare da qui...
// procedo SOLO SE è enabled IOB
if (IobOnline)