From a038f7dc9789b19cd9741dfb151cbc68dca864c6 Mon Sep 17 00:00:00 2001 From: "Samuele E. Locatelli" Date: Wed, 30 Oct 2019 11:07:17 +0100 Subject: [PATCH] Completata decodifica AT2001 Interclays --- IOB-WIN/IobSiemensAt2001.cs | 165 ++++++++++++++++++++++++------------ 1 file changed, 112 insertions(+), 53 deletions(-) diff --git a/IOB-WIN/IobSiemensAt2001.cs b/IOB-WIN/IobSiemensAt2001.cs index 65372204..877e3cc0 100644 --- a/IOB-WIN/IobSiemensAt2001.cs +++ b/IOB-WIN/IobSiemensAt2001.cs @@ -2,6 +2,7 @@ using Newtonsoft.Json; using System; using System.Collections.Generic; +using System.Linq; namespace IOB_WIN { @@ -78,7 +79,6 @@ namespace IOB_WIN public override void processWhatchDog() { //NON SERVE!!!! - } /// @@ -198,58 +198,95 @@ namespace IOB_WIN public override Dictionary getDynData() { Dictionary outVal = new Dictionary(); -#if false +#if true + // processing try { - /* ---------------------------------------------------------- - * DB60.DBD6: pressione camera filtrante (salvataggio del MAX ogni minuto) | var testVal = S7.Net.Types.Double.FromByteArray(memByteRead.Skip(0).Take(4).ToArray()); - * DB60.DBD10: pressione linea utenze (salvataggio del MAX ogni minuto) - * DB60.DBD14: temperatura acqua pulita (salvataggio del MAX ogni minuto) - * */ - double pressCamFilt = S7.Net.Types.Double.FromByteArray(RawInput.Skip(6).Take(4).ToArray()); - double pressLinUt = S7.Net.Types.Double.FromByteArray(RawInput.Skip(10).Take(4).ToArray()); - double tempH2O = S7.Net.Types.Double.FromByteArray(RawInput.Skip(14).Take(4).ToArray()); + // campi REAL + double T_Attuale_Cil = S7.Net.Types.Int.FromByteArray(RawInput.Skip(16).Take(4).ToArray()); + int Bruc_0_100 = S7.Net.Types.Int.FromByteArray(RawInput.Skip(28).Take(2).ToArray()); + int Dep_Cil_mmH2O = S7.Net.Types.Int.FromByteArray(RawInput.Skip(30).Take(2).ToArray()); + int Asp_0_100 = S7.Net.Types.Int.FromByteArray(RawInput.Skip(32).Take(2).ToArray()); + int Ampere_Asp = S7.Net.Types.Int.FromByteArray(RawInput.Skip(34).Take(2).ToArray()); + int Temp_Filtro = S7.Net.Types.Int.FromByteArray(RawInput.Skip(36).Take(2).ToArray()); + int Ampere_Cil = S7.Net.Types.Int.FromByteArray(RawInput.Skip(38).Take(2).ToArray()); + int Flowrate = S7.Net.Types.Int.FromByteArray(RawInput.Skip(40).Take(2).ToArray()); + int Ampere_Dosat = S7.Net.Types.Int.FromByteArray(RawInput.Skip(38).Take(2).ToArray()); + int Tot_Parz_Dosatore = S7.Net.Types.DInt.FromByteArray(RawInput.Skip(48).Take(4).ToArray()); + int Tot_Dosatore = S7.Net.Types.DInt.FromByteArray(RawInput.Skip(52).Take(4).ToArray()); + // verifico SE devo riportare dati VC if (utils.CRB("enableTSVC")) { + bool[] scaduti = new bool[11]; // salvo in stack le VC rilevate - bool scad01 = stackVal_TSVC("pressCamFilt", pressCamFilt); - bool scad02 = stackVal_TSVC("pressLinUt", pressLinUt); - bool scad03 = stackVal_TSVC("tempH2O", tempH2O); + scaduti[0] = stackVal_TSVC("T_Attuale_Cil", T_Attuale_Cil); + scaduti[1] = stackVal_TSVC("Bruc_0_100", Bruc_0_100); + scaduti[2] = stackVal_TSVC("Dep_Cil_mmH2O", Dep_Cil_mmH2O); + scaduti[3] = stackVal_TSVC("Asp_0_100", Asp_0_100); + scaduti[4] = stackVal_TSVC("Ampere_Asp", Ampere_Asp); + scaduti[5] = stackVal_TSVC("Temp_Filtro", Temp_Filtro); + scaduti[6] = stackVal_TSVC("Ampere_Cil", Ampere_Cil); + scaduti[7] = stackVal_TSVC("Flowrate", Flowrate); + scaduti[8] = stackVal_TSVC("Ampere_Dosat", Ampere_Dosat); + scaduti[9] = stackVal_TSVC("Tot_Parz_Dosatore", Tot_Parz_Dosatore); + scaduti[10] = stackVal_TSVC("Tot_Dosatore", Tot_Dosatore); // verifico SE devo riportare dati VC - if (scad01 || scad02 || scad03) + if (baseUtils.CountTrue(scaduti) > 0) { - pressCamFilt = getVal_TSVC("pressCamFilt", scad01); - pressLinUt = getVal_TSVC("pressLinUt", scad02); - tempH2O = getVal_TSVC("tempH2O", scad03); - outVal.Add("DYNDATA", $"pressCamFilt {pressCamFilt:N6} | pressLinUt {pressLinUt:N6} | tempH2O {tempH2O:N3}"); - outVal.Add("pressCamFilt", $"{pressCamFilt:N6}"); - outVal.Add("pressLinUt", $"{pressLinUt:N6}"); - outVal.Add("tempH2O", $"{tempH2O:N3}"); + T_Attuale_Cil = getVal_TSVC_int("T_Attuale_Cil", scaduti[0]); + Bruc_0_100 = getVal_TSVC_int("Bruc_0_100", scaduti[1]); + Dep_Cil_mmH2O = getVal_TSVC_int("Dep_Cil_mmH2O", scaduti[2]); + Asp_0_100 = getVal_TSVC_int("Asp_0_100", scaduti[3]); + Ampere_Asp = getVal_TSVC_int("Ampere_Asp", scaduti[4]); + Temp_Filtro = getVal_TSVC_int("Temp_Filtro", scaduti[5]); + Ampere_Cil = getVal_TSVC_int("Ampere_Cil", scaduti[6]); + Flowrate = getVal_TSVC_int("Flowrate", scaduti[7]); + Ampere_Dosat = getVal_TSVC_int("Ampere_Dosat", scaduti[8]); + Tot_Parz_Dosatore = getVal_TSVC_int("Tot_Parz_Dosatore", scaduti[9]); + Tot_Dosatore = getVal_TSVC_int("Tot_Dosatore", scaduti[10]); + outVal.Add("T_Attuale_Cil", $"{T_Attuale_Cil:N1}"); + outVal.Add("Bruc_0_100", $"{Bruc_0_100}"); + outVal.Add("Dep_Cil_mmH2O", $"{Dep_Cil_mmH2O}"); + outVal.Add("Asp_0_100", $"{Asp_0_100}"); + outVal.Add("Ampere_Asp", $"{Ampere_Asp}"); + outVal.Add("Temp_Filtro", $"{Temp_Filtro}"); + outVal.Add("Ampere_Cil", $"{Ampere_Cil}"); + outVal.Add("Flowrate", $"{Flowrate}"); + outVal.Add("Ampere_Dosat", $"{Ampere_Dosat}"); + outVal.Add("Tot_Parz_Dosatore", $"{Tot_Parz_Dosatore}"); + outVal.Add("Tot_Dosatore", $"{Tot_Dosatore}"); + // salvo! - LastTSVC["pressCamFilt"] = pressCamFilt; - LastTSVC["pressLinUt"] = pressLinUt; - LastTSVC["tempH2O"] = tempH2O; + LastTSVC["T_Attuale_Cil"] = T_Attuale_Cil; + LastTSVC["Bruc_0_100"] = Bruc_0_100; + LastTSVC["Dep_Cil_mmH2O"] = Dep_Cil_mmH2O; + LastTSVC["Asp_0_100"] = Asp_0_100; + LastTSVC["Ampere_Asp"] = Ampere_Asp; + LastTSVC["Temp_Filtro"] = Temp_Filtro; + LastTSVC["Ampere_Cil"] = Ampere_Cil; + LastTSVC["Flowrate"] = Flowrate; + LastTSVC["Ampere_Dosat"] = Ampere_Dosat; + LastTSVC["Tot_Parz_Dosatore"] = Tot_Parz_Dosatore; + LastTSVC["Tot_Dosatore"] = Tot_Dosatore; } else { - outVal.Add("DYNDATA", $"pressCamFilt {LastTSVC["pressCamFilt"]:N6} | pressLinUt {LastTSVC["pressLinUt"]:N6} | tempH2O {LastTSVC["tempH2O"]:N3}"); + outVal.Add("DYNDATA", $"T_Attuale_Cil {LastTSVC["T_Attuale_Cil"]:N1} | Tot_Dosatore {LastTSVC["Tot_Dosatore"]} | Bruc_0_100 {LastTSVC["Bruc_0_100"]} | Flowrate {LastTSVC["Flowrate"]}"); } } else { - outVal.Add("pressCamFilt", $"{pressCamFilt:N6}"); - outVal.Add("pressLinUt", $"{pressLinUt:N6}"); - outVal.Add("tempH2O", $"{tempH2O:N3}"); - outVal.Add("DYNDATA", $"pressCamFilt {pressCamFilt:N3} | pressLinUt {pressLinUt:N3} | tempH2O {tempH2O:N3}"); + outVal.Add("DYNDATA", $"T_Attuale_Cil {LastTSVC["T_Attuale_Cil"]:N1} | Tot_Dosatore {LastTSVC["Tot_Dosatore"]} | Bruc_0_100 {LastTSVC["Bruc_0_100"]} | Flowrate {LastTSVC["Flowrate"]}"); } } catch (Exception exc) { - lgError(exc, "Errore in getDynData x Siemens Aprochim"); - } + lgError(exc, "Errore in getDynData x Siemens AT2001"); + } #endif + return outVal; } @@ -268,36 +305,58 @@ namespace IOB_WIN * B2: pzCount * B3: allarme * B4: manuale - * B5: emergenza + * B5: avvio/spegnimento (era emergenza) * * - * - BIT di stato - * - DB60.DBX3.0: AUSILIARI INSERITI = NO EMERGENZA - * - DB60.DBX3.1: Filtro (macchina) in LAVORAZIONE - * - DB60.DBX3.2: Selettore in AUTOMATICO (sennĂ² GIALLO) - * - DB60.DBX3.3: WARNING MIN LIV VASCA (arancio) - * - DB60.DBX3.4: WARNING MIN LIV CELLULOSA (blu) - * - DB60.DBX3.5: LAMPADA ROSSA (allarmi almeno 1 attivo) + * - BYTE di stato + * - +0.0 AutoStatus BYTE B#16#0 Valore 0=Fermo/1->3=Avviamento/4=Avviato/5=Pausa/6->8spegnimento/9->10 allarme + * - +1.0 Dosatore BYTE B#16#0 Stato (bit0=in avviamento/1=marcia sx/2=marcia dx/3=in allarme/4=by-pass on) + * - +2.0 V_Dosatore BYTE B#16#0 Stato (bit0=in avviamento/1=marcia sx/2=marcia dx/3=in allarme/4=by-pass on) + * - +3.0 Nas_Lancio BYTE B#16#0 Stato (bit0=in avviamento/1=marcia sx/2=marcia dx/3=in allarme/4=by-pass on) + * - +4.0 Cilindro BYTE B#16#0 Stato (bit0=in avviamento/1=marcia sx/2=marcia dx/3=in allarme/4=by-pass on) + * - +5.0 Bruciatore BYTE B#16#0 Stato (bit0=in avviamento/1=marcia sx/2=marcia dx/3=in allarme/4=by-pass on) + * - +6.0 Aspiratore BYTE B#16#0 Stato (bit0=in avviamento/1=marcia sx/2=marcia dx/3=in allarme/4=by-pass on) + * - +7.0 Nas_Raccolta BYTE B#16#0 Stato (bit0=in avviamento/1=marcia sx/2=marcia dx/3=in allarme/4=by-pass on) + * - +8.0 Nas_Brandeg BYTE B#16#0 Stato (bit0=in avviamento/1=marcia sx/2=marcia dx/3=in allarme/4=by-pass on) + * - +9.0 Coclea_Filtro BYTE B#16#0 Stato (bit0=in avviamento/1=marcia sx/2=marcia dx/3=in allarme/4=by-pass on) + * - +10.0 Ciclico_Filtro BYTE B#16#0 Stato (bit0=in avviamento/1=marcia sx/2=marcia dx/3=in allarme/4=by-pass on) ----------------------------------------------------- */ - - - /* ----------------------------------------------------- - * bitmap MAPO FILTRO Aprochim - * B0: POWER_ON - * B1: RUN - * B2: AUTOMATICO - * B3: WARN_MIN_VASCA - * B4: WARN_MIN_CELL - * B5: ALARM - * B6: EMERGENZA - ----------------------------------------------------- */ - // bit 0 (poweron) imposto a 1 SE connected... B_input = currPLC.IsConnected ? 1 : 0; // recupero byte segnali... - int byteSignals = RawInput[3]; + int byteSignals = RawInput[0]; + // avviamento --> manuale + switch (byteSignals) + { + case 0: + break; + case 1: + case 2: + case 3: + byteSignals += (1 << 5); + break; + case 4: + byteSignals += (1 << 1); + break; + case 5: + byteSignals += (1 << 4); + break; + case 6: + case 7: + case 8: + byteSignals += (1 << 5); + break; + case 9: + case 10: + byteSignals += (1 << 3); + break; + default: + break; + } + + // aggiungo "in coda" primo bit emergenza...essendo un bit negato (NON emergenza) lo cambio di segno if ((byteSignals & (1 << 0)) == 0) {