diff --git a/IOB-WIN/IobSiemensLasco.cs.bak b/IOB-WIN/IobSiemensLasco.cs.bak deleted file mode 100644 index d676c38c..00000000 --- a/IOB-WIN/IobSiemensLasco.cs.bak +++ /dev/null @@ -1,405 +0,0 @@ -using IOB_UT; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace IOB_WIN -{ - /// - /// Controllo Siemens specifico x impianti Lasco (Pressa bilancere Valvital) - /// - public class IobSiemensLasco : IobSiemens - { - /* -------------------------------------------------------------------------------- - * Controlli SIEMENS SAET (impianti ad induzione in VALVITAL) - * - basasto su SIEMENS - * - S7 vers 1500 - * - * STRUTTURA MEMORIA DB1275: primi 92 byte lettura, poi 56 byte scrittura, vedere doc allegato - * G:\Drive condivisi\30_Clienti\Valvital\Comunicazione PLC\SAET (forno e tempra) - * - * Si intende tutto con DB1275.DBxx - * - * - parametri processo - * - DBD00: Watchdog INT SAET Alive ( 1-9999 ) - * - * - 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 - * - DBX2.1: READY TO RUN in AUTOMATICO - * - DBX2.3: Macchina in LAVORAZIONE - * - DBX2.4: WARNING Differenza tra Part Code MES - Saet (blu) - * - DBX2.5: se 1 --> LAMPADA ROSSA (allarmi almeno 1 attivo) - * - * PartCounter DINT 4.0 Conteggio Parziale di pezzi "OK" prodotti dalla macchina - * NumberCode String [12] 8.0 Valore numerico associato alla ricetta di produzione attualmente utilizzata dalla macchina - * NewCode INT 22.0 "1= Avvenuta ricezione del segnale ""richiesta nuovo ordine di produzione (NEW CODE)"" - * ricevuto dal server,impostabile su 1 solo quando la macchina NON è in produzione attiva" - * Potenza utilizzata ST.1 REAL 24 Potenza utilizzata dalla stazione di riscaldo 1 [kW] - * Potenza utilizzata ST.2 REAL 28 Potenza utilizzata dalla stazione di riscaldo 2 [kW] - * Potenza utilizzata ST.3 REAL 32 Potenza utilizzata dalla stazione di riscaldo 3 [kW] - * Potenza utilizzata ST.4 REAL 36 Potenza utilizzata dalla stazione di riscaldo 4 [kW] - * Lettura Pirometro ST.1 REAL 40 Lettura Pirometro della stazione di riscaldo 1 [°C] - * Lettura Pirometro ST.2 REAL 44 Lettura Pirometro della stazione di riscaldo 2 [°C] - * Lettura Pirometro ST.3 REAL 48 Lettura Pirometro della stazione di riscaldo 3 [°C] - * Lettura Pirometro ST.4 REAL 52 Lettura Pirometro della stazione di riscaldo 4 [°C] - * Temperatura Acqua Raff Conv. ST.1 REAL 56 Temperarura Acqua di Raffreddamento Convertitore Stazione di Riscaldo 1 [°C] - * Temperatura Acqua Raff Conv. ST.2 REAL 60 Temperarura Acqua di Raffreddamento Convertitore Stazione di Riscaldo 2 [°C] - * Temperatura Acqua Raff Conv. ST.3 REAL 64 Temperarura Acqua di Raffreddamento Convertitore Stazione di Riscaldo 3 [°C] - * Temperatura Acqua Raff Conv. ST.4 REAL 68 Temperarura Acqua di Raffreddamento Convertitore Stazione di Riscaldo 4 [°C] - * Part_Status ST.1 INT 72 Stato Pezzo Stazione di Riscaldo 1 (0=Assente 1=Grezzo 10=OK 11=NOK) - * Part_Status ST.2 INT 74 Stato Pezzo Stazione di Riscaldo 2 (0=Assente 1=Grezzo 10=OK 11=NOK) - * Part_Status ST.3 INT 76 Stato Pezzo Stazione di Riscaldo 3 (0=Assente 1=Grezzo 10=OK 11=NOK) - * Part_Status ST.4 INT 78 Stato Pezzo Stazione di Riscaldo 4 (0=Assente 1=Grezzo 10=OK 11=NOK) - * Reserve_12 REAL 80 Riserva - * Reserve_13 REAL 84 Riserva - * Reserve_14 REAL 88 Riserva - - * -------------------------------------------------------------------------------- */ - - protected DateTime lastPLCWatchDog; - protected int counterMes2Plc = 0; - protected int counterPlc2Mes = 0; - - protected Dictionary LastTSVC = new Dictionary(); - /// - /// Classe base con i metodi x Siemens - /// - /// - /// - public IobSiemensLasco(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf) - { - lgInfo("NEW IOB SIEMENS versione LASCO"); - lastPLCWatchDog = DateTime.Now.AddMinutes(-1); - // 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) - { - lgInfo($"TSVC: {item.Key} | periodo: {item.Value.Period} | funz: {item.Value.Funzione}"); - // salvo i valori PREC... - LastTSVC.Add(item.Key, 0); - } - } - } - - #region Metodi specifici (da verificare/completare in implementazione) - - /// - /// Effettua processing del recupero delle OVERRIDE (spindle, feedrate, rapid) - /// - public override void processOverride() - { - } - - public override void processWhatchDog() - { - // scrivo 1 volta al secondo il contatore incrementale su area apposita - DateTime adesso = DateTime.Now; - if (adesso.Subtract(lastPLCWatchDog).TotalSeconds > 1) - { - // incremento - counterMes2Plc++; - // se > 9999 --> 0 - if (counterMes2Plc > 9999) counterMes2Plc = 0; - // salvo su DB - Dictionary task2exe = new Dictionary(); - Dictionary taskDone = new Dictionary(); - task2exe.Add("sendWatchDogMes2Plc", counterMes2Plc.ToString()); - taskDone = executeTasks(task2exe); - // salvo watchdog PLC - lastPLCWatchDog = adesso; - } - } - - /// - /// Processo i task richiesti e li elimino dalla coda 1:1 - /// - /// - public override Dictionary executeTasks(Dictionary task2exe) - { - // Verificare il protocollo: dovrebeb togliere SOLO i task eseguiti... - Dictionary taskDone = new Dictionary(); - bool taskOk = false; - string taskVal = ""; - // inizio con 1 byte VUOTO - byte[] MemBlock = new byte[2]; - - // cerco task specifici: se ho startSetup --> imposto bit DBB701.DBB0.4 - foreach (var item in task2exe) - { - taskOk = false; - taskVal = ""; - // converto richiesta in enum... - taskType tName = taskType.nihil; - Enum.TryParse(item.Key, out tName); - // controllo sulla KEY - //!!!FIXME!!! totalmente da rivedere - switch (tName) - { - case taskType.nihil: - case taskType.fixStopSetup: - case taskType.forceResetPzCount: - case taskType.forceSetPzCount: - case taskType.setArt: - case taskType.setComm: - case taskType.setProg: - case taskType.startSetup: - case taskType.stopSetup: - case taskType.sendWatchDogMes2Plc: - taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | SKIPPED | NO EXEC"; - break; - default: - taskVal = "SKIPPED | NO EXEC"; - break; - } - // aggiungo task! - taskDone.Add(item.Key, taskVal); - } - // scrivo comunque! - bool fatto = S7WriteBB(ref MemBlock); - - return taskDone; - } - - - /// - /// Recupero dati dinamici in formato dictionary - /// - /// - public override Dictionary getDynData() - { - Dictionary outVal = new Dictionary(); - -#if true - try - { - /* -------------------------------------------------------------------------------- - * Controlli SIEMENS SAET (impianti ad induzione in VALVITAL) - * - * STRUTTURA MEMORIA DB1275: primi 92 byte lettura, poi 56 byte scrittura, vedere doc allegato - * G:\Drive condivisi\30_Clienti\Valvital\Comunicazione PLC\SAET (forno e tempra) - * - * PartCounter DINT 4.0 Conteggio Parziale di pezzi "OK" prodotti dalla macchina - * NumberCode String [12] 8.0 Valore numerico associato alla ricetta di produzione attualmente utilizzata dalla macchina - * NewCode INT 22.0 "1= Avvenuta ricezione del segnale ""richiesta nuovo ordine di produzione (NEW CODE)"" ricevuto dal server,impostabile su 1 solo quando la macchina NON è in produzione attiva" - * Potenza utilizzata ST.1 REAL 24 Potenza utilizzata dalla stazione di riscaldo 1 [kW] - * Potenza utilizzata ST.2 REAL 28 Potenza utilizzata dalla stazione di riscaldo 2 [kW] - * Potenza utilizzata ST.3 REAL 32 Potenza utilizzata dalla stazione di riscaldo 3 [kW] - * Potenza utilizzata ST.4 REAL 36 Potenza utilizzata dalla stazione di riscaldo 4 [kW] - * Lettura Pirometro ST.1 REAL 40 Lettura Pirometro della stazione di riscaldo 1 [°C] - * Lettura Pirometro ST.2 REAL 44 Lettura Pirometro della stazione di riscaldo 2 [°C] - * Lettura Pirometro ST.3 REAL 48 Lettura Pirometro della stazione di riscaldo 3 [°C] - * Lettura Pirometro ST.4 REAL 52 Lettura Pirometro della stazione di riscaldo 4 [°C] - * Temperatura Acqua Raff Conv. ST.1 REAL 56 Temperarura Acqua di Raffreddamento Convertitore Stazione di Riscaldo 1 [°C] - * Temperatura Acqua Raff Conv. ST.2 REAL 60 Temperarura Acqua di Raffreddamento Convertitore Stazione di Riscaldo 2 [°C] - * Temperatura Acqua Raff Conv. ST.3 REAL 64 Temperarura Acqua di Raffreddamento Convertitore Stazione di Riscaldo 3 [°C] - * Temperatura Acqua Raff Conv. ST.4 REAL 68 Temperarura Acqua di Raffreddamento Convertitore Stazione di Riscaldo 4 [°C] - * Part_Status ST.1 INT 72 Stato Pezzo Stazione di Riscaldo 1 (0=Assente 1=Grezzo 10=OK 11=NOK) - * Part_Status ST.2 INT 74 Stato Pezzo Stazione di Riscaldo 2 (0=Assente 1=Grezzo 10=OK 11=NOK) - * Part_Status ST.3 INT 76 Stato Pezzo Stazione di Riscaldo 3 (0=Assente 1=Grezzo 10=OK 11=NOK) - * Part_Status ST.4 INT 78 Stato Pezzo Stazione di Riscaldo 4 (0=Assente 1=Grezzo 10=OK 11=NOK) - - * -------------------------------------------------------------------------------- */ - - /* ---------------------------------------------------------- - * 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 Power_01 = S7.Net.Types.Double.FromByteArray(RawInput.Skip(24).Take(4).ToArray()); - double Power_02 = S7.Net.Types.Double.FromByteArray(RawInput.Skip(28).Take(4).ToArray()); - double Power_03 = S7.Net.Types.Double.FromByteArray(RawInput.Skip(32).Take(4).ToArray()); - double Power_04 = S7.Net.Types.Double.FromByteArray(RawInput.Skip(36).Take(4).ToArray()); - double TempPirom_01 = S7.Net.Types.Double.FromByteArray(RawInput.Skip(40).Take(4).ToArray()); - double TempPirom_02 = S7.Net.Types.Double.FromByteArray(RawInput.Skip(44).Take(4).ToArray()); - double TempPirom_03 = S7.Net.Types.Double.FromByteArray(RawInput.Skip(48).Take(4).ToArray()); - double TempPirom_04 = S7.Net.Types.Double.FromByteArray(RawInput.Skip(52).Take(4).ToArray()); - double TempCool_01 = S7.Net.Types.Double.FromByteArray(RawInput.Skip(56).Take(4).ToArray()); - double TempCool_02 = S7.Net.Types.Double.FromByteArray(RawInput.Skip(60).Take(4).ToArray()); - double TempCool_03 = S7.Net.Types.Double.FromByteArray(RawInput.Skip(64).Take(4).ToArray()); - double TempCool_04 = S7.Net.Types.Double.FromByteArray(RawInput.Skip(68).Take(4).ToArray()); - int PartStatus_01 = S7.Net.Types.Int.FromByteArray(RawInput.Skip(72).Take(2).ToArray()); - int PartStatus_02 = S7.Net.Types.Int.FromByteArray(RawInput.Skip(74).Take(2).ToArray()); - int PartStatus_03 = S7.Net.Types.Int.FromByteArray(RawInput.Skip(76).Take(2).ToArray()); - int PartStatus_04 = S7.Net.Types.Int.FromByteArray(RawInput.Skip(78).Take(2).ToArray()); - - if (utils.CRB("enableTSVC")) - { - bool[] scaduti = new bool[16]; - // salvo in stack le VC rilevate - scaduti[0] = stackVal_TSVC("Power_01", Power_01); - scaduti[1] = stackVal_TSVC("Power_02", Power_02); - scaduti[2] = stackVal_TSVC("Power_03", Power_03); - scaduti[3] = stackVal_TSVC("Power_04", Power_04); - scaduti[4] = stackVal_TSVC("TempPirom_01", TempPirom_01); - scaduti[5] = stackVal_TSVC("TempPirom_02", TempPirom_02); - scaduti[6] = stackVal_TSVC("TempPirom_03", TempPirom_03); - scaduti[7] = stackVal_TSVC("TempPirom_04", TempPirom_04); - scaduti[8] = stackVal_TSVC("TempCool_01", TempCool_01); - scaduti[9] = stackVal_TSVC("TempCool_02", TempCool_02); - scaduti[10] = stackVal_TSVC("TempCool_03", TempCool_03); - scaduti[11] = stackVal_TSVC("TempCool_04", TempCool_04); - scaduti[12] = stackVal_TSVC("PartStatus_01", PartStatus_01); - scaduti[13] = stackVal_TSVC("PartStatus_02", PartStatus_02); - scaduti[14] = stackVal_TSVC("PartStatus_03", PartStatus_03); - scaduti[15] = stackVal_TSVC("PartStatus_04", PartStatus_04); - - // verifico SE devo riportare dati VC - if (baseUtils.CountTrue(scaduti) > 0) - { - Power_01 = getVal_TSVC("Power_01", scaduti[0]); - Power_02 = getVal_TSVC("Power_02", scaduti[1]); - Power_03 = getVal_TSVC("Power_03", scaduti[2]); - Power_04 = getVal_TSVC("Power_04", scaduti[3]); - TempPirom_01 = getVal_TSVC("TempPirom_01", scaduti[4]); - TempPirom_02 = getVal_TSVC("TempPirom_02", scaduti[5]); - TempPirom_03 = getVal_TSVC("TempPirom_03", scaduti[6]); - TempPirom_04 = getVal_TSVC("TempPirom_04", scaduti[7]); - TempCool_01 = getVal_TSVC("TempCool_01", scaduti[8]); - TempCool_02 = getVal_TSVC("TempCool_02", scaduti[9]); - TempCool_03 = getVal_TSVC("TempCool_03", scaduti[10]); - TempCool_04 = getVal_TSVC("TempCool_04", scaduti[11]); - PartStatus_01 = getVal_TSVC_int("PartStatus_01", scaduti[12]); - PartStatus_02 = getVal_TSVC_int("PartStatus_02", scaduti[13]); - PartStatus_03 = getVal_TSVC_int("PartStatus_03", scaduti[14]); - PartStatus_04 = getVal_TSVC_int("PartStatus_04", scaduti[15]); - outVal.Add("DYNDATA", $"Power_01 {Power_01:N2} | TempPirom_01 {TempPirom_01:N2} | TempCool_01 {TempCool_01:N2} | PartStatus_01 {PartStatus_01}"); - outVal.Add("Power_01", $"{Power_01:N2}"); - outVal.Add("Power_02", $"{Power_02:N2}"); - outVal.Add("Power_03", $"{Power_03:N2}"); - outVal.Add("Power_04", $"{Power_04:N2}"); - outVal.Add("TempPirom_01", $"{TempPirom_01:N2}"); - outVal.Add("TempPirom_02", $"{TempPirom_02:N2}"); - outVal.Add("TempPirom_03", $"{TempPirom_03:N2}"); - outVal.Add("TempPirom_04", $"{TempPirom_04:N2}"); - outVal.Add("TempCool_01", $"{TempCool_01:N2}"); - outVal.Add("TempCool_02", $"{TempCool_02:N2}"); - outVal.Add("TempCool_03", $"{TempCool_03:N2}"); - outVal.Add("TempCool_04", $"{TempCool_04:N2}"); - outVal.Add("PartStatus_01", $"{PartStatus_01}"); - outVal.Add("PartStatus_02", $"{PartStatus_02}"); - outVal.Add("PartStatus_03", $"{PartStatus_03}"); - outVal.Add("PartStatus_04", $"{PartStatus_04}"); - // salvo! - LastTSVC["pressCamFilt"] = Power_01; - LastTSVC["pressLinUt"] = TempPirom_01; - LastTSVC["tempH2O"] = TempCool_01; - } - else - { - outVal.Add("DYNDATA", $"pressCamFilt {LastTSVC["pressCamFilt"]:N6} | pressLinUt {LastTSVC["pressLinUt"]:N6} | tempH2O {LastTSVC["tempH2O"]:N3}"); - } - } - else - { - outVal.Add("pressCamFilt", $"{Power_01:N6}"); - outVal.Add("pressLinUt", $"{TempPirom_01:N6}"); - outVal.Add("tempH2O", $"{TempCool_01:N3}"); - outVal.Add("DYNDATA", $"pressCamFilt {Power_01:N3} | pressLinUt {TempPirom_01:N3} | tempH2O {TempCool_01:N3}"); - } - } - catch (Exception exc) - { - lgError(exc, "Errore in getDynData x Siemens Aprochim"); - } -#endif - return outVal; - } - - /// - /// 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 - * - DBX2.0: macchina accesa - * - DBX2.1: CICLO AUTO = NON HO ANOMALIE/ALLARMI (0 --> allarme) - * - DBX2.2: contapezzi - * - DBX2.3: MACCHINA IN CICLO AUTO = LAVORA - * - DBX2.4: ERRORE tra part code MES/SAET (blu) - ----------------------------------------------------- */ - - byte mainData = RawInput[2]; - - int byteSignals = 0; - // bit 0 (poweron) imposto a 1 SE connected... - if (currPLC.IsConnected) - { - byteSignals += (1 << 0); - } - if ((mainData & (1 << 3)) == 1) - { - byteSignals += (1 << 1); - } - - // controllo il bit MAIN dello status - if ((mainData & (1 << 1)) == 1) - { - byteSignals += (1 << 3); - } - - // considero come MANUALE l'errore part code... - if ((mainData & (1 << 4)) == 0) - { - byteSignals += (1 << 4); - } - - // salvo! - B_input = byteSignals; - - // processo il watchdog! - counterPlc2Mes = S7.Net.Types.Int.FromByteArray(RawInput.Skip(0).Take(2).ToArray()); - // ogni 60 registro... - if (Math.Abs(counterPlc2Mes - counterPlc2MesWrote) > 60) - { - lgInfo($"WatchDog da PLC: {counterPlc2Mes}"); - counterPlc2MesWrote = counterPlc2Mes; - } - // log opzionale! - if (verboseLog) - { - lgInfo(string.Format($"Trasformazione dati: RawInput:{RawInput[3]} --> B_input: {B_input}")); - } - } - - #endregion - } -} diff --git a/IOB-WIN/IobSiemensSaet.cs.bak b/IOB-WIN/IobSiemensSaet.cs.bak deleted file mode 100644 index acf04737..00000000 --- a/IOB-WIN/IobSiemensSaet.cs.bak +++ /dev/null @@ -1,404 +0,0 @@ -using IOB_UT; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace IOB_WIN -{ - /// - /// Controllo Siemens specifico x impianti SAET - /// - public class IobSiemensSaet : IobSiemens - { - /* -------------------------------------------------------------------------------- - * Controlli SIEMENS SAET (impianti ad induzione in VALVITAL) - * - basasto su SIEMENS - * - S7 vers 1500 - * - * STRUTTURA MEMORIA DB1275: primi 92 byte lettura, poi 56 byte scrittura, vedere doc allegato - * G:\Drive condivisi\30_Clienti\Valvital\Comunicazione PLC\SAET (forno e tempra) - * - * Si intende tutto con DB1275.DBxx - * - * - parametri processo - * - DBD00: Watchdog INT SAET Alive ( 1-9999 ) - * - BIT di stato - * - DBX2.1: READY TO RUN in AUTOMATICO - * - DBX2.3: Macchina in LAVORAZIONE - * - DBX2.4: WARNING Differenza tra Part Code MES - Saet (blu) - * - DBX2.5: se 1 --> LAMPADA ROSSA (allarmi almeno 1 attivo) - * - * PartCounter DINT 4.0 Conteggio Parziale di pezzi "OK" prodotti dalla macchina - * NumberCode String [12] 8.0 Valore numerico associato alla ricetta di produzione attualmente utilizzata dalla macchina - * NewCode INT 22.0 "1= Avvenuta ricezione del segnale ""richiesta nuovo ordine di produzione (NEW CODE)"" ricevuto dal server,impostabile su 1 solo quando la macchina NON è in produzione attiva" - * Potenza utilizzata ST.1 REAL 24 Potenza utilizzata dalla stazione di riscaldo 1 [kW] - * Potenza utilizzata ST.2 REAL 28 Potenza utilizzata dalla stazione di riscaldo 2 [kW] - * Potenza utilizzata ST.3 REAL 32 Potenza utilizzata dalla stazione di riscaldo 3 [kW] - * Potenza utilizzata ST.4 REAL 36 Potenza utilizzata dalla stazione di riscaldo 4 [kW] - * Lettura Pirometro ST.1 REAL 40 Lettura Pirometro della stazione di riscaldo 1 [°C] - * Lettura Pirometro ST.2 REAL 44 Lettura Pirometro della stazione di riscaldo 2 [°C] - * Lettura Pirometro ST.3 REAL 48 Lettura Pirometro della stazione di riscaldo 3 [°C] - * Lettura Pirometro ST.4 REAL 52 Lettura Pirometro della stazione di riscaldo 4 [°C] - * Temperatura Acqua Raff Conv. ST.1 REAL 56 Temperarura Acqua di Raffreddamento Convertitore Stazione di Riscaldo 1 [°C] - * Temperatura Acqua Raff Conv. ST.2 REAL 60 Temperarura Acqua di Raffreddamento Convertitore Stazione di Riscaldo 2 [°C] - * Temperatura Acqua Raff Conv. ST.3 REAL 64 Temperarura Acqua di Raffreddamento Convertitore Stazione di Riscaldo 3 [°C] - * Temperatura Acqua Raff Conv. ST.4 REAL 68 Temperarura Acqua di Raffreddamento Convertitore Stazione di Riscaldo 4 [°C] - * Part_Status ST.1 INT 72 Stato Pezzo Stazione di Riscaldo 1 (0=Assente 1=Grezzo 10=OK 11=NOK) - * Part_Status ST.2 INT 74 Stato Pezzo Stazione di Riscaldo 2 (0=Assente 1=Grezzo 10=OK 11=NOK) - * Part_Status ST.3 INT 76 Stato Pezzo Stazione di Riscaldo 3 (0=Assente 1=Grezzo 10=OK 11=NOK) - * Part_Status ST.4 INT 78 Stato Pezzo Stazione di Riscaldo 4 (0=Assente 1=Grezzo 10=OK 11=NOK) - * Reserve_12 REAL 80 Riserva - * Reserve_13 REAL 84 Riserva - * Reserve_14 REAL 88 Riserva - - * -------------------------------------------------------------------------------- */ - - protected DateTime lastPLCWatchDog; - protected int counterMes2Plc = 0; - protected int counterPlc2Mes = 0; - protected int counterPlc2MesWrote = 0; - - protected Dictionary LastTSVC = new Dictionary(); - /// - /// Classe base con i metodi x Siemens - /// - /// - /// - public IobSiemensSaet(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf) - { - lgInfo("NEW IOB SIEMENS versione SAET"); - lastPLCWatchDog = DateTime.Now.AddMinutes(-1); - // 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) - { - lgInfo($"TSVC: {item.Key} | periodo: {item.Value.Period} | funz: {item.Value.Funzione}"); - // salvo i valori PREC... - LastTSVC.Add(item.Key, 0); - } - } - } - - #region Metodi specifici (da verificare/completare in implementazione) - - /// - /// Effettua processing del recupero delle OVERRIDE (spindle, feedrate, rapid) - /// - public override void processOverride() - { - } - - public override void processWhatchDog() - { - // scrivo 1 volta al secondo il contatore incrementale su area apposita - DateTime adesso = DateTime.Now; - if (adesso.Subtract(lastPLCWatchDog).TotalSeconds > 1) - { - // incremento - counterMes2Plc++; - // se > 9999 --> 0 - if (counterMes2Plc > 9999) counterMes2Plc = 0; - // salvo su DB - Dictionary task2exe = new Dictionary(); - Dictionary taskDone = new Dictionary(); - task2exe.Add("sendWatchDogMes2Plc", counterMes2Plc.ToString()); - taskDone = executeTasks(task2exe); - // salvo watchdog PLC - lastPLCWatchDog = adesso; - } - } - - /// - /// Processo i task richiesti e li elimino dalla coda 1:1 - /// - /// - public override Dictionary executeTasks(Dictionary task2exe) - { - // Verificare il protocollo: dovrebeb togliere SOLO i task eseguiti... - Dictionary taskDone = new Dictionary(); - bool taskOk = false; - string taskVal = ""; - // inizio con 1 byte VUOTO - byte[] MemBlock = new byte[2]; - - // cerco task specifici: se ho startSetup --> imposto bit DBB701.DBB0.4 - foreach (var item in task2exe) - { - taskOk = false; - taskVal = ""; - // converto richiesta in enum... - taskType tName = taskType.nihil; - Enum.TryParse(item.Key, out tName); - // controllo sulla KEY - switch (tName) - { - case taskType.nihil: - case taskType.fixStopSetup: - case taskType.forceResetPzCount: - case taskType.forceSetPzCount: - case taskType.setArt: - case taskType.setComm: - case taskType.setProg: - case taskType.startSetup: - case taskType.stopSetup: - taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | SKIPPED | NO EXEC"; - break; - case taskType.sendWatchDogMes2Plc: - MemBlock[1] = (byte)counterMes2Plc; - MemBlock[0] = (byte)(counterMes2Plc >> 8); - taskVal = $"VALUE DB1275.92 --> {counterMes2Plc}"; - break; - default: - taskVal = "SKIPPED | NO EXEC"; - break; - } - // aggiungo task! - taskDone.Add(item.Key, taskVal); - taskDone.Add(item.Key, taskVal); - } - // scrivo comunque! - bool fatto = S7WriteBB(ref MemBlock); - - return taskDone; - } - - - /// - /// Recupero dati dinamici in formato dictionary - /// - /// - public override Dictionary getDynData() - { - Dictionary outVal = new Dictionary(); - -#if true - try - { - /* -------------------------------------------------------------------------------- - * Controlli SIEMENS SAET (impianti ad induzione in VALVITAL) - * - * STRUTTURA MEMORIA DB1275: primi 92 byte lettura, poi 56 byte scrittura, vedere doc allegato - * G:\Drive condivisi\30_Clienti\Valvital\Comunicazione PLC\SAET (forno e tempra) - * - * PartCounter DINT 4.0 Conteggio Parziale di pezzi "OK" prodotti dalla macchina - * NumberCode String [12] 8.0 Valore numerico associato alla ricetta di produzione attualmente utilizzata dalla macchina - * NewCode INT 22.0 "1= Avvenuta ricezione del segnale ""richiesta nuovo ordine di produzione (NEW CODE)"" ricevuto dal server,impostabile su 1 solo quando la macchina NON è in produzione attiva" - * Potenza utilizzata ST.1 REAL 24 Potenza utilizzata dalla stazione di riscaldo 1 [kW] - * Potenza utilizzata ST.2 REAL 28 Potenza utilizzata dalla stazione di riscaldo 2 [kW] - * Potenza utilizzata ST.3 REAL 32 Potenza utilizzata dalla stazione di riscaldo 3 [kW] - * Potenza utilizzata ST.4 REAL 36 Potenza utilizzata dalla stazione di riscaldo 4 [kW] - * Lettura Pirometro ST.1 REAL 40 Lettura Pirometro della stazione di riscaldo 1 [°C] - * Lettura Pirometro ST.2 REAL 44 Lettura Pirometro della stazione di riscaldo 2 [°C] - * Lettura Pirometro ST.3 REAL 48 Lettura Pirometro della stazione di riscaldo 3 [°C] - * Lettura Pirometro ST.4 REAL 52 Lettura Pirometro della stazione di riscaldo 4 [°C] - * Temperatura Acqua Raff Conv. ST.1 REAL 56 Temperarura Acqua di Raffreddamento Convertitore Stazione di Riscaldo 1 [°C] - * Temperatura Acqua Raff Conv. ST.2 REAL 60 Temperarura Acqua di Raffreddamento Convertitore Stazione di Riscaldo 2 [°C] - * Temperatura Acqua Raff Conv. ST.3 REAL 64 Temperarura Acqua di Raffreddamento Convertitore Stazione di Riscaldo 3 [°C] - * Temperatura Acqua Raff Conv. ST.4 REAL 68 Temperarura Acqua di Raffreddamento Convertitore Stazione di Riscaldo 4 [°C] - * Part_Status ST.1 INT 72 Stato Pezzo Stazione di Riscaldo 1 (0=Assente 1=Grezzo 10=OK 11=NOK) - * Part_Status ST.2 INT 74 Stato Pezzo Stazione di Riscaldo 2 (0=Assente 1=Grezzo 10=OK 11=NOK) - * Part_Status ST.3 INT 76 Stato Pezzo Stazione di Riscaldo 3 (0=Assente 1=Grezzo 10=OK 11=NOK) - * Part_Status ST.4 INT 78 Stato Pezzo Stazione di Riscaldo 4 (0=Assente 1=Grezzo 10=OK 11=NOK) - - * -------------------------------------------------------------------------------- */ - - /* ---------------------------------------------------------- - * 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 Power_01 = S7.Net.Types.Double.FromByteArray(RawInput.Skip(24).Take(4).ToArray()); - double Power_02 = S7.Net.Types.Double.FromByteArray(RawInput.Skip(28).Take(4).ToArray()); - double Power_03 = S7.Net.Types.Double.FromByteArray(RawInput.Skip(32).Take(4).ToArray()); - double Power_04 = S7.Net.Types.Double.FromByteArray(RawInput.Skip(36).Take(4).ToArray()); - double TempPirom_01 = S7.Net.Types.Double.FromByteArray(RawInput.Skip(40).Take(4).ToArray()); - double TempPirom_02 = S7.Net.Types.Double.FromByteArray(RawInput.Skip(44).Take(4).ToArray()); - double TempPirom_03 = S7.Net.Types.Double.FromByteArray(RawInput.Skip(48).Take(4).ToArray()); - double TempPirom_04 = S7.Net.Types.Double.FromByteArray(RawInput.Skip(52).Take(4).ToArray()); - double TempCool_01 = S7.Net.Types.Double.FromByteArray(RawInput.Skip(56).Take(4).ToArray()); - double TempCool_02 = S7.Net.Types.Double.FromByteArray(RawInput.Skip(60).Take(4).ToArray()); - double TempCool_03 = S7.Net.Types.Double.FromByteArray(RawInput.Skip(64).Take(4).ToArray()); - double TempCool_04 = S7.Net.Types.Double.FromByteArray(RawInput.Skip(68).Take(4).ToArray()); - int PartStatus_01 = S7.Net.Types.Int.FromByteArray(RawInput.Skip(72).Take(2).ToArray()); - int PartStatus_02 = S7.Net.Types.Int.FromByteArray(RawInput.Skip(74).Take(2).ToArray()); - int PartStatus_03 = S7.Net.Types.Int.FromByteArray(RawInput.Skip(76).Take(2).ToArray()); - int PartStatus_04 = S7.Net.Types.Int.FromByteArray(RawInput.Skip(78).Take(2).ToArray()); - - if (utils.CRB("enableTSVC")) - { - bool[] scaduti = new bool[16]; - // salvo in stack le VC rilevate - scaduti[0] = stackVal_TSVC("Power_01", Power_01); - scaduti[1] = stackVal_TSVC("Power_02", Power_02); - scaduti[2] = stackVal_TSVC("Power_03", Power_03); - scaduti[3] = stackVal_TSVC("Power_04", Power_04); - scaduti[4] = stackVal_TSVC("TempPirom_01", TempPirom_01); - scaduti[5] = stackVal_TSVC("TempPirom_02", TempPirom_02); - scaduti[6] = stackVal_TSVC("TempPirom_03", TempPirom_03); - scaduti[7] = stackVal_TSVC("TempPirom_04", TempPirom_04); - scaduti[8] = stackVal_TSVC("TempCool_01", TempCool_01); - scaduti[9] = stackVal_TSVC("TempCool_02", TempCool_02); - scaduti[10] = stackVal_TSVC("TempCool_03", TempCool_03); - scaduti[11] = stackVal_TSVC("TempCool_04", TempCool_04); - scaduti[12] = stackVal_TSVC("PartStatus_01", PartStatus_01); - scaduti[13] = stackVal_TSVC("PartStatus_02", PartStatus_02); - scaduti[14] = stackVal_TSVC("PartStatus_03", PartStatus_03); - scaduti[15] = stackVal_TSVC("PartStatus_04", PartStatus_04); - - // verifico SE devo riportare dati VC - if (baseUtils.CountTrue(scaduti) > 0) - { - Power_01 = getVal_TSVC("Power_01", scaduti[0]); - Power_02 = getVal_TSVC("Power_02", scaduti[1]); - Power_03 = getVal_TSVC("Power_03", scaduti[2]); - Power_04 = getVal_TSVC("Power_04", scaduti[3]); - TempPirom_01 = getVal_TSVC("TempPirom_01", scaduti[4]); - TempPirom_02 = getVal_TSVC("TempPirom_02", scaduti[5]); - TempPirom_03 = getVal_TSVC("TempPirom_03", scaduti[6]); - TempPirom_04 = getVal_TSVC("TempPirom_04", scaduti[7]); - TempCool_01 = getVal_TSVC("TempCool_01", scaduti[8]); - TempCool_02 = getVal_TSVC("TempCool_02", scaduti[9]); - TempCool_03 = getVal_TSVC("TempCool_03", scaduti[10]); - TempCool_04 = getVal_TSVC("TempCool_04", scaduti[11]); - PartStatus_01 = getVal_TSVC_int("PartStatus_01", scaduti[12]); - PartStatus_02 = getVal_TSVC_int("PartStatus_02", scaduti[13]); - PartStatus_03 = getVal_TSVC_int("PartStatus_03", scaduti[14]); - PartStatus_04 = getVal_TSVC_int("PartStatus_04", scaduti[15]); - outVal.Add("DYNDATA", $"Power_01 {Power_01:N2} | TempPirom_01 {TempPirom_01:N2} | TempCool_01 {TempCool_01:N2} | PartStatus_01 {PartStatus_01}"); - outVal.Add("Power_01", $"{Power_01:N2}"); - outVal.Add("Power_02", $"{Power_02:N2}"); - outVal.Add("Power_03", $"{Power_03:N2}"); - outVal.Add("Power_04", $"{Power_04:N2}"); - outVal.Add("TempPirom_01", $"{TempPirom_01:N2}"); - outVal.Add("TempPirom_02", $"{TempPirom_02:N2}"); - outVal.Add("TempPirom_03", $"{TempPirom_03:N2}"); - outVal.Add("TempPirom_04", $"{TempPirom_04:N2}"); - outVal.Add("TempCool_01", $"{TempCool_01:N2}"); - outVal.Add("TempCool_02", $"{TempCool_02:N2}"); - outVal.Add("TempCool_03", $"{TempCool_03:N2}"); - outVal.Add("TempCool_04", $"{TempCool_04:N2}"); - outVal.Add("PartStatus_01", $"{PartStatus_01}"); - outVal.Add("PartStatus_02", $"{PartStatus_02}"); - outVal.Add("PartStatus_03", $"{PartStatus_03}"); - outVal.Add("PartStatus_04", $"{PartStatus_04}"); - // salvo! - LastTSVC["pressCamFilt"] = Power_01; - LastTSVC["pressLinUt"] = TempPirom_01; - LastTSVC["tempH2O"] = TempCool_01; - } - else - { - outVal.Add("DYNDATA", $"pressCamFilt {LastTSVC["pressCamFilt"]:N6} | pressLinUt {LastTSVC["pressLinUt"]:N6} | tempH2O {LastTSVC["tempH2O"]:N3}"); - } - } - else - { - outVal.Add("pressCamFilt", $"{Power_01:N6}"); - outVal.Add("pressLinUt", $"{TempPirom_01:N6}"); - outVal.Add("tempH2O", $"{TempCool_01:N3}"); - outVal.Add("DYNDATA", $"pressCamFilt {Power_01:N3} | pressLinUt {TempPirom_01:N3} | tempH2O {TempCool_01:N3}"); - } - } - catch (Exception exc) - { - lgError(exc, "Errore in getDynData x Siemens Aprochim"); - } -#endif - return outVal; - } - - /// - /// 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 - * - DBX2.0: macchina accesa - * - DBX2.1: CICLO AUTO = NON HO ANOMALIE/ALLARMI (0 --> allarme) - * - DBX2.2: contapezzi - * - DBX2.3: MACCHINA IN CICLO AUTO = LAVORA - * - DBX2.4: ERRORE tra part code MES/SAET (blu) - ----------------------------------------------------- */ - - byte mainData = RawInput[2]; - - int byteSignals = 0; - // bit 0 (poweron) imposto a 1 SE connected... - if (currPLC.IsConnected) - { - byteSignals += (1 << 0); - } - if ((mainData & (1 << 3)) == 1) - { - byteSignals += (1 << 1); - } - - // controllo il bit MAIN dello status - if ((mainData & (1 << 1)) == 1) - { - byteSignals += (1 << 3); - } - - // considero come MANUALE l'errore part code... - if ((mainData & (1 << 4)) == 0) - { - byteSignals += (1 << 4); - } - - // salvo! - B_input = byteSignals; - - // processo il watchdog! - counterPlc2Mes = S7.Net.Types.Int.FromByteArray(RawInput.Skip(0).Take(2).ToArray()); - // ogni 60 registro... - if (Math.Abs(counterPlc2Mes - counterPlc2MesWrote) > 60) - { - lgInfo($"WatchDog da PLC: {counterPlc2Mes}"); - counterPlc2MesWrote = counterPlc2Mes; - } - // log opzionale! - if (verboseLog) - { - lgInfo(string.Format($"Trasformazione dati: RawInput:{RawInput[3]} --> B_input: {B_input}")); - } - } - - #endregion - } -}