/* * Copyright Copyright 2016+, Steamware s.r.l. & CMS/SCM s.p.a. * * Based on data, code and example by MTC consortium & System Insights, Inc. * * */ using MTC; using NLog; using NLog.Config; using NLog.Targets; using SCMA.AdapterCom; using System; using System.Collections; using System.Collections.Generic; using System.Configuration; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Threading; using System.Windows.Forms; namespace SCMA { public partial class MainForm : Form { #region inizializzazione contatori /// /// contatore veloce /// protected int fastCount; /// /// contatore normale /// protected int normCount; /// /// contatore lento /// protected int slowCount; /// /// contatore sync allarmi /// protected int alarmSyncCount; /// /// timer base in avvio /// protected int startTimerMs = 250; /// /// ultimo tentativo riavvio... /// protected DateTime lastStartTry; #endregion #region inizializzazione oggetti base /// /// oggetto logging /// public static Logger lg; /// /// Oggetto x gestione dell'adapter GENERICO (x poter usare metodi di ognuno...) /// AdapterPLC.Generic agObj; /// /// configurazione caricata /// AdapterConf adpConf; /// /// DataModel caricato /// DataModel currDataModel; /// /// tipo di adapter prescelto... /// public tipoAdapter tipoScelto = tipoAdapter.DEMO; //public Gateway protocollo #endregion #region utils ed helpers public static void EnableTab(TabPage page, bool enable) { EnableControls(page.Controls, enable); } private static void EnableControls(Control.ControlCollection ctls, bool enable) { foreach (Control ctl in ctls) { ctl.Enabled = enable; EnableControls(ctl.Controls, enable); } } private class Item { public string Name; public int Value; public Item(string name, int value) { Name = name; Value = value; } } /// /// mostra un testo sulla status bar ed attende startTimerMs /// /// public void displayTaskAndWait(string txt2show) { lblStatus.Text = txt2show; lg.Info(txt2show); Thread.Sleep(startTimerMs); } /// /// Mostra update delle statistiche di comunicazione (numero chiamate, tempo medio...) /// /// public void updateComStats(string txt2show) { lblComStats.Text = string.Format("{0} | ", txt2show); } #endregion #region gestione form e visibilità /// /// Gestione form principale /// public MainForm() { InitializeComponent(); lblStatus.Text = "Loading"; lastStartTry = DateTime.Now; // fix icon! notifyIcon1.Text = string.Format("SCMA | {0}", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version); Icon = Icon.ExtractAssociatedIcon(defIconFilePath); notifyIcon1.Icon = Icon.ExtractAssociatedIcon(defIconFilePath); // fix versione! lblApp.Text = string.Format("{0}", ConfigurationManager.AppSettings.Get("appName")); lblVers.Text = string.Format(" v.{0}", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version); startTimerMs = utils.CRI("startTimerMs"); #if DEBUG // Setup the logging view for Sentinel - http://sentinel.codeplex.com var sentinalTarget = new NLogViewerTarget() { Name = "sentinal", Address = "udp://127.0.0.1:9999", IncludeNLogData = false }; var sentinalRule = new LoggingRule("*", LogLevel.Trace, sentinalTarget); LogManager.Configuration.AddTarget("sentinal", sentinalTarget); LogManager.Configuration.LoggingRules.Add(sentinalRule); #endif LogManager.ReconfigExistingLoggers(); lg = LogManager.GetCurrentClassLogger(); displayTaskAndWait("Starting MainForm"); // inizio con tab control disabilitati EnableTab(tabCtrlMain.TabPages[1], false); EnableTab(tabCtrlMain.TabPages[2], false); // se abilitato autoload conf leggo file corretto... if (utils.CRB("autoLoadConf")) { loadXmlFile(defConfFilePath); lg.Info("XML LOADED"); loadPersistLayer(defPersLayerFile); lg.Info("PersLayerFile READ"); agObj.loadPersData(); lg.Info("PersLayerFile LOADED"); } else { // definisco e avvio tipo adapter generico tipoScelto = tipoAdapter.ND; adpConf = new AdapterConf(); loadAdapterType(); displayTaskAndWait("Waiting for config file selection"); } // Start timer periodico gather.Interval = utils.CRI("timerIntMs"); gather.Enabled = true; displayTaskAndWait("Program Running"); createTrayMenu(); displayTaskAndWait("Tray Menu OK"); // avvio minimizzato se richiesto if (utils.CRB("startMinimized")) { // imposto minimized se necessario! if (WindowState != FormWindowState.Minimized) { WindowState = FormWindowState.Minimized; } displayTaskAndWait("Minimized"); } displayTaskAndWait("Main Form OK"); } /// /// Verifica finale a fine show... /// /// /// private void MainForm_Shown(object sender, EventArgs e) { // avvio minimizzato se richiesto if (utils.CRB("startMinimized")) { // controllo e mando a tray... sendToTray(); } displayTaskAndWait("Main Form SHOWN"); } /// /// crea menù tray x applicazione /// private void createTrayMenu() { // Fix testi menù tray... trayMenu.Items.Clear(); // SE permessa massimizzazione... if (utils.CRB("windowCanMax")) { trayMenu.Items.Add("Show SCMA"); } // se è permesso tray close... if (utils.CRB("trayClose")) { trayMenu.Items.Add("Close SCMA"); } } /// /// doppio click su tray icon /// /// /// private void notifyIcon1_DoubleClick(object sender, EventArgs e) { // SOLO SE PERMESSO mostrare full... if (utils.CRB("windowCanMax")) { Show(); WindowState = FormWindowState.Normal; } } /// /// evento resize /// /// /// private void MainForm_Resize(object sender, EventArgs e) { checkFormVisibility(); } /// /// Verifica stato windows (minimized/normal) e visibilità con tray... /// private void checkFormVisibility() { // se non può massimizzare imposto COMUNQUE a minimized... if (!utils.CRB("windowCanMax")) { WindowState = FormWindowState.Minimized; } // controllo cosa devo mostrare... if (WindowState == FormWindowState.Minimized) { notifyIcon1.Visible = false; sendToTray(); } else { notifyIcon1.Visible = false; } } /// /// Gestisce "andata nel tray" della form /// private void sendToTray() { if (!notifyIcon1.Visible) { notifyIcon1.BalloonTipTitle = utils.CRS("appName"); notifyIcon1.BalloonTipText = string.Format("{0} running on tray", utils.CRS("appName")); notifyIcon1.Visible = true; notifyIcon1.ShowBalloonTip(100); } Hide(); } /// /// click su menù contestuale in tray /// /// /// private void trayMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { if (e.ClickedItem.Text.StartsWith("Close")) { // stop adapter... closeAdapter(); // chiudo! Close(); } else if (e.ClickedItem.Text.StartsWith("Show")) { if (utils.CRB("windowCanMax")) { Show(); WindowState = FormWindowState.Normal; } } } #endregion protected string defConfFilePath { get { return string.Format(@"{0}\{1}", utils.confDir, utils.CRS("defaultConfFile")); } } /// /// File persistenza generale /// protected string defPersLayerFile { get { return string.Format(@"{0}\{1}", utils.dataDatDir, utils.CRS("defaultPersLayerFile")); } } protected string defIconFilePath { get { return string.Format(@"{0}\Scma.ico", utils.resxDir); } } /// /// carica adapter richiesto /// private void loadAdapterType() { Gateway currGateway; switch (utils.CRS("adpProto")) { case "MTC": currGateway = new GatewayMTC(); break; case "SOURS": currGateway = new GatewaySOURS(); break; case "": default: currGateway = new Gateway(); break; } // ira inizializzo VERO adapter x tipo controllo e protocollo... switch (tipoScelto) { case tipoAdapter.DEMO: agObj = new AdapterPLC.Demo(this, adpConf, currGateway); EnableTab(tabCtrlMain.TabPages[1], true); EnableTab(tabCtrlMain.TabPages[2], true); start.Enabled = true; break; case tipoAdapter.ESAGVCMS: agObj = new AdapterPLC.CMS.EsaKosmos(this, adpConf, currGateway); EnableTab(tabCtrlMain.TabPages[1], true); EnableTab(tabCtrlMain.TabPages[2], false); start.Enabled = true; break; case tipoAdapter.ESAGVSCM: agObj = new AdapterPLC.SCM.EsaKvara(this, adpConf, currGateway); EnableTab(tabCtrlMain.TabPages[1], true); EnableTab(tabCtrlMain.TabPages[2], false); start.Enabled = true; break; case tipoAdapter.FANUC: agObj = new AdapterPLC.CMS.Fanuc(this, adpConf, currGateway); EnableTab(tabCtrlMain.TabPages[1], true); EnableTab(tabCtrlMain.TabPages[2], false); start.Enabled = true; break; case tipoAdapter.OSAI: agObj = new AdapterPLC.CMS.Osai(this, adpConf, currGateway); EnableTab(tabCtrlMain.TabPages[1], true); EnableTab(tabCtrlMain.TabPages[2], false); start.Enabled = true; break; case tipoAdapter.SIEMENS: agObj = new AdapterPLC.CMS.Siemens(this, adpConf, currGateway); EnableTab(tabCtrlMain.TabPages[1], true); EnableTab(tabCtrlMain.TabPages[2], false); start.Enabled = true; break; case tipoAdapter.ND: default: agObj = new AdapterPLC.Demo(this, adpConf, currGateway); EnableTab(tabCtrlMain.TabPages[1], false); EnableTab(tabCtrlMain.TabPages[2], false); start.Enabled = false; break; } lblCurrAdapt.Text = string.Format("Adapter loaded: {0}", tipoScelto.ToString().ToUpper()); // carico i default values su interfaccia setDefaults(); displayTaskAndWait(string.Format("Caricata conf per adapter {0}", tipoScelto)); } /// /// impostazione valori defaults /// private void setDefaults() { stop.Enabled = false; dump.Enabled = false; D1_NAME.Text = "DEMO MACHINE"; // utils.CRS("D1_NAME"); D1_ID.Text = "DEMO ID"; //utils.CRS("D1_ID"); D1_UUID.Text = "DEMO UUID"; // utils.CRS("D1_UUID"); program.Text = "DEMO PRG"; // utils.CRS("D1_PROGRAM"); PROG_ROW_NUM.Text = "0"; partID.Text = "DEMO PART-ID"; // utils.CRS("PartID"); pzOk = 0; pzKo = 0; Power = 1000; AccTime = 1440 * 365; OPERATOR_ID.Text = "OPxxxx"; STATUS_STRB_DW0.Text = utils.binaryForm(0); STATUS_STRB_DW1.Text = utils.binaryForm(0); STATUS_STRB_DW2.Text = utils.binaryForm(0); STATUS_STRB_DW3.Text = utils.binaryForm(0); STATUS_ACK_DW0.Text = utils.binaryForm(0); STATUS_ACK_DW1.Text = utils.binaryForm(0); STATUS_ACK_DW2.Text = utils.binaryForm(0); STATUS_ACK_DW3.Text = utils.binaryForm(0); MainProgrBar.Minimum = 0; MainProgrBar.Maximum = 1000; MainProgrBar.Value = 0; MainProgrBar.Step = 1; // compilo combobox causali fermo... string[] contenuto = File.ReadAllLines(utils.confDir + "\\HaltTypeList.map"); System.Collections.Generic.Dictionary comboSource = new Dictionary(); foreach (var line in contenuto) { // se la linea non è commento e non è vuota... if (line.Length > 0 && line[0] != '#') { string[] tokens = line.Split(':'); comboSource.Add(tokens[0], tokens[1]); } } functionalMode.DataSource = new BindingSource(comboSource, null); functionalMode.DisplayMember = "Value"; functionalMode.ValueMember = "Key"; string[] row = { "0", "0", "0", "0", "0", "0" }; PosAct.Rows.Add(row); // fix componenti vettoriali PATH, UNOP, ASSI... for (int i = 0; i < adpConf.nPath; i++) { cbPathSel.Items.Insert(i, adpConf.Path[i].ident); } if (adpConf.nPath > 0) { cbPathSel.SelectedIndex = 0; } for (int i = 0; i < adpConf.nUnOp; i++) { cbUnOpSel.Items.Insert(i, adpConf.UnOp[i].ident); } if (adpConf.nUnOp > 0) { cbUnOpSel.SelectedIndex = 0; } for (int i = 0; i < adpConf.nAxis; i++) { cbAxNum.Items.Insert(i, adpConf.Axis[i].ident); } if (adpConf.nAxis > 0) { cbAxNum.SelectedIndex = 0; } } /// /// Avvio dell'adapter /// /// /// private void start_Click(object sender, EventArgs e) { avviaAdapter(); agObj.loadPersData(); // salvo che ho avviato adapter lg.Info("Completato LOAD Adapter"); } public void avviaAdapter() { displayTaskAndWait("Adapter starting"); // se NON sta girando... if (!agObj.adpRunning) { agObj.startAdapter(); displayTaskAndWait("Adapter started!"); // fix buttons start/stop/dump start.Enabled = false; stop.Enabled = true; dump.Enabled = true; if (utils.CRB("openDumpOnStart")) { displayTaskAndWait("Dump Window starting"); apriDumpAgent(); displayTaskAndWait("Dump Windows OK"); } displayTaskAndWait("Start Timers"); // inizializzo contatori fast/mid/slow fastCount = utils.CRI("fastCount"); normCount = utils.CRI("normCount"); slowCount = utils.CRI("slowCount"); alarmSyncCount = utils.CRI("alarmSyncCount"); displayTaskAndWait("Adapter Running..."); // forzo check allarmi.. agObj.forceAlarmCheck(); } else { displayTaskAndWait("Adapter STILL Running..."); } } /// /// fermata dell'adapter /// /// /// private void stop_Click(object sender, EventArgs e) { fermaAdapter(false); // salvo che ho fermato adapter lg.Info("UNLOAD Adapter"); } /// /// Ferma l'adapter /// /// determina se si debba tentare riavvio automatico (per caduta connessione) public void fermaAdapter(bool tryRestart) { fermaTutto(false, tryRestart); } private void gather_Tick(object sender, EventArgs e) { // eseguo cicli attivi SOLO se adapter è in EFFETTIVO running... if (agObj.adpRunning) { // inizio a riportare che sto eseguendo.. advProgBar(); if (agObj.connectionOk) { // check esecuzione FastTask checkFastTask(); // check esecuzione NormTask checkNormTask(); // check esecuzione SlowTask checkSlowTask(); // check esecuzione AlarmSync checkAlarmSync(); // check esecuzione SendTask (VHF) checkSendTask(); if (utils.CRI("waitEndCycle") > 0) { Thread.Sleep(utils.CRI("waitEndCycle")); } } else { double currWait = DateTime.Now.Subtract(lastStartTry).TotalMilliseconds; if (agObj.adpTryRestart && currWait > utils.CRI("waitRecMSec")) { lastStartTry = DateTime.Now; agObj.tryConnect(); agObj.loadPersData(); } } // se è arrivato a MAX resetto... if (MainProgrBar.Value >= MainProgrBar.Maximum) { MainProgrBar.Value = 0; } } else { // verifico SE debba tentare il riavvio, ovvero NON running ma tryReconn e non ho riprovato x oltre waitRecMSec double currWait = DateTime.Now.Subtract(lastStartTry).TotalMilliseconds; if (agObj.adpTryRestart && currWait > utils.CRI("waitRecMSec")) { lastStartTry = DateTime.Now; avviaAdapter(); agObj.loadPersData(); } } } public void resetProgBar() { MainProgrBar.Value = 0; } /// /// Visualizzazione stato di comunicazione attiva con PLC /// public bool commPlcActive { set { // se true --> comunica/verde, altrimenti grigio lblApp.ForeColor = value ? Color.SeaGreen : Color.Black; lblVers.ForeColor = value ? Color.SeaGreen : Color.DarkSlateGray; statusStrip1.Refresh(); } } private void checkAlarmSync() { alarmSyncCount--; if (alarmSyncCount <= 0) { alarmSyncCount = utils.CRI("alarmSyncCount"); // avvio fase raccolta dati e invio con adapter agObj.gaterAndSend(gatherCycle.VLF); } } private void checkSlowTask() { slowCount--; if (slowCount <= 0) { slowCount = utils.CRI("slowCount"); // avvio fase raccolta dati e invio con adapter agObj.gaterAndSend(gatherCycle.LF); // refresh stringhe code M/S/T refreshCodeMST(); // effettua salvataggio del file di conf con i valori ATTUALI dei parametri ove applicabile/aggiornati (es ore utilizzo, KM assi percorsi...) --> sia file corrente che file "history" persistData(); } } /// /// file persistenza generale /// public string histPersLayerFile { get { return string.Format(@"{0}\{1:yyyy}\{1:yyyy-MM-dd}.mtc", utils.dataDatDir, DateTime.Now); } } /// /// file persistenza generale data attuale ANTICIPATA di xx giorni /// /// num DD di anticipo /// public string prevPersLayerFile(int numDD) { return string.Format(@"{0}\{1:yyyy}\{1:yyyy-MM-dd}.mtc", utils.dataDatDir, DateTime.Now.AddDays(-numDD)); } /// /// salva i valori attuali del file di conf sia in file corrente che in cartella valori storici /// public void persistData() { // salvo ogni "autoSaveSec" secondi dall'ultimo salvataggio... TimeSpan tempoMod = new TimeSpan(0); if (File.Exists(defPersLayerFile)) { DateTime adesso = DateTime.Now; tempoMod = DateTime.Now.Subtract(File.GetLastWriteTime(defPersLayerFile)); } if (tempoMod.TotalSeconds > utils.CRI("autoSaveSec")) { savePersistLayer(defPersLayerFile); savePersistLayer(histPersLayerFile); } } private void checkNormTask() { // decremento... normCount--; // se il counter è a zero eseguo... if (normCount <= 0) { normCount = utils.CRI("normCount"); // avvio fase raccolta dati e invio con adapter agObj.gaterAndSend(gatherCycle.MF); } } /// /// Avanza la barra di stato... /// public void advProgBar() { try { MainProgrBar.PerformStep(); MainProgrBar.Invalidate(); } catch { } } private void checkSendTask() { // avvio fase invio con adapter (code MST) agObj.gaterAndSend(gatherCycle.VHF); } private void checkFastTask() { // decremento... fastCount--; // se il counter è a zero eseguo... if (fastCount <= 0) { fastCount = utils.CRI("fastCount"); // avvio fase raccolta dati e invio con adapter agObj.gaterAndSend(gatherCycle.HF); refreshVisualStrobes(); } } private void message_Leave(object sender, EventArgs e) { } // apro eseguibile dump private void dump_Click(object sender, EventArgs e) { apriDumpAgent(); } /// /// apre agent di dump in CMD /// private static void apriDumpAgent() { // solo se sono in modalità MTC... if (utils.CRS("adpProto") == "MTC") { string path = Application.StartupPath; try { Process.Start(string.Format(@"{0}\..\..\dump\dump.exe", path)); } catch { Process.Start(string.Format(@"{0}\dump\dump.exe", path)); } } } #region classi x simulazione valori vari /// /// simula alcuni dati generando ad esempio numeri casuali... SE abilitato e SE adapter è DEMO /// private void simulateData() { if (enableDataSim.Checked && tipoScelto == tipoAdapter.DEMO) { DateTime adesso = DateTime.Now; Random rnd = new Random(); // 10% casi cambia riga if (rnd.Next(0, 100) > 90) { PROG_ROW_NUM.Text = rnd.Next(1, 10000).ToString(); } // cambio posizioni 6% casi: aggiungo codici M if (rnd.Next(0, 100) > 95) { agObj.appendCodeMST("M", rnd.Next(1, 30).ToString(), 0); } // cambio posizioni 3% casi: aggiungo codici S if (rnd.Next(0, 100) > 97) { agObj.appendCodeMST("S", rnd.Next(100, 10000).ToString(), 0); } // cambio posizioni 3% casi: aggiungo codici T if (rnd.Next(0, 100) > 97) { agObj.appendCodeMST("T", rnd.Next(1, 100).ToString(), 0); } // aggiungo 1 pz al totale nel 0.3% dei casi (-->TC circa 333 x tick)... if (rnd.Next(0, 1000) > 997) { pzOk++; agObj.STROBE_PLC = agObj.STROBE_PLC | Strobe.PZ_OK; } // cambio posizioni XYZ/ijk nel 20% dei casi x ogni terna... if (rnd.Next(0, 100) > 80) { PosAct.Rows[0].Cells[0].Value = rnd.Next(0, 100); PosAct.Rows[0].Cells[1].Value = rnd.Next(0, 100); PosAct.Rows[0].Cells[2].Value = rnd.Next(0, 100); agObj.STROBE_PLC = agObj.STROBE_PLC | Strobe.POS_ACT; } if (rnd.Next(0, 100) > 80) { PosAct.Rows[0].Cells[3].Value = rnd.Next(0, 100); PosAct.Rows[0].Cells[4].Value = rnd.Next(0, 100); PosAct.Rows[0].Cells[5].Value = rnd.Next(0, 100); agObj.STROBE_PLC = agObj.STROBE_PLC | Strobe.POS_ACT; } // cambio power nel 15% dei casi... if (rnd.Next(0, 100) > 85) { Power += rnd.Next(-10, 10); } // aggiungo 1 min AccTime nel 0.1% dei casi if (rnd.Next(0, 1000) > 999) { AccTime++; } // toggle 1 allarme sys nello 0.5% dei casi if (rnd.Next(0, 1000) > 995) { int codAlarm = rnd.Next(1, 3); switch (codAlarm) { case 1: SysErr_01.Checked = !SysErr_01.Checked; break; case 2: SysErr_02.Checked = !SysErr_02.Checked; break; default: SysErr_03.Checked = !SysErr_03.Checked; break; } agObj.STATUS_FLAG = agObj.STATUS_FLAG | StatusBitMap.AL01; } // toggle 1 allarme PLC nello 0.4% dei casi if (rnd.Next(0, 1000) > 996) { int codAlarm = rnd.Next(1, 3); switch (codAlarm) { case 1: PlcErr_01.Checked = !PlcErr_01.Checked; break; case 2: PlcErr_02.Checked = !PlcErr_02.Checked; break; default: PlcErr_03.Checked = !PlcErr_03.Checked; break; } agObj.STATUS_FLAG = agObj.STATUS_FLAG | StatusBitMap.AL02; } // toggle 1 allarme CNC nello 0.3% dei casi if (rnd.Next(0, 1000) > 997) { int codAlarm = rnd.Next(1, 3); switch (codAlarm) { case 1: CncErr_01.Checked = !CncErr_01.Checked; break; case 2: CncErr_02.Checked = !CncErr_02.Checked; break; default: CncErr_03.Checked = !CncErr_03.Checked; break; } agObj.STATUS_FLAG = agObj.STATUS_FLAG | StatusBitMap.AL03; } // nel 2% dei casi imposto un RUN MODE diverso da RUN if (rnd.Next(0, 100) > 98) { int codSel = rnd.Next(1, 3); switch (codSel) { case 1: manual.Checked = true; break; case 2: mdi.Checked = true; break; default: edit.Checked = true; break; } } // nel 3% degli altri casi riporto RUN MODE a RUN else { if (rnd.Next(0, 100) > 97) { automatic.Checked = true; } } // nel 2% dei casi imposto un EXE MODE diverso da AUTO if (rnd.Next(0, 100) > 98) { int codSel = rnd.Next(1, 3); switch (codSel) { case 1: ready.Checked = true; break; case 2: stopped.Checked = true; break; default: feedhold.Checked = true; break; } } // nel 3% degli altri casi riporto EXE MODE a AUTO else { if (rnd.Next(0, 100) > 97) { running.Checked = true; } } // controllo se ci sia il flag di lettura di un evento M/S/T nel qual caso lo abbasso... if (utils.IsSetAll(agObj.STROBE_ADP, Strobe.M_CODE)) { if (utils.IsSetAll(agObj.STROBE_PLC, Strobe.M_CODE)) { agObj.STROBE_PLC -= Strobe.M_CODE; } } if (utils.IsSetAll(agObj.STROBE_ADP, Strobe.S_CODE)) { if (utils.IsSetAll(agObj.STROBE_PLC, Strobe.S_CODE)) { agObj.STROBE_PLC -= Strobe.S_CODE; } } if (utils.IsSetAll(agObj.STROBE_ADP, Strobe.T_CODE)) { if (utils.IsSetAll(agObj.STROBE_PLC, Strobe.T_CODE)) { agObj.STROBE_PLC -= Strobe.T_CODE; } } // controllo se ci sia il flag di lettura di un evento pz ok/ko nel qual caso lo abbasso... if (utils.IsSetAll(agObj.STROBE_ADP, Strobe.PZ_OK)) { if (utils.IsSetAll(agObj.STROBE_PLC, Strobe.PZ_OK)) { agObj.STROBE_PLC -= Strobe.PZ_OK; } } if (utils.IsSetAll(agObj.STROBE_ADP, Strobe.PZ_KO)) { if (utils.IsSetAll(agObj.STROBE_PLC, Strobe.PZ_KO)) { agObj.STROBE_PLC -= Strobe.PZ_KO; } } // controllo se ci sia il flag di lettura di un evento FEED_SPEED nel qual caso lo abbasso... if (utils.IsSetAll(agObj.STROBE_ADP, Strobe.FEED_SPEED)) { if (utils.IsSetAll(agObj.STROBE_PLC, Strobe.FEED_SPEED)) { agObj.STROBE_PLC -= Strobe.FEED_SPEED; } } // controllo se ci sia il flag di lettura di un evento POS_ACT nel qual caso lo abbasso... if (utils.IsSetAll(agObj.STROBE_ADP, Strobe.POS_ACT)) { if (utils.IsSetAll(agObj.STROBE_PLC, Strobe.POS_ACT)) { agObj.STROBE_PLC -= Strobe.POS_ACT; } } refreshVisualStrobes(); refreshCodeMST(); } } private void refreshVisualStrobes() { // aggiorno visualizzazione strobe! STATUS_STRB_DW0.Text = utils.binaryForm((int)agObj.STRB_DW0); STATUS_STRB_DW1.Text = utils.binaryForm((int)agObj.STRB_DW1); STATUS_STRB_DW2.Text = utils.binaryForm((int)agObj.STRB_DW2); STATUS_STRB_DW3.Text = utils.binaryForm((int)agObj.STRB_DW3); STATUS_ACK_DW0.Text = utils.binaryForm((int)agObj.ACK_DW0); STATUS_ACK_DW1.Text = utils.binaryForm((int)agObj.ACK_DW1); STATUS_ACK_DW2.Text = utils.binaryForm((int)agObj.ACK_DW2); STATUS_ACK_DW3.Text = utils.binaryForm((int)agObj.ACK_DW3); } /// /// aggiorna visualizzazione code... /// private void refreshCodeMST() { lblCodaM.Text = string.Join(",", agObj.codaM[0].ToArray()); lblCodaT.Text = string.Join(",", agObj.codaT[0].ToArray()); lblCodaS.Text = string.Join(",", agObj.codaS[0].ToArray()); } private void accodaCodM() { if (addCodM.Text.Trim() != "") { agObj.appendCodeMST("M", addCodM.Text.Trim(), 0); addCodM.Text = ""; } refreshCodeMST(); } private void accodaCodS() { if (addCodS.Text.Trim() != "") { agObj.appendCodeMST("S", addCodS.Text.Trim(), 0); addCodS.Text = ""; } refreshCodeMST(); } private void accodaCodT() { if (addCodT.Text.Trim() != "") { agObj.appendCodeMST("T", addCodT.Text.Trim(), 0); addCodT.Text = ""; } refreshCodeMST(); } private void addCodM_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { // accodo testo accodaCodM(); } else if (e.KeyCode == Keys.Escape) { // svuoto! addCodM.Text = ""; } } private void addCodM_Leave(object sender, EventArgs e) { accodaCodM(); } private void addCodS_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { // accodo testo accodaCodS(); } else if (e.KeyCode == Keys.Escape) { // svuoto! addCodS.Text = ""; } } private void addCodS_Leave(object sender, EventArgs e) { accodaCodS(); } private void addCodT_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { // accodo testo accodaCodT(); } else if (e.KeyCode == Keys.Escape) { // svuoto! addCodT.Text = ""; } } private void addCodT_Leave(object sender, EventArgs e) { accodaCodT(); } #endregion private void txtPathFeed_TextChanged(object sender, EventArgs e) { hsPathFeed.Value = Convert.ToInt32(txtPathFeed.Text); } private void txtPathFeedOver_TextChanged(object sender, EventArgs e) { hsPathFeedOver.Value = Convert.ToInt32(txtPathFeedOver.Text); } private void txtPathSpeedOver_TextChanged(object sender, EventArgs e) { hsPathSpeedOver.Value = Convert.ToInt32(txtPathSpeedOver.Text); } private void raiseFlag_FEED_SPEED() { // se non c'è flag lo alzo... if (!utils.IsSetAll(agObj.STROBE_PLC, Strobe.FEED_SPEED)) { agObj.STROBE_PLC = agObj.STROBE_PLC | Strobe.FEED_SPEED; } } private void hsPathFeed_ValueChanged(object sender, EventArgs e) { txtPathFeed.Text = hsPathFeed.Value.ToString(); raiseFlag_FEED_SPEED(); } private void hsPathFeedOver_ValueChanged(object sender, EventArgs e) { txtPathFeedOver.Text = hsPathFeedOver.Value.ToString(); raiseFlag_FEED_SPEED(); } private void hsPathSpeedOver_ValueChanged(object sender, EventArgs e) { txtPathSpeedOver.Text = hsPathSpeedOver.Value.ToString(); raiseFlag_FEED_SPEED(); } #region gestione load conf private void mConfGen_Click(object sender, EventArgs e) { SetupAdapter setupWIndow = new SetupAdapter(); setupWIndow.Show(this); } private void mLoadAdaptConf_Click(object sender, EventArgs e) { // mostro selettore file x leggere adapter.. OpenFileDialog openFileDial = new OpenFileDialog(); // directory iniziale openFileDial.InitialDirectory = utils.confDir; // string.Format(@"{0}\{1}", Application.StartupPath, utils.CRS("dataConfPath")); // Set filter options and filter index. openFileDial.Filter = "XML Files (.xml)|*.xml|All Files (*.*)|*.*"; openFileDial.FilterIndex = 1; // altre opzioni openFileDial.Multiselect = false; // Call the ShowDialog method to show the dialog box. DialogResult userClickedOK = openFileDial.ShowDialog(); // Process input if the user clicked OK. if (userClickedOK == DialogResult.OK) { string XmlConfFile = openFileDial.FileName; loadXmlFile(XmlConfFile); lg.Info("XML LOADED"); loadPersistLayer(defPersLayerFile); lg.Info("PersLayerFile READ"); agObj.loadPersData(); lg.Info("PersLayerFile LOADED"); } } /// /// Carica file XML della configurazione richiesta /// /// private void loadXmlFile(string XmlConfFile) { displayTaskAndWait(string.Format("Loading XML: {0}", XmlConfFile)); // 2019.07.13: cambiata procedura SE ci trociamo nel caso OPC-UA / SOUR che parte da DataModel.xml... if (utils.CRS("adpProto") == "SOURS" && XmlConfFile.EndsWith("DataModel.xml")) { if (utils.CRB("verbose")) { lg.Info("Inizio caricamento DataModel per OPC-UA REDIS server"); } StreamReader file; // carica da file... file = new StreamReader(XmlConfFile); // leggo file... string rawDataModel = file.ReadToEnd(); // faccio un primo passaggio di pulizia commenti... string sanitizedXml = utils.xmlSanitize(rawDataModel); // chiudo file file.Close(); // effettuo deserializzazione... DataModel dm = new DataModel(); currDataModel = dm.Deserialize(sanitizedXml); // avvio oggetto conf tipoScelto = tipoAdapter.ND; adpConf = new AdapterConf(); // salvo i dati "specifici" in base a quanto recuperato da DataModel... // cerco da plc/Name il tipo di PLC... string plcName = ""; var trovatoCnc = currDataModel.Properties.Find(x => x.BrowseName.Contains("Machine:Cnc:Name")); var trovatoPlc = currDataModel.Properties.Find(x => x.BrowseName.Contains("Machine:Plc:Name")); if (trovatoCnc != null) { plcName = trovatoCnc.Value; } else if (trovatoPlc != null) { plcName = trovatoPlc.Value; } Enum.TryParse(plcName, true, out tipoScelto); adpConf.NomeAdapt = plcName; adpConf.TipoAdapt = tipoScelto; adpConf.Version = 2; // preparo file temp x generazione regole StreamWriter fileOut; // apro in scrittura il file x mettere le regole... fileOut = new StreamWriter(utils.nameRepRoleFileSOUR); fileOut.WriteLine("#------------------------------------------------------------"); fileOut.WriteLine("# AUTO GENERATED Replacement Conf File"); fileOut.WriteLine("#------------------------------------------------------------"); fileOut.WriteLine(""); // altre variabili element newElement; int numRules = 0; string replString = ""; // cerco ASSI come componenti... List> dataRefList; int numAx = 0; List listaAx = new List(); List selAxes = currDataModel.Components.FindAll(x => x.BrowseName.Contains("Machine:Axes:")); string axBaseName = ""; string axType = "LINEAR"; foreach (var item in selAxes) { numAx++; axBaseName = $"Axis_{numAx.ToString("00")}"; // preparo la datarefList x TIPO assi e gruppo... dataRefList = new List>(); // calcolo TIPO DI ASSE DataModel.Property tipoAsse = currDataModel.Properties.Find(x => x.BrowseName.Contains($"{item.BrowseName}:Type")); if (tipoAsse != null) { axType = tipoAsse.Value; } else { axType = "LINEAR"; } // aggiungo conf specifiche... dataRefList.Add(new DataRefItem($"Axis_{ numAx.ToString("00") }_Grp", "00")); dataRefList.Add(new DataRefItem($"Axis_{ numAx.ToString("00") }_Type", axType)); newElement = new element() { ident = axBaseName, dataRefList = dataRefList }; listaAx.Add(newElement); // aggiungo su file... replString = item.BrowseName.Replace("Machine:", ""); fileOut.WriteLine($"A|I|{newElement.ident}_PosAct|{replString}:CurrentPos"); fileOut.WriteLine($"A|I|{newElement.ident}_PosTgt|{replString}:TargetPos"); fileOut.WriteLine($"A|I|{newElement.ident}_InvDDone|{replString}:Inversions"); fileOut.WriteLine($"A|I|{newElement.ident}_DistDone|{replString}:Distance"); fileOut.WriteLine($"A|I|{newElement.ident}_FeedAct|{replString}:FeedRate"); fileOut.WriteLine($"A|I|{newElement.ident}_FeedOver|{replString}:FeedOverride"); fileOut.WriteLine($"A|I|{newElement.ident}_MainProc|{replString}:ParentProc"); fileOut.WriteLine($"A|I|{newElement.ident}_Descr|{replString}:Name"); fileOut.WriteLine($"A|I|AV_{newElement.ident}_Load|{replString}:Load"); fileOut.WriteLine($"A|I|{newElement.ident}_AccTime|{replString}:ActiveTime"); fileOut.WriteLine($"A|I|{newElement.ident}_Dir|{replString}:Direction"); fileOut.WriteLine($"A|I|{newElement.ident}_MastId|{replString}:MasterId"); fileOut.WriteLine($"A|I|{newElement.ident}_Type|{replString}:Type"); numRules += 13; } fileOut.WriteLine(""); // cerco PATH/Processi come componenti... int numProc = 0; List listaProc = new List(); List selProc = currDataModel.Components.FindAll(x => x.BrowseName.Contains("Machine:Cnc:CncProcesses:")); string procBaseName = ""; foreach (var item in selProc) { numProc++; procBaseName = $"Path_{numProc.ToString("00")}"; newElement = new element() { ident = procBaseName }; listaProc.Add(newElement); // aggiungo su file... replString = item.BrowseName.Replace("Machine:", ""); fileOut.WriteLine($"A|I|{newElement.ident}_CodG_Act|{replString}:CodG"); fileOut.WriteLine($"A|I|{newElement.ident}_Cod_M|{replString}:CodM"); fileOut.WriteLine($"A|I|{newElement.ident}_Cod_S|{replString}:CodS"); fileOut.WriteLine($"A|I|{newElement.ident}_Cod_T|{replString}:CodT"); fileOut.WriteLine($"A|I|{newElement.ident}_EXE_MODE|{replString}:Status"); fileOut.WriteLine($"A|I|{newElement.ident}_RUN_MODE|{replString}:Mode"); fileOut.WriteLine($"A|I|{newElement.ident}_RapidOverr|{replString}:RapidOverride"); fileOut.WriteLine($"A|I|{newElement.ident}_FeedOverr|{replString}:FeedOverride"); numRules += 8; } fileOut.WriteLine(""); // cerco UnOp / Gruppi operatori come componenti... int numUnOp = 0; List listaUnOp = new List(); List selUnOp = currDataModel.Components.FindAll(x => x.BrowseName.Contains("Machine:OperatingGroups:")); string procUnOp = ""; foreach (var item in selUnOp) { numUnOp++; procUnOp = $"UnOp_{numUnOp.ToString("00")}"; newElement = new element() { ident = procUnOp }; listaUnOp.Add(newElement); // aggiungo su file... replString = item.BrowseName.Replace("Machine:", ""); fileOut.WriteLine($"A|I|{newElement.ident}_Speed|{replString}:SpeedRate"); fileOut.WriteLine($"A|I|{newElement.ident}_KRev|{replString}:Distance"); fileOut.WriteLine($"A|I|{newElement.ident}_AccTime|{replString}:ActiveTime"); fileOut.WriteLine($"A|I|{newElement.ident}_ToolId|{replString}:ToolId"); fileOut.WriteLine($"A|I|{newElement.ident}_NumCU|{replString}:ToolChanges"); fileOut.WriteLine($"A|I|{newElement.ident}_Load|{replString}:Load"); fileOut.WriteLine($"A|I|{newElement.ident}_SpeedOverr|{replString}:SpeedOverride"); fileOut.WriteLine($"A|I|{newElement.ident}_Status|{replString}:Status"); fileOut.WriteLine($"A|I|{newElement.ident}_Count|{replString}:Repetitions"); numRules += 9; } fileOut.WriteLine(""); // cerco nei gruppi ausiliari... // VacuumPump... int numVP = 0; List listaVP = new List(); // VacuumAct int numVA = 0; List listaVA = new List(); // SlittaMag int numSlMag = 0; List listaSlMag = new List(); // ProtMag int numProtMag = 0; List listaProtMag = new List(); // SlittaTast int numSlTas = 0; List listaSlTas = new List(); // Cooler... int numCool = 0; List listaCool = new List(); // Lubro... int numLub = 0; List listaLub = new List(); // Press... int numPres = 0; List listaPress = new List(); // Temperature... int numTemp = 0; List listaTemp = new List(); // ricerca gruppi AUX List selAux = currDataModel.Properties.FindAll(x => x.BrowseName.Contains("Machine:AuxiliaryGroups")); foreach (var item in selAux) { if (item.Value == "COOLER") { numCool++; newElement = new element() { ident = $"Cooler_{numCool.ToString("00")}" }; listaCool.Add(newElement); // aggiungo su file... replString = item.BrowseName.Replace("Machine:", "").Replace(":Type", ""); fileOut.WriteLine($"A|I|{newElement.ident}_Status|{replString}:Status"); numRules++; } if (item.Value == "LUBRO") { numLub++; newElement = new element() { ident = $"Lubro_{numLub.ToString("00")}" }; listaLub.Add(newElement); // aggiungo su file... replString = item.BrowseName.Replace("Machine:", "").Replace(":Type", ""); fileOut.WriteLine($"A|I|{newElement.ident}_Count|{replString}:Repetitions"); numRules++; } if (item.Value == "VACUUM_PUMP") { numVP++; newElement = new element() { ident = $"VacPump_{numVP.ToString("00")}" }; listaVP.Add(newElement); // aggiungo su file... replString = item.BrowseName.Replace("Machine:", "").Replace(":Type", ""); fileOut.WriteLine($"A|I|{newElement.ident}_Status|{replString}:Status"); fileOut.WriteLine($"A|I|{newElement.ident}_WrkTime|{replString}:ActiveTime"); numRules += 2; } if (item.Value == "VACUUM_ACT") { numVA++; newElement = new element() { ident = $"VacAct_{numVA.ToString("00")}" }; listaVA.Add(newElement); // aggiungo su file... replString = item.BrowseName.Replace("Machine:", "").Replace(":Type", ""); fileOut.WriteLine($"A|I|{newElement.ident}_Count|{replString}:Repetitions"); fileOut.WriteLine($"A|I|{newElement.ident}_Value|{replString}:Value"); numRules++; } if (item.Value == "SLITTA_MAG") { numSlMag++; newElement = new element() { ident = $"SlittaMagazzino_{numSlMag.ToString("00")}" }; listaSlMag.Add(newElement); // aggiungo su file... replString = item.BrowseName.Replace("Machine:", "").Replace(":Type", ""); fileOut.WriteLine($"A|I|{newElement.ident}_Count|{replString}:Repetitions"); numRules++; } if (item.Value == "PROT_MAG") { numProtMag++; newElement = new element() { ident = $"ProtezioneMagazzino_{numProtMag.ToString("00")}" }; listaProtMag.Add(newElement); // aggiungo su file... replString = item.BrowseName.Replace("Machine:", "").Replace(":Type", ""); fileOut.WriteLine($"A|I|{newElement.ident}_Count|{replString}:Repetitions"); numRules++; } if (item.Value == "SLITTA_TAST") { numSlTas++; newElement = new element() { ident = $"SlittaTastatore_{numPres.ToString("00")}" }; listaSlTas.Add(newElement); // aggiungo su file... replString = item.BrowseName.Replace("Machine:", "").Replace(":Type", ""); fileOut.WriteLine($"A|I|{newElement.ident}_Count|{replString}:Repetitions"); numRules++; } if (item.Value == "PRESSURE") { numPres++; newElement = new element() { ident = $"Press_{numPres.ToString("00")}" }; listaPress.Add(newElement); // aggiungo su file... replString = item.BrowseName.Replace("Machine:", "").Replace(":Type", ""); fileOut.WriteLine($"A|I|{newElement.ident}_Value|{replString}:Value"); fileOut.WriteLine($"A|I|{newElement.ident}_Status|{replString}:Status"); fileOut.WriteLine($"A|I|{newElement.ident}_Count|{replString}:Repetitions"); numRules += 1; } if (item.Value == "TEMPERATURE") { numTemp++; newElement = new element() { ident = $"Temp_{numTemp.ToString("00")}" }; listaTemp.Add(newElement); // aggiungo su file... replString = item.BrowseName.Replace("Machine:", "").Replace(":Type", ""); fileOut.WriteLine($"A|I|{newElement.ident}_Value|{replString}:Value"); numRules += 1; } } // aggiungo elementi trovati... if (numAx > 0) { element[] elencoAx = listaAx.ToArray(); adpConf.Axis = elencoAx; } if (numProc > 0) { element[] elencoProc = listaProc.ToArray(); adpConf.Path = elencoProc; } if (numUnOp > 0) { element[] elencoUnOp = listaUnOp.ToArray(); adpConf.UnOp = elencoUnOp; } if (numCool > 0) { element[] elencoCool = listaCool.ToArray(); adpConf.Cooler = elencoCool; } if (numLub > 0) { element[] elencoLub = listaLub.ToArray(); adpConf.Lubro = elencoLub; } if (numVP > 0) { element[] elencoVP = listaVP.ToArray(); adpConf.VacuumPump = elencoVP; } if (numVA > 0) { element[] elencoVA = listaVA.ToArray(); adpConf.VacuumAct = elencoVA; } if (numSlMag > 0) { element[] elencoSlMag = listaSlMag.ToArray(); adpConf.SlittaMag = elencoSlMag; } if (numSlTas > 0) { element[] elencoSlTas = listaSlTas.ToArray(); adpConf.SlittaTas = elencoSlTas; } if (numPres > 0) { element[] elencoPress = listaPress.ToArray(); adpConf.Press = elencoPress; } if (numTemp > 0) { element[] elencoTemp = listaTemp.ToArray(); adpConf.Temp = elencoTemp; } fileOut.WriteLine(""); fileOut.WriteLine("#------------------------------------------------------------"); fileOut.WriteLine($"# EOF: {numRules} rules added"); fileOut.WriteLine("#------------------------------------------------------------"); // chiudo file regole! fileOut.Close(); // compilo il file StatusList.SOUR.map fileOut = new StreamWriter(utils.StatusListFileSOUR); int numStatus = 0; fileOut.WriteLine("#------------------------------------------------------------"); fileOut.WriteLine("# AUTO GENERATED StatusList File"); fileOut.WriteLine("#------------------------------------------------------------"); fileOut.WriteLine(""); // ricerca in variabili List selStatus = currDataModel.Variables.FindAll(x => x.CmsDataType.Equals("StatusList")).OrderBy(x=> x.CmsDataIndex).ToList(); foreach (var item in selStatus) { // compilo il file di conf... fileOut.WriteLine($"{item.CmsDataIndex}|{item.BrowseName.Replace("Machine:", "")}|{item.CmsDataOpt}"); numStatus++; } fileOut.WriteLine(""); fileOut.WriteLine("#------------------------------------------------------------"); fileOut.WriteLine($"# EOF: {numStatus} status added"); fileOut.WriteLine("#------------------------------------------------------------"); // chiudo file regole! fileOut.Close(); // compilo il file CounterList.SOUR.map fileOut = new StreamWriter(utils.CounterListFileSOUR); int numCounter = 0; fileOut.WriteLine("#------------------------------------------------------------"); fileOut.WriteLine("# AUTO GENERATED CounterList File"); fileOut.WriteLine("#------------------------------------------------------------"); fileOut.WriteLine(""); // ricerca in variabili List selCounter = currDataModel.Variables.FindAll(x => x.CmsDataType.Equals("CounterList")).OrderBy(x => x.CmsDataIndex).ToList(); foreach (var item in selCounter) { // compilo il file di conf... se è RTV aggiungo la parte RTV.. fileOut.WriteLine($"{item.CmsDataIndex}|{item.BrowseName.Replace("Machine:", "")}|{item.CmsDataOpt}|{item.CmsDataScale}"); numCounter++; } fileOut.WriteLine(""); fileOut.WriteLine("#------------------------------------------------------------"); fileOut.WriteLine($"# EOF: {numCounter} counters added"); fileOut.WriteLine("#------------------------------------------------------------"); // chiudo file regole! fileOut.Close(); // compilo il file AnalogList.SOUR.map fileOut = new StreamWriter(utils.AnalogListFileSOUR); int numAnalog = 0; fileOut.WriteLine("#------------------------------------------------------------"); fileOut.WriteLine("# AUTO GENERATED AnalogList File"); fileOut.WriteLine("#------------------------------------------------------------"); fileOut.WriteLine(""); // ricerca in variabili List selAnalog = currDataModel.Variables.FindAll(x => x.CmsDataType.Equals("AnalogData")).OrderBy(x => x.CmsDataIndex).ToList(); foreach (var item in selAnalog) { // compilo il file di conf... fileOut.WriteLine($"{item.CmsDataIndex}|{item.BrowseName.Replace("Machine:", "")}|{item.CmsDataOpt}"); numAnalog++; } fileOut.WriteLine(""); fileOut.WriteLine("#------------------------------------------------------------"); fileOut.WriteLine($"# EOF: {numAnalog} analog added"); fileOut.WriteLine("#------------------------------------------------------------"); // chiudo file regole! fileOut.Close(); // compilo il file StringList.SOUR.map fileOut = new StreamWriter(utils.StringListFileSOUR); int numString = 0; fileOut.WriteLine("#------------------------------------------------------------"); fileOut.WriteLine("# AUTO GENERATED StringList File"); fileOut.WriteLine("#------------------------------------------------------------"); fileOut.WriteLine(""); // ricerca in variabili List selString = currDataModel.Variables.FindAll(x => x.CmsDataType.Equals("StringData")).OrderBy(x => x.CmsDataIndex).ToList(); foreach (var item in selString) { // compilo il file di conf... fileOut.WriteLine($"{item.CmsDataIndex}|{item.BrowseName.Replace("Machine:", "")}|{item.CmsDataOpt}"); numString++; } fileOut.WriteLine(""); fileOut.WriteLine("#------------------------------------------------------------"); fileOut.WriteLine($"# EOF: {numString} string added"); fileOut.WriteLine("#------------------------------------------------------------"); // chiudo file regole! fileOut.Close(); } else { // legge obj configurazione "legacy" adpConf = AdapterConf.Deserialize(XmlConfFile); } // indico quale sia il tipo di adapter tipoScelto = adpConf.TipoAdapt; loadAdapterType(); // carico file XML in web browser... wbXmlConf.DocumentText = AdapterConf.rawXml(XmlConfFile); displayTaskAndWait("XML loaded"); // avvio macchina con adapter specificato... if (utils.CRB("autoStartOnLoad")) { displayTaskAndWait("Auto Starting..."); // avvio! avviaAdapter(); displayTaskAndWait("Auto Started!"); } } /// /// salva su file l'oggetto AdapterConf /// /// public void saveXmlFile(string XmlConfFile) { AdapterConf.Serialize(XmlConfFile, agObj.currAdpConf); } /// /// Salva su file l'oggetto di persistenza dati /// /// public void savePersistLayer(string filePath) { // in primis check semaforo salvataggio... if (!agObj.adpSaving) { // alzo semaforo salvataggio agObj.adpSaving = true; // se HO dei dati... if (agObj.persistenceLayer != null) { try { utils.WritePlain(agObj.persistenceLayer, filePath); } catch (Exception exc) { lg.Error(string.Format("Errore salvataggio file{0}{1}", Environment.NewLine, exc)); } } else { lg.Info("persistenceLayer null, non salvato..."); } // abbasso semaforo salvataggio agObj.adpSaving = false; } } /// /// Carica da file l'oggetto di persistenza dati /// /// public void loadPersistLayer(string filePath) { // inizializzo prima di leggere... agObj.persistenceLayer = new Dictionary(); agObj.persistenceLayer = utils.ReadPlain(filePath); // 2017.03.23 check problema files corrotti... if (agObj.persistenceLayer.Count == 0) { // se avesse letto un valore NON coerente (senza righe) PROVA a leggere a ritroso vecchi files... da histPersLayerFile e precedenti... int numDD = 0; int maxNumDD = utils.CRI("maxNumDD"); Dictionary lastRead = new Dictionary(); // continuo fino a che non leggo almeno 1 riga valida e non ho raggiunto maxDD while (numDD < maxNumDD && lastRead.Count == 0) { // leggo il file storico alla data anticipata... (ci provo...) try { lastRead = utils.ReadPlain(prevPersLayerFile(numDD)); } catch { } numDD++; } // se sono uscito PROVO a passare il file storico letto buono (oppure vuoto...) agObj.persistenceLayer = lastRead; } } #endregion #region accesso dati produzione /// /// Dati di produzione (su form) /// public prodData datiProd { get { prodData answ = new prodData(); // carico da form answ.Operator = OPERATOR_ID.Text; // variabili lette da + controlli answ.Status = stop.Enabled; answ.Power = Power; answ.AccTime = AccTime; answ.EmrStop = estop.Checked; answ.FuncMode = ((KeyValuePair)functionalMode.SelectedItem).Key; answ.MessageCode = messageCode.Text; answ.MessageText = messageText.Text; // parto vuoto con StatusBitMap... agObj.STATUS_FLAG = 0; // aggiorno status flag in base a valori... if (answ.EmrStop) { agObj.STATUS_FLAG = agObj.STATUS_FLAG | StatusBitMap.ESTOP; } if (automatic.Checked) { agObj.STATUS_FLAG = agObj.STATUS_FLAG | StatusBitMap.RM_AUTO; } else if (mdi.Checked) { agObj.STATUS_FLAG = agObj.STATUS_FLAG | StatusBitMap.RM_MDI; } else if (edit.Checked) { agObj.STATUS_FLAG = agObj.STATUS_FLAG | StatusBitMap.RM_EDIT; } else { agObj.STATUS_FLAG = agObj.STATUS_FLAG | StatusBitMap.RM_MANUAL; } if (running.Checked) { agObj.STATUS_FLAG = agObj.STATUS_FLAG | StatusBitMap.EM_RUN; } else if (feedhold.Checked) { agObj.STATUS_FLAG = agObj.STATUS_FLAG | StatusBitMap.EM_FEEDHOLD; } else if (stopped.Checked) { agObj.STATUS_FLAG = agObj.STATUS_FLAG | StatusBitMap.EM_STOP; } else if (ready.Checked) { agObj.STATUS_FLAG = agObj.STATUS_FLAG | StatusBitMap.EM_READY; } if (answ.FuncMode != "1") { agObj.STATUS_FLAG = agObj.STATUS_FLAG | StatusBitMap.HM; } // ritorno oggetto! return answ; } } private void pzKo_TextChanged(object sender, EventArgs e) { agObj.STROBE_PLC = agObj.STROBE_PLC | Strobe.PZ_KO; txtPzTot.Text = pzTot.ToString(); } protected int Power { get { int answ = 0; try { answ = Convert.ToInt32(txtPower.Text.Trim()); } catch { } return answ; } set { txtPower.Text = value.ToString(); } } protected int AccTime { get { int answ = 0; try { answ = Convert.ToInt32(txtAccTime.Text.Trim()); } catch { } return answ; } set { txtAccTime.Text = value.ToString(); } } protected int pzOk { get { int answ = 0; try { answ = Convert.ToInt32(txtPzOk.Text.Trim()); } catch { } return answ; } set { txtPzOk.Text = value.ToString(); txtPzTot.Text = pzTot.ToString(); } } protected int pzKo { get { int answ = 0; try { answ = Convert.ToInt32(txtPzKo.Text.Trim()); } catch { } return answ; } set { txtPzKo.Text = value.ToString(); txtPzTot.Text = pzTot.ToString(); } } protected int pzTot { get { return pzOk + pzKo; } } #endregion #region gestione Path private void cbPathSel_SelectedIndexChanged(object sender, EventArgs e) { hsPathFeed.Value = 50; hsPathFeedOver.Value = 50; hsPathSpeedOver.Value = 50; Random rnd = new Random(); PosAct.Rows[0].Cells[0].Value = rnd.Next(0, 1000); PosAct.Rows[0].Cells[1].Value = rnd.Next(0, 1000); PosAct.Rows[0].Cells[2].Value = rnd.Next(0, 1000); PosAct.Rows[0].Cells[3].Value = rnd.Next(0, 360); PosAct.Rows[0].Cells[4].Value = rnd.Next(0, 360); PosAct.Rows[0].Cells[5].Value = rnd.Next(0, 360); } /// /// Dati PATH /// public PathData CurrPath { get { PathData answ = new PathData(); // modifiche dati portati da macchina a path... answ.ProgramName = program.Text; answ.ProgrRow = PROG_ROW_NUM.Text; answ.PartId = partID.Text; answ.PathType = "LAVORO"; // pezzi answ.pzTot = pzOk + pzKo; if (automatic.Checked) { answ.RunMode = "AUTOMATIC"; } else if (mdi.Checked) { answ.RunMode = "MANUAL_DATA_INPUT"; } else if (edit.Checked) { answ.RunMode = "EDIT"; } else { answ.RunMode = "MANUAL"; } if (running.Checked) { answ.ExeMode = "ACTIVE"; } else if (feedhold.Checked) { answ.ExeMode = "FEED_HOLD"; } else if (stopped.Checked) { answ.ExeMode = "STOPPED"; } else if (ready.Checked) { answ.ExeMode = "READY"; } answ.ActiveAxes = "1 2 3 4 5 6"; // lascio sempre tutti attivi... answ.PathSel = cbPathSel.SelectedIndex; // FEED/SPEED answ.PathFeedrate = hsPathFeed.Value; answ.PathFeedrateOver = hsPathFeedOver.Value; answ.PathRapidOver = hsPathSpeedOver.Value; // posizione attuale position posAct = new position(); DataGridViewCellCollection cells = PosAct.Rows[0].Cells; float.TryParse(cells[0].Value.ToString(), out posAct.x); float.TryParse(cells[1].Value.ToString(), out posAct.y); float.TryParse(cells[2].Value.ToString(), out posAct.z); float.TryParse(cells[3].Value.ToString(), out posAct.i); float.TryParse(cells[4].Value.ToString(), out posAct.j); float.TryParse(cells[5].Value.ToString(), out posAct.k); answ.PathPosAct = posAct; // aggiungo altri oggetti... answ.CodG_Act = "G01 G10 G34 G60"; answ.SubMode = string.Format("# Asse selezionato {0} #", cbAxNum.SelectedIndex); // ritorno oggetto! return answ; } } #endregion #region gestione UnOp private void cbUnOpSel_SelectedIndexChanged(object sender, EventArgs e) { uoToolId.Text = "1"; uoNumCU.Text = "2"; uoStatus.Text = "RUN"; uoVitaRes.Text = "100"; uoSpeed.Text = "80"; uoLoad.Text = "80"; uoAccTime.Text = "0"; } /// /// Dati UnOp /// public UnOpData CurrUnOp { get { UnOpData answ = new UnOpData(); answ.UnOpSel = cbUnOpSel.SelectedIndex; int.TryParse(uoToolId.Text, out answ.UnOpToolId); int.TryParse(uoNumCU.Text, out answ.UnOpNumCU); answ.UnOpStatus = uoStatus.Text; int.TryParse(uoVitaRes.Text, out answ.UnOpVitaRes); answ.UnOpSpeed = uoSpeed.Value; answ.UnOpLoad = uoLoad.Value; int.TryParse(uoAccTime.Text, out answ.UnOpAccTime); // ritorno oggetto! return answ; } } private void uoLoad_Scroll(object sender, ScrollEventArgs e) { uoLoadVal.Text = uoLoad.Value.ToString(); } private void uoSpeed_Scroll(object sender, ScrollEventArgs e) { uoSpeedVal.Text = uoSpeed.Value.ToString(); } #endregion #region gestione assi private void cbAxNum_SelectedIndexChanged(object sender, EventArgs e) { // aggiorna visualizzazione asse... imposto valori standard x controlli AxMainProc.Text = "1"; AxIsMaster.Checked = false; AxMastId.Text = "0"; cbAxType.SelectedIndex = 0; AxDir.Text = "1"; AxLoad.Value = 50; AxPosition.Value = 50; AxFeedAct.Value = 50; AxFeedOver.Value = 100; AxAccelAct.Text = "0"; AxAccTime.Text = "0"; AxBatt.Text = "100"; } /// /// Dati di produzione (su form) /// public AxisData CurrAxis { get { Random rnd = new Random(); AxisData answ = new AxisData(); answ.AxisSel = cbAxNum.SelectedIndex; answ.AxisMainProc = AxMainProc.Text; answ.AxisIsMaster = AxIsMaster.Checked; answ.AxisMastId = AxMastId.Text; answ.AxisType = AxisType; answ.AxisDir = AxDir.Text; answ.AxisLoad = AxLoad.Value; answ.AxisPosAct = AxPosition.Value;// + rnd.Next(-2, 2); answ.AxisPosTgt = AxPosition.Value; answ.AxisFeedAct = AxFeedAct.Value; answ.AxisFeedOver = AxFeedOver.Value; answ.AxisAccel = AxAccelAct.Text; answ.AxisAccTime = AxAccTime.Text; answ.AxisBattery = AxBatt.Text; // restituisco oggetto return answ; } } protected string AxisType { get { string answ = ""; try { answ = cbAxType.SelectedItem.ToString(); ; } catch { } return answ; } } private void xLoad_Scroll(object sender, ScrollEventArgs e) { AxLoadValue.Text = AxLoad.Value.ToString(); } private void xPosition_Scroll(object sender, ScrollEventArgs e) { AxPositionValue.Text = AxPosition.Value.ToString(); } private void cLoad_Scroll(object sender, ScrollEventArgs e) { AxFeedActValue.Text = AxFeedAct.Value.ToString(); } private void cSpeed_Scroll(object sender, ScrollEventArgs e) { AxFeedOverValue.Text = AxFeedOver.Value.ToString(); } #endregion /// /// Stringa dati monitoraggio mostrata (1 SX)... /// public string dataMonitor_1 { get { return lblOutMessage.Text; } set { lblOutMessage.Text = value; } } /// /// Stringa dati monitoraggio mostrata (2 centro)... /// public string dataMonitor_2 { get { return lblOutMessage2.Text; } set { lblOutMessage2.Text = value; } } /// /// Stringa dati monitoraggio mostrata (3 dx)... /// public string dataMonitor_3 { get { return lblOutMessage3.Text; } set { lblOutMessage3.Text = value; } } private void SysErr_01_CheckedChanged(object sender, EventArgs e) { // aggiorno il vettore allarmi (da 128 byte) sulla base della selezione dei checkbox (per i primi 9...) - ultimi 3 selezionano 8 allarmi ciascuno... BitArray bitArray = new BitArray(1024); bitArray[7] = SysErr_01.Checked; bitArray[6] = SysErr_02.Checked; bitArray[5] = SysErr_03.Checked; bitArray[4] = PlcErr_01.Checked; bitArray[3] = PlcErr_02.Checked; bitArray[2] = PlcErr_03.Checked; bitArray[1] = CncErr_01.Checked; bitArray[0] = CncErr_02.Checked; bitArray[15] = CncErr_03.Checked; // ne assegno 8 alla volta... for (int i = 0; i < 8; i++) { bitArray[16 + i] = ErrRT_01.Checked; bitArray[24 + i] = ErrRT_02.Checked; bitArray[32 + i] = ErrRT_03.Checked; } byte[] newAlarm = utils.ToByteArray(bitArray); Buffer.BlockCopy(newAlarm, 0, agObj.currGateway.AlarmFlags, 0, 32); } private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { closeAdapter(); } private void closeAdapter() { fermaTutto(true, false); } /// /// Ferma tutti i componenti adapter + update buttons /// /// determina se fermare il timer (gather) principale (solo se non si chiude) /// determina se tentare di riconnettersi private void fermaTutto(bool stopTimer, bool tryRestart) { agObj.stopAdapter(tryRestart); // salvo! savePersistLayer(defPersLayerFile); savePersistLayer(histPersLayerFile); stop.Enabled = false; dump.Enabled = false; start.Enabled = true; if (stopTimer) { gather.Enabled = false; agObj.tryDisconnect(); } } } }