/// <summary> /// Zobrazení informací o programu (verze a pod...) /// </summary> private void comAboutExecute(object sender, ExecutedRoutedEventArgs e) { Vizualizace.Log(TypUdalosti.Info, "comAboutExecute"); WindowAbout aboutDlg = new WindowAbout(); aboutDlg.ShowDialog(); }
/// <summary> /// Globální ošetření vyjímek, na které programátor zapomněl /// </summary> public void GlobalExceptionHandler(Exception e) { Vizualizace.Log(TypUdalosti.Exception, e.Message); if (vizualizace != null) { vizualizace.ShowErrorMsg(e.Message + "\n\nAplikace bude ukončena."); } this.Close(); }
/// <summary> /// PLC nekomunikuje (Nebliká LiveBit, zobrazí se odpočet pro vypnutí PC) /// </summary> void watchDogShutdown_OnTimeout() { Vizualizace.Log(TypUdalosti.Info, "Aktivován odpočet do vypnutí PC"); WindowShutdown winShutdown = new WindowShutdown(60); winShutdown.OnTestKomunikace += () => { return(watchDogShutdown.Aktivni); }; //WindowShutdown se pomocí události OnTestKomunikace dotazuje, zda PLC již náhodou opět nekomunikuje if (winShutdown.ShowDialog().Value) { Vizualizace.Log(TypUdalosti.Info, "Vizualizace vypíná PC"); System.Diagnostics.Process.Start("shutdown", "-s -t 00"); mainWinRef.Close(); } }
/// <summary> /// Reakce na událost OPC clienta, že došlo k chybě komunikace se serverem. Chybu komunikace PLC s OPC serverem je nutné ošetřit jinak - např. livebitem /// </summary> private void opcClient_OnChybaKomunikace(string Message, bool autorestart) { Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate { if (autorestart) { Vizualizace.Log(TypUdalosti.Error, Message + ". Pokusím se o restart komunikace."); } else { HandlerChyby("Chyba komunikace s OPC serverem!\n" + Message, true); } })); }
/// <summary> /// Zobrazí se návod k aplikaci v nainstalovaném PDF prohlížeči /// </summary> private void comNnavodExecute(object sender, ExecutedRoutedEventArgs e) { try { System.Diagnostics.Process.Start(InitInfo.AdresarAplikace + @"\Data\Navod.pdf"); Vizualizace.Log(TypUdalosti.Info, "comNnavodExecute"); } catch (Exception ex) { Vizualizace.Log(TypUdalosti.Error, "Nepodařilo se otevřít soubor s návodem. Message: " + ex.ToString()); MessageBox.Show("Nepodařilo se otevřít soubor s návodem\n\n" + ex.Message, "Chyba", MessageBoxButton.OK, MessageBoxImage.Error); } e.Handled = true; }
/// <summary> /// Vytvoření a zobrazení okna pro ovládání stroje v režimu seřizování, načtení textů z XML, obsluha událostí... /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void comIOExecute(object sender, ExecutedRoutedEventArgs e) { Strana str = WinVyberStrany.VyberStrany(false); bool rightSide = ((str & Strana.Prava) != 0); string strXml = @"\Data\SerizovaniL.xml"; WindowSerizovani winSerizovani = vizualizace.WinSerizovaniL; if (rightSide) { strXml = @"\Data\SerizovaniP.xml"; } if ((str != Strana.Zadna) && (InitInfo.Ladeni || (vizualizace.Stroj.OpcClient != null && vizualizace.Stroj.OpcClient.PrijataData.EnableManual.Value))) { try { Vizualizace.Log(TypUdalosti.Info, "Aktivován režim seřizování"); winSerizovani = new WindowSerizovani(InitInfo.AdresarAplikace + strXml); winSerizovani.Title = rightSide ? "Seřizování - Pravá strana" : "Seřizování - Levá strana"; if (rightSide) { vizualizace.WinSerizovaniP = winSerizovani; } else { vizualizace.WinSerizovaniL = winSerizovani; } winSerizovani.ShowDialog(); vizualizace.WinSerizovaniL = null; vizualizace.WinSerizovaniP = null; } catch (Exception ex) { try { winSerizovani.Close(); } catch { } winSerizovani = null; string strErr = "Nepodařilo se vytvořit formulář vstupů/výstupů. "; vizualizace.HandlerChyby(strErr + "Message: " + ex.Message, false); } } }
/// <summary> /// Inicializace watchdogů, které budou hlídat, jestli bliká livebit /// </summary> private void inicializaceWatchDogu() { watchDog = new WatchDog(8); watchDog.OnTimeout += () => { mainWinRef.labelErrKomunikacePLC.Visibility = Visibility.Visible; //Varovná hláška, že PLC nekomunikuje Vizualizace.Log(TypUdalosti.Warning, "PLC nekomunikuje"); }; watchDog.OnReseted += () => { mainWinRef.labelErrKomunikacePLC.Visibility = Visibility.Collapsed; }; Stroj.OpcClient.PrijataData.LiveBitCopy.OnChangeValue += (varValue) => { watchDog.Reset(); }; watchDogShutdown = new WatchDog(40); XmlRW xmlRw = new XmlRW(InitInfo.AdresarDat + SettingsXml); if (xmlRw.ReadBool("ShutdounWatchdog", "Enable", true) && !InitInfo.Ladeni) { watchDogShutdown.OnTimeout += new WatchDog.TimeoutHandler(watchDogShutdown_OnTimeout); //Vypnutí PC } Stroj.OpcClient.PrijataData.LiveBitCopy.OnChangeValue += (varValue) => { watchDogShutdown.Reset(); }; }
/// <summary> /// Konstruktor hlavního okna, při jeho provádění je zobrazen splashscreen /// </summary> public MainWindow() { InitializeComponent(); vizualizace = VizualizaceZ215060_8.Instance; //Inicializace základní třídy vizualizace Vizualizace.Log(TypUdalosti.Info, "Spuštění programu (Verze " + WindowAbout.GetVersion() + ")"); /*nacistDataZXml();*/ if (InitInfo.ParWait != 0) //Prodleva před inicializací (aplikace byla spuštěna s parametrem "/Wait") { System.Threading.Thread.Sleep(InitInfo.ParWait); } // VyssiOpravneni = new Role("VyssiOpravneni", InitInfo.AdresarDat + SettingsXml, 5); //Objekt sloužící k přihlášení do vyššího uživatelského oprávnění a odhlášení VizualizaceZ215060_8.VyssiOpravneni.OnAutologout += () => { ((ICommand)CommandLogout).Execute(null); }; //Zavolání commandu logout Poznámka: pokud by zde bylo this.comLogoutExecute(this, null);, LogOut by se zavolal i když hlavní okno nemá focus. To by ale mohlo způsovit, že by se nějaké modální okno (např WinSeřizování) dospalo při přechodu do celoobrazovkového režimu dolu a aplikace by jakoby vytuhla. akce(); try { vizualizace.InicializaceVizualizace(); } catch (Exception ex) { vizualizace.HandlerChyby("Chyba při inicializaci vizualizace: " + ex.Message, true); } if (InitInfo.Ladeni) { Vizualizace.Log(TypUdalosti.Info, "Aktivován režim \"ladění\""); this.Title = this.Title + " ***REŽIM LADĚNÍ***"; } else { StackPanelLadeni.Visibility = Visibility.Collapsed; } InitInfo.InitDone = true; }
/// <summary> /// Reakce na chybu - vhození hlášky, zapsání do logu, případně ukončení aplikace /// </summary> /// <param name="hlaska"></param> /// <param name="ukonceni"></param> public void HandlerChyby(string hlaska, bool ukonceni) { dispatcher.Invoke(DispatcherPriority.Send, new Action(delegate { string strLog = hlaska; string strMess = hlaska; if (ukonceni) { string konec = " Aplikace bude ukončena"; strLog += konec; strMess += "\n\n" + konec; } Vizualizace.Log(TypUdalosti.Error, strLog); ShowErrorMsg(strMess); if (ukonceni) { MainWindow mw = Application.Current.MainWindow as MainWindow; if (mw != null) { mw.Close(); } } })); }
/// <summary> /// Vynulování statistik /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void comVynulovatExecute(object sender, ExecutedRoutedEventArgs e) { Strana str = WinVyberStrany.VyberStrany(true); if (str != Strana.Zadna) { MessageBoxResult mBRes = MessageBox.Show("Chcete opravdu vynulovat statistiky?", "Vynulování", MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No); if (mBRes == MessageBoxResult.Yes) { vizualizace.Stroj.OpcClient.DataKOdeslani.L.ResetStatistik.Value = ((str & Strana.Leva) != 0); vizualizace.Stroj.OpcClient.DataKOdeslani.P.ResetStatistik.Value = ((str & Strana.Prava) != 0); DispatcherTimer dt = new DispatcherTimer(); dt.Interval = TimeSpan.FromSeconds(2); dt.Tick += (se, ea) => { vizualizace.Stroj.OpcClient.DataKOdeslani.L.ResetStatistik.Value = false; vizualizace.Stroj.OpcClient.DataKOdeslani.P.ResetStatistik.Value = false; dt.Stop(); }; dt.Start(); Vizualizace.Log(TypUdalosti.Info, "Vynulovány statistiky"); } } }
//Metody pro obsluhu různých událostí (klávesové zkratky, ukonření aplikace, neošetřený vyjímka apod...) #region Udalosti //Ukončení aplikace private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { vizualizace.UvolnitZdroje(); Vizualizace.Log(TypUdalosti.Info, "Ukončení programu"); }