From f3f03f2ffe33b5a474d538f02c13cd0a1c976bcf Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Thu, 14 Nov 2024 19:32:58 +0100 Subject: [PATCH] Completata bozza (solo stato) della Fape V3/V2, da riunificare con V1... + decodifica allarmi --- IOB-UT-NEXT/ToMapo.cs | 13 - IOB-WIN-NEXT/IobSiemens/SiemensFapeV2.cs | 319 +++++++++++++++++------ 2 files changed, 242 insertions(+), 90 deletions(-) diff --git a/IOB-UT-NEXT/ToMapo.cs b/IOB-UT-NEXT/ToMapo.cs index a3909105..818341e4 100644 --- a/IOB-UT-NEXT/ToMapo.cs +++ b/IOB-UT-NEXT/ToMapo.cs @@ -723,7 +723,6 @@ namespace IOB_UT_NEXT #endregion Public Properties } - /// /// Classe gestione configurazione parametri specifici Rest Client da BaseParamConf /// @@ -744,18 +743,6 @@ namespace IOB_UT_NEXT /// public Dictionary CallList { get; set; } = new Dictionary(); -#if false - /// - /// Dizionario "tampone" di variabili da poter reimpiegare in chiamate successive (es token) - /// - public Dictionary TempVars { get; set; } = new Dictionary(); - - /// - /// Elenco delle chiamate VIETATE (con nota opzionale sul motivo) - /// - public Dictionary CallVeto { get; set; } = new Dictionary(); -#endif - public class CallStruc { /// diff --git a/IOB-WIN-NEXT/IobSiemens/SiemensFapeV2.cs b/IOB-WIN-NEXT/IobSiemens/SiemensFapeV2.cs index 50f09ea3..0d5844d6 100644 --- a/IOB-WIN-NEXT/IobSiemens/SiemensFapeV2.cs +++ b/IOB-WIN-NEXT/IobSiemens/SiemensFapeV2.cs @@ -39,9 +39,16 @@ namespace IOB_WIN_NEXT.IobSiemens /// 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 /// /// Posizione sequenza ciclo standard punzonatrice /// - 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 /// /// Enum degli stati macchina (B0) /// - public enum statoMacchina + public enum mainState + { + ND = 0, + Pronta = 1, + Lavora = 2, + Warning = 3, + Allarme = 4 + } + /// + /// Enum degli stati macchina (B0) + /// + 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 + /// + /// Stato impianto codificato come valore mainState + /// + protected ushort valMain = 0; + /// + /// Stato Dettagliato macchina + /// + protected ushort valStatus = 0; + /// + /// Posizione corrente ciclo + /// + protected ushort valPosit = 0; /// /// Recupero dati override in formato dictionary /// @@ -168,12 +198,41 @@ namespace IOB_WIN_NEXT.IobSiemens public override Dictionary getDynData() { Dictionary outVal = new Dictionary(); - 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; } + /// + /// recupero dati specifici FAPE da struttura array memoria e versione adapter + /// + 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()); + } + } /// /// Effettua processing del recupero delle OVERRIDE (spindle, feedrate, rapid) @@ -186,6 +245,160 @@ namespace IOB_WIN_NEXT.IobSiemens #region Protected Methods + /// + /// Esegue decodificada stati in modalità "classica" (2018) + /// + /// + 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; + } + } + + /// + /// Esegue decodificada stati in modalità "v2" (2024) con 2 valori senza macro stato + /// + /// + 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); + } + } + + /// + /// Esegue decodificada stati in modalità "v3" (2024) con 3 valori guardando SOLO macro stato + /// + /// + 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); + } + + } + /// /// Effettua decodifica aree memoria alla bitmap usata x MAPO /// @@ -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)