using IOB_UT_NEXT; using MapoSDK; using System; using System.Collections.Generic; using System.Linq; namespace IOB_WIN_NEXT { /// /// Controllo Siemens specifico x impianti Aprochim /MacDermid /// public class IobSiemensAprochim : IobSiemens { /* -------------------------------------------------------------------------------- * Controlli SIEMENS Aprochim (impianti filtrazione in Jetco, gruppo macDermid) * - basasto su SIEMENS * - S7 vers 1500 * * STRUTTURA MEMORIA DB60: * - parametri processo * - 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) * * - 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) * -------------------------------------------------------------------------------- */ #region Public Constructors /// /// Classe base con i metodi x Siemens /// /// /// public IobSiemensAprochim(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf) { lgInfo("NEW IOB SIEMENS versione APROCHIM"); // imposto i parametri speciali x calcolo... var chiaviTSVC = findOptPar("TSVC"); if (chiaviTSVC.Count > 0) { lgInfo($"Trovate {chiaviTSVC.Count} chiavi TSVC"); string[] codVal; VCData currConf; int periodo = 0; VC_func funz = VC_func.POINT; // accodo nella conf... foreach (var item in chiaviTSVC) { codVal = item.Value.Split(':'); Enum.TryParse(codVal[0], out funz); int.TryParse(codVal[1], out periodo); currConf = new VCData() { Funzione = funz, Period = periodo, DTStart = DateTime.Now.AddHours(-1), dataArray = new List() }; TSVC_Data.Add(item.Key.Replace("TSVC_", ""), currConf); } // documento... foreach (var item in TSVC_Data) { lgTrace($"TSVC: {item.Key} | periodo: {item.Value.Period} | funz: {item.Value.Funzione}"); // salvo i valori PREC... LastTSVC.Add(item.Key, 0); } } } #endregion Public Constructors #region Protected Methods /// /// Effettua decodifica aree memoria alla bitmap usata x MAPO /// protected override void decodeToBaseBitmap() { // init a zero... B_input = 0; /* ----------------------------------------------------- * bitmap MAPO STANDARD * B0: POWER_ON * B1: RUN * B2: pzCount * B3: allarme * B4: manuale * B5: 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) ----------------------------------------------------- */ /* ----------------------------------------------------- * 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]; // aggiungo "in coda" primo bit emergenza...essendo un bit negato (NON emergenza) lo cambio di segno if ((byteSignals & (1 << 0)) == 0) { byteSignals += (1 << 6); } // cancello primo bit (faccio uno shift a dx e poi a sx di 1...) byteSignals = ((byteSignals >> 1) << 1); // bit 0 (poweron) imposto a 1 SE connected... if (currPLC.IsConnected) { byteSignals += (1 << 0); } // salvo! B_input = byteSignals; // log opzionale! if (verboseLog) { lgInfo(string.Format($"Trasformazione dati: RawInput:{RawInput[3]} --> B_input: {B_input}")); } } #endregion Protected Methods #region Public Methods /// /// Recupero dati dinamici in formato dictionary /// /// public override Dictionary getDynData() { Dictionary outVal = new Dictionary(); 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()); if (utils.CRB("enableTSVC")) { // salvo in stack le VC rilevate bool scad01 = stackVal_TSVC("pressCamFilt", pressCamFilt); bool scad02 = stackVal_TSVC("pressLinUt", pressLinUt); bool scad03 = stackVal_TSVC("tempH2O", tempH2O); // verifico SE devo riportare dati VC if (scad01 || scad02 || scad03) { 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}"); // salvo! LastTSVC["pressCamFilt"] = pressCamFilt; LastTSVC["pressLinUt"] = pressLinUt; LastTSVC["tempH2O"] = tempH2O; } else { outVal.Add("DYNDATA", $"pressCamFilt {LastTSVC["pressCamFilt"]:N6} | pressLinUt {LastTSVC["pressLinUt"]:N6} | tempH2O {LastTSVC["tempH2O"]:N3}"); } } 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}"); } } catch (Exception exc) { lgError(exc, "Errore in getDynData x Siemens Aprochim"); } return outVal; } /// /// Effettua processing del recupero delle OVERRIDE (spindle, feedrate, rapid) /// public override void processOverride() { } #endregion Public Methods } }