/*
 * Vytvoreno aplikací SharpDevelop.
 * Uživatel: Cudík
 * Datum: 2.1.2009
 * Cas: 14:05
 * 
 * Tento template mužete zmenit pomocí Nástroje | Možnosti | Psaní kódu | Upravit standardní hlavicky souboru.
 */

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Text;
using KomponentyCIP;
using System.Timers;

namespace CistícíStancie
{
	/// <summary>
	/// Description of MainForm.
	/// </summary>
	public partial class MainForm : Form
	{
		#region Deklarace Atributu
		
		// Komunikacni modul s S7-PLCSIM
		private PLCSIM ConnectionPLCSIM;
		
		private double PeriodaVzorkovani;
		private double PeriodaVykreslovani;
		private double PeriodaPrenosuData;
		
		private double TeplotaOkoli;
		private double MernaTepelnaKapacita;
		private double CasoveZrychleni;
		
		// Promenne graficke vizualizace
		private Point[] BodyPotrubi = new Point[48];  // Pole obsahujici body pouzite pro vykreslovani potrubi
		
		// Flag inicializace komponent CIP Stanice
		private bool Init = false;
		
		// Pomocne promenne pro zmenu velikosti
		private double Width_old;
		private double Height_old;
		private bool Minimalizovano;
		
		// Promenne indikujici stav simulace
		private bool SimulaceSpustena;
		private bool RizeniOdPLC;
		private bool RizeniOdUzivatele;
		private bool KomunikaceS7_PLCSIM;
		private bool KomunikacePLC;
		
		// Komponenty stanice s grafickym rozhranim
		public KomponentyCIP.Tank TankNaOH;
		public KomponentyCIP.Tank TankHNO3;
		public KomponentyCIP.Tank TankVypVoda;
		public KomponentyCIP.Tank TankCisVoda;
		
		public KomponentyCIP.Klapka BV104_03;
		public KomponentyCIP.Klapka BV103_03;
		public KomponentyCIP.Klapka BV102_05;
		public KomponentyCIP.Klapka BV100_01;
		public KomponentyCIP.Klapka BV101_03;
		public KomponentyCIP.Klapka BV101_01;
		public KomponentyCIP.Klapka BV102_01;
		public KomponentyCIP.Klapka BV103_01;
		public KomponentyCIP.Klapka BV104_01;
		
		public KomponentyCIP.Cerpadlo CP109;
		public KomponentyCIP.Cerpadlo CP107;
		public KomponentyCIP.Cerpadlo CP106;
		
		public KomponentyCIP.StridaciVentil SSV109_01;
		public KomponentyCIP.Vymenik THE_105;
		public KomponentyCIP.Vymenik THE_106;
		public KomponentyCIP.NadrzKoncentratu DP111;
		public KomponentyCIP.NadrzKoncentratu DP112;
		
		public KomponentyCIP.Snimac QIC109_03;
		public KomponentyCIP.Snimac TIC109_02;	
		public KomponentyCIP.Snimac FIC109_01;	
		public KomponentyCIP.Snimac TIC102_03;	
		public KomponentyCIP.Snimac TIC103_03;
		public KomponentyCIP.Snimac TIC105_02;
		public KomponentyCIP.Snimac QIC105_01;
		public KomponentyCIP.Snimac TIC106_02;
		public KomponentyCIP.Snimac QIC106_01;
					
		
		// Casovac prenosu dat mezi PLC nebo PLCSIM
		private System.Timers.Timer CasovacPrenosuDat;
		
		// Casovac pro vizualizaci
		private System.Timers.Timer CasovacPrekresleni;
				
		// Instance tridy s numerickym modelem
		private KomponentyCIP.NumerickyModelCIP NumerikcyModel;
		
		// Časovač spouštějící asynchronně metodu numerického modelu.
		private System.Threading.Timer CasovacSimulace;
		
		#endregion 
		

		#region Funkce Evnetu

		// Funkce eventu pohybu mysi
		[System.ComponentModel.EditorBrowsableAttribute()]
		protected override void OnMouseMove(MouseEventArgs e)
		{
			base.OnMouseMove(e);
			
			if(this.SimulaceSpustena && this.RizeniOdUzivatele)  				// Pokud je spustena simulace a je predano rizeni uzivatly
				
				if(KomponentyCIP.DelgateMetod.InstanceDelegatMove != null)
					KomponentyCIP.DelgateMetod.InstanceDelegatMove(e.X, e.Y);	// Kontroluj, zda se kurzor mysi nenachazi nad nejakou komponenotou
		}
		
		// Funkce eventu kliknuti mysi
		private void OnClickEvent(object Sender, EventArgs e){
			
			// Pokud je spustena simulace a pokud je rizeni predano uzivately
			if( this.SimulaceSpustena && this.RizeniOdUzivatele){
				
				// Zavola funkce spoustejici udalost click jednotlivych komponent 
				if(KomponentyCIP.DelgateMetod.InstanceDelegatClic != null)
					KomponentyCIP.DelgateMetod.InstanceDelegatClic();
				this.CopyZadaneHod();
				
			}
		}
		
		// Funkce eventu zmeny velikosti
		protected void OnResizeEndEvent(object Sender, EventArgs e)
		{			
			// Zjisti, zda okno nebylo minimalizovano
			if(this.WindowState == FormWindowState.Minimized)
			 	this.Minimalizovano = true;
			else
				this.Minimalizovano = false;
			
			// Pokud jsou komponenty inicializovany a okno neni minimalizovano, provede přepočet bodu
			if(Init && !this.Minimalizovano){
				
				// Vypočte poměr změn velikosti okna v obouch směrech
				double PomerX = this.ClientSize.Width/Width_old;
				double PomerY = this.ClientSize.Height/Height_old;
				
				// Upravi jednotlive komponenty
				if(KomponentyCIP.DelgateMetod.InstanceDelegatResize != null)
					KomponentyCIP.DelgateMetod.InstanceDelegatResize(PomerX, PomerY);
				
				// Prepocet bodu potrubi
				this.VypocetBoduPotrubi();
			
				this.Width_old = this.ClientSize.Width;
				this.Height_old = this.ClientSize.Height;
				
			}
				
		}
		
		// Funkce eventu vykresleni ONPAINT
		private void OnPaintEvent(object Sender, PaintEventArgs e)
		{
			Graphics gfx = e.Graphics;
			
			if( KomponentyCIP.DelgateMetod.InstanceDelegatDrawToScren != null){
			
				// Volani metod pro vykresleni  komponent CIP pres delegata 	
				 KomponentyCIP.DelgateMetod.InstanceDelegatDrawToScren(gfx);
			
				// Volani funkce pro vykresleni potrubi
				DrawPipeline(gfx);
			
			}

		}
		
		//Fukce eventu Casovace Prekresleni
		private void OnTimerDrawElapsed(object Sender, EventArgs e){
			
			// Nacteni stavu modelu
			this.CopyState();
			
			// Vyvola prekresleni obrazovky
			this.Invalidate();
			
		}
		
		// Funkce volana pri ukonceni programu
		private void FunkceEventuClose(object Sender, EventArgs e){
			
			// Ukonceni aktivních komunikací
			if(this.KomunikaceS7_PLCSIM){
				this.ConnectionPLCSIM.DisconnectPLCSIM();
				this.KomunikaceS7_PLCSIM = false;
			}
		}
		
		//Funkce eventu spusteni simulace ( Polozka v MENU )
		private void MENUStartClickEvetn(object Sender, EventArgs e)
		{
			
			if( !this.SimulaceSpustena ){ 				// Pokud jiz simulace nejede
				
				// Spusteni Casovace prekresleni
				CasovacPrekresleni.Interval = Convert.ToInt32(this.PeriodaVykreslovani*1000);
				CasovacPrekresleni.Enabled = true;
			
				// Nastaveni periody vzorkovani pro numericky model
				this.NumerikcyModel.SetSampleTime(this.PeriodaVzorkovani);
				// Nastaveni teploty okolního prostředí v modelu
				this.NumerikcyModel.SetTeplotaOkoli(this.TeplotaOkoli);
				// Nastaveni merne tepelne kapacity roztoku (vody)
				this.NumerikcyModel.SetMTK(this.MernaTepelnaKapacita);
				
				// Spusteni Casovace vlakna s numerickym modelem
				CasovacSimulace = new System.Threading.Timer( new System.Threading.TimerCallback(this.NumerikcyModel.KrokSimulace),null,0, Convert.ToInt32(PeriodaVzorkovani*1000/CasoveZrychleni));
		
				// Nastaveni flagu informujiciho o stavu simulace
				this.SimulaceSpustena = true;
				
				// Zakazani polozek v menu
				this.Menu.MenuItems[1].Enabled = false;
			}
		}
		
		//Funkce eventu Zastaveni simulace ( Polozka v MENU )
		private void MENUStopClickEvetn(object Sender, EventArgs e)
		{
			
			// Vypnuti casovace zajistujiciho vyzualizaci
			CasovacPrekresleni.Enabled = false;
			
			// Odstraneni casovace vlakna provadejiciho simulacni kroky numerickeho modelu
			if(CasovacSimulace != null){
				CasovacSimulace.Dispose();
				this.CasovacSimulace = null;
			}
			
			// Nastaveni flagu informujiciho o stavu simulace
			this.SimulaceSpustena = false;
			this.RizeniOdPLC = true;
			this.RizeniOdUzivatele = false;
			
			// Zvyditelnění položky 
			this.Menu.MenuItems[1].Enabled = true;

		}
		
		// Funkce eventu Reset Simulace MENU -> SIMULACE
		private void MENUResetSimulaceEvetn(object Sender, EventArgs e){
			
			// Provede reset num. modelu
			this.NumerikcyModel.Reset();
			
			// Pokud vypnuta simulace (prekreslovani), prekresli obrazovku
			if(! this.SimulaceSpustena){
				
				this.CopyState();
				this.Invalidate();
			}
		}
		
		// Funkce eventu Rizeni z PLC ( Polozka v MENU )
		private void MENURizeniPLCEvetn(object Sender, EventArgs e){
			
			this.RizeniOdPLC = true;
			this.RizeniOdUzivatele = false;
			
			// Prepnuti radio Butonu
			this.Menu.MenuItems[0].MenuItems[3].MenuItems[0].Checked = RizeniOdPLC;    //Menu->Simulac->Ovladani-> Ovladani PLC
		    this.Menu.MenuItems[0].MenuItems[3].MenuItems[1].Checked = RizeniOdUzivatele;    //Menu->Simulac->Ovladani-> Ovladani PLC
		}
		
		// Funkce eventu Rizeni modelu uzivatelem ( Polozka v MENU )
		private void MENURizeniUzivEvetn(object Sender, EventArgs e){
			
			this.RizeniOdPLC = false;
			this.RizeniOdUzivatele = true;
			
			// Prepnuti radio Butonu
			this.Menu.MenuItems[0].MenuItems[3].MenuItems[0].Checked = RizeniOdPLC;    //Menu->Simulac->Ovladani-> Ovladani PLC
		    this.Menu.MenuItems[0].MenuItems[3].MenuItems[1].Checked = RizeniOdUzivatele;    //Menu->Simulac->Ovladani-> Ovladani PLC
		}
		
		// Funkce spoustena pri kliknuti na Nenu
		private void MenuClickEvent(object Sender, EventArgs e){
			
			// Uprava pristupnosti jednotlivych nabidek
			if(this.SimulaceSpustena){
				this.Menu.MenuItems[0].MenuItems[0].Enabled = false;   //Menu->Simulac->Start
				this.Menu.MenuItems[0].MenuItems[1].Enabled = true;    //Menu->Simulac->Stop
				this.Menu.MenuItems[0].MenuItems[3].Enabled = true;    //Menu->Simulac->Ovladani
				this.Menu.MenuItems[0].MenuItems[3].MenuItems[0].Enabled = true;    //Menu->Simulac->Ovladani-> Ovladani PLC
				this.Menu.MenuItems[0].MenuItems[3].MenuItems[1].Enabled = true;    //Menu->Simulac->Ovladani-> Ovladani PLC
				
			} else {
				
				this.Menu.MenuItems[0].MenuItems[0].Enabled = true;     //Menu->Simulac->Start
				this.Menu.MenuItems[0].MenuItems[1].Enabled = false;    //Menu->Simulac->Stop
				this.Menu.MenuItems[0].MenuItems[3].Enabled = false;    //Menu->Simulac->Ovladani
			}
			
			if(this.KomunikaceS7_PLCSIM){
				this.Menu.MenuItems[2].MenuItems[0].Enabled = false;
				this.Menu.MenuItems[2].MenuItems[1].Enabled = true;	
			} else {
				
				this.Menu.MenuItems[2].MenuItems[0].Enabled = true;
				this.Menu.MenuItems[2].MenuItems[1].Enabled = false;	
			}
		
			
		}
		
		// Funkce spuostena pri Kliktnuti na nastaveni simulace
		private void MENUNastaveniSimulaceClick(object Sender, EventArgs e){
		
			// Inicializace prislusneho dialogu
			DiagloNastaveniSimulace Dialog = new DiagloNastaveniSimulace();
			Dialog.SamplePeriod = this.PeriodaVzorkovani;
			Dialog.DrawingPeriod = this.PeriodaVykreslovani;
			Dialog.TeplotaOkoli = this.TeplotaOkoli;
			Dialog.MKT = this.MernaTepelnaKapacita;
			Dialog.CasZrychleni = this.CasoveZrychleni;
			
			// Zobrazení dialogu
			Dialog.ShowDialog();
			

			// Pokud byl dialog ukoncen tlacitkem OK
			if(Dialog.DialogResult == DialogResult.OK){
				
				// Zkopiruji se nove nastavene hodnoty
				this.PeriodaVzorkovani = Dialog.SamplePeriod;
				this.PeriodaVykreslovani = Dialog.DrawingPeriod;
				this.TeplotaOkoli = Dialog.TeplotaOkoli;
				this.CasoveZrychleni = Dialog.CasZrychleni;
				this.MernaTepelnaKapacita = Dialog.MKT;
				
				// Nastaveni nove periody vzorkovani v modelu
				this.NumerikcyModel.SetSampleTime(this.PeriodaVzorkovani);
				// Nastaveni nove teploty okoli v tanku
				this.NumerikcyModel.SetTeplotaOkoli(this.TeplotaOkoli);
				// Nastaveni merne tepelne kapacity roztoku (vody)
				this.NumerikcyModel.SetMTK(this.MernaTepelnaKapacita);
				
				// Prenastavi se casovace
				if(this.CasovacPrekresleni.Enabled == true)							// Pokud je casovac spuštěn
					this.CasovacPrekresleni.Interval = this.PeriodaVykreslovani*1000;	// Přenastaví se jeho interval
				
				if(this.CasovacSimulace != null)	// Pkud bezi casovac simulac
					this.CasovacSimulace.Change(0, Convert.ToInt32(this.PeriodaVzorkovani*1000/this.CasoveZrychleni));
			}
		}
		
		// Funkce spostena pri kliknunti na menu MENU -> KOMPONENTY CIP -> NASTAVENI TANKU
		private void MENUNastaveniTankuClck(object Sender, EventArgs e){
			
			// Pokud není simulace spuštěna
			if(!this.SimulaceSpustena){
				
				// Vytvori dialog
				DialogNastaveniTanku dialog = new DialogNastaveniTanku();
				
				// Inicializace prvku dialogu
				dialog.DataTankCisVoda.Objem = this.NumerikcyModel.TankCisVoda.MaximalniObjem;
				dialog.DataTankCisVoda.Prumer = this.NumerikcyModel.TankCisVoda.Prumer;
				dialog.DataTankCisVoda.TeplotniVodivost = this.NumerikcyModel.TankCisVoda.TepelnaVodivostSteny;
				dialog.DataTankCisVoda.TloustkaSteny = this.NumerikcyModel.TankCisVoda.TloustkaStenyTanku;
				dialog.DataTankCisVoda.ResetHladina = this.NumerikcyModel.TankCisVoda.ResetHodnotaObjemu;
				dialog.DataTankCisVoda.ResetKoncentrace = this.NumerikcyModel.TankCisVoda.ResetHodnotaKoncentrace;
				
				dialog.DataTankVyplVoda.Objem = this.NumerikcyModel.TankVypVoda.MaximalniObjem;
				dialog.DataTankVyplVoda.Prumer = this.NumerikcyModel.TankVypVoda.Prumer;
				dialog.DataTankVyplVoda.TeplotniVodivost = this.NumerikcyModel.TankVypVoda.TepelnaVodivostSteny;
				dialog.DataTankVyplVoda.TloustkaSteny = this.NumerikcyModel.TankVypVoda.TloustkaStenyTanku;
				dialog.DataTankVyplVoda.ResetHladina = this.NumerikcyModel.TankVypVoda.ResetHodnotaObjemu;
				dialog.DataTankVyplVoda.ResetKoncentrace = this.NumerikcyModel.TankVypVoda.ResetHodnotaKoncentrace;
				
				dialog.DataTankHNO3.Objem = this.NumerikcyModel.TankHNO3.MaximalniObjem;
				dialog.DataTankHNO3.Prumer = this.NumerikcyModel.TankHNO3.Prumer;
				dialog.DataTankHNO3.TeplotniVodivost = this.NumerikcyModel.TankHNO3.TepelnaVodivostSteny;
				dialog.DataTankHNO3.TloustkaSteny = this.NumerikcyModel.TankHNO3.TloustkaStenyTanku;
				dialog.DataTankHNO3.ResetHladina = this.NumerikcyModel.TankHNO3.ResetHodnotaObjemu;
				dialog.DataTankHNO3.ResetKoncentrace = this.NumerikcyModel.TankHNO3.ResetHodnotaKoncentrace;
				
				dialog.DataTankNaOH.Objem = this.NumerikcyModel.TankNaOH.MaximalniObjem;
				dialog.DataTankNaOH.Prumer = this.NumerikcyModel.TankNaOH.Prumer;
				dialog.DataTankNaOH.TeplotniVodivost = this.NumerikcyModel.TankNaOH.TepelnaVodivostSteny;
				dialog.DataTankNaOH.TloustkaSteny = this.NumerikcyModel.TankNaOH.TloustkaStenyTanku;
				dialog.DataTankNaOH.ResetHladina = this.NumerikcyModel.TankNaOH.ResetHodnotaObjemu;
				dialog.DataTankNaOH.ResetKoncentrace = this.NumerikcyModel.TankNaOH.ResetHodnotaKoncentrace;
				
				dialog.DataTankKoncentratuHNO3.Objem = this.NumerikcyModel.DP111.MaximalniObjem;
				dialog.DataTankKoncentratuHNO3.Koncentrace = this.NumerikcyModel.DP111.Koncetntace;
				dialog.DataTankKoncentratuHNO3.ResetrObjem = this.NumerikcyModel.DP111.ResetHodnotaObjemu;
				dialog.DataTankKoncentratuHNO3.ResetCerpadlo = this.NumerikcyModel.DP111.ResetCerpadlaKoncentratu;

				dialog.DataTankKoncentratuNaOH.Objem = this.NumerikcyModel.DP112.MaximalniObjem;
				dialog.DataTankKoncentratuNaOH.Koncentrace = this.NumerikcyModel.DP112.Koncetntace;
				dialog.DataTankKoncentratuNaOH.ResetrObjem = this.NumerikcyModel.DP112.ResetHodnotaObjemu;
				dialog.DataTankKoncentratuNaOH.ResetCerpadlo = this.NumerikcyModel.DP112.ResetCerpadlaKoncentratu;
				
				// Zobrazeni dialogu
				dialog.ShowDialog();
				
				// Pokud byl dialog ukoncen stisknutim tlacitka OK, 
				// dojde k ulozeni nastavených dat
				if(dialog.DialogResult == DialogResult.OK){
				

					this.NumerikcyModel.TankCisVoda.MaximalniObjem = dialog.DataTankCisVoda.Objem;
					this.NumerikcyModel.TankCisVoda.Prumer = dialog.DataTankCisVoda.Prumer;
					this.NumerikcyModel.TankCisVoda.TepelnaVodivostSteny = dialog.DataTankCisVoda.TeplotniVodivost;
					this.NumerikcyModel.TankCisVoda.TloustkaStenyTanku = dialog.DataTankCisVoda.TloustkaSteny;
					this.NumerikcyModel.TankCisVoda.ResetHodnotaObjemu = dialog.DataTankCisVoda.ResetHladina;
					this.NumerikcyModel.TankCisVoda.ResetHodnotaKoncentrace = dialog.DataTankCisVoda.ResetKoncentrace;
				
					this.NumerikcyModel.TankVypVoda.MaximalniObjem = dialog.DataTankVyplVoda.Objem;
					this.NumerikcyModel.TankVypVoda.Prumer = dialog.DataTankVyplVoda.Prumer;
					this.NumerikcyModel.TankVypVoda.TepelnaVodivostSteny = dialog.DataTankVyplVoda.TeplotniVodivost;
					this.NumerikcyModel.TankVypVoda.TloustkaStenyTanku = dialog.DataTankVyplVoda.TloustkaSteny;
					this.NumerikcyModel.TankVypVoda.ResetHodnotaObjemu = dialog.DataTankVyplVoda.ResetHladina;
					this.NumerikcyModel.TankVypVoda.ResetHodnotaKoncentrace = dialog.DataTankVyplVoda.ResetKoncentrace;
				
					this.NumerikcyModel.TankHNO3.MaximalniObjem = dialog.DataTankHNO3.Objem;
					this.NumerikcyModel.TankHNO3.Prumer = dialog.DataTankHNO3.Prumer;
					this.NumerikcyModel.TankHNO3.TepelnaVodivostSteny = dialog.DataTankHNO3.TeplotniVodivost;
					this.NumerikcyModel.TankHNO3.TloustkaStenyTanku = dialog.DataTankHNO3.TloustkaSteny;
					this.NumerikcyModel.TankHNO3.ResetHodnotaObjemu = dialog.DataTankHNO3.ResetHladina;
					this.NumerikcyModel.TankHNO3.ResetHodnotaKoncentrace = dialog.DataTankHNO3.ResetKoncentrace;
				
					this.NumerikcyModel.TankNaOH.MaximalniObjem = dialog.DataTankNaOH.Objem;
					this.NumerikcyModel.TankNaOH.Prumer = dialog.DataTankNaOH.Prumer;
					this.NumerikcyModel.TankNaOH.TepelnaVodivostSteny = dialog.DataTankNaOH.TeplotniVodivost;
					this.NumerikcyModel.TankNaOH.TloustkaStenyTanku = dialog.DataTankNaOH.TloustkaSteny;
					this.NumerikcyModel.TankNaOH.ResetHodnotaObjemu = dialog.DataTankNaOH.ResetHladina;
					this.NumerikcyModel.TankNaOH.ResetHodnotaKoncentrace = dialog.DataTankNaOH.ResetKoncentrace;
				
					this.NumerikcyModel.DP111.MaximalniObjem = dialog.DataTankKoncentratuHNO3.Objem;
					this.NumerikcyModel.DP111.Koncetntace = dialog.DataTankKoncentratuHNO3.Koncentrace;
					this.NumerikcyModel.DP111.ResetHodnotaObjemu = dialog.DataTankKoncentratuHNO3.ResetrObjem;
					this.NumerikcyModel.DP111.ResetCerpadlaKoncentratu = dialog.DataTankKoncentratuHNO3.ResetCerpadlo;
				
					this.NumerikcyModel.DP112.MaximalniObjem = dialog.DataTankKoncentratuNaOH.Objem;
					this.NumerikcyModel.DP112.Koncetntace = dialog.DataTankKoncentratuNaOH.Koncentrace;
					this.NumerikcyModel.DP112.ResetHodnotaObjemu = dialog.DataTankKoncentratuNaOH.ResetrObjem;
					this.NumerikcyModel.DP112.ResetCerpadlaKoncentratu = dialog.DataTankKoncentratuNaOH.ResetCerpadlo;
				}
			
			
			}
		}
		
		// Funkce spoustena pri kliknunti na menu MENU -> KOMPONENTY CIP -> NASTAVENI VENTILU
		private void MENUNastaveniVentiluClck(object Sender, EventArgs e){
			
			if( ! this.SimulaceSpustena ){		// Pokud není spuštěna simulace
				
				// inicializace dialogu
				DialogNastaveniKlapek dialog = new DialogNastaveniKlapek();
				
				// naplnění dialogu hodnotami
				dialog.BV100_01.CasovaKonstanta = this.NumerikcyModel.BV100_01.Casova_konstanta;
				dialog.BV100_01.StavPoResetu = this.NumerikcyModel.BV100_01.StavPoResetu;
				dialog.BV101_01.CasovaKonstanta = this.NumerikcyModel.BV101_01.Casova_konstanta;
				dialog.BV101_01.StavPoResetu = this.NumerikcyModel.BV101_01.StavPoResetu;
				dialog.BV101_03.CasovaKonstanta = this.NumerikcyModel.BV101_03.Casova_konstanta;
				dialog.BV101_03.StavPoResetu = this.NumerikcyModel.BV101_03.StavPoResetu;
				dialog.BV102_01.CasovaKonstanta = this.NumerikcyModel.BV102_01.Casova_konstanta;
				dialog.BV102_01.StavPoResetu = this.NumerikcyModel.BV102_01.StavPoResetu;
				dialog.BV102_05.CasovaKonstanta = this.NumerikcyModel.BV102_05.Casova_konstanta;
				dialog.BV102_05.StavPoResetu = this.NumerikcyModel.BV102_05.StavPoResetu;
				dialog.BV103_01.CasovaKonstanta = this.NumerikcyModel.BV103_01.Casova_konstanta;
				dialog.BV103_01.StavPoResetu = this.NumerikcyModel.BV103_01.StavPoResetu;
				dialog.BV103_03.CasovaKonstanta = this.NumerikcyModel.BV103_03.Casova_konstanta;
				dialog.BV103_03.StavPoResetu = this.NumerikcyModel.BV103_03.StavPoResetu;
				dialog.BV104_01.CasovaKonstanta = this.NumerikcyModel.BV104_01.Casova_konstanta;
				dialog.BV104_01.StavPoResetu = this.NumerikcyModel.BV104_01.StavPoResetu;
				dialog.BV104_03.CasovaKonstanta = this.NumerikcyModel.BV104_03.Casova_konstanta;
				dialog.BV104_03.StavPoResetu = this.NumerikcyModel.BV104_03.StavPoResetu;
				dialog.SSV109_01.CasovaKonstanta = this.NumerikcyModel.SSV109_01.Casova_konstanta;
				dialog.SSV109_01.StavPoResetu = this.NumerikcyModel.SSV109_01.StavPoResetu;
				
				// Zobrazeni dialogu
				dialog.ShowDialog();
				
				// Pokud byl dialog ukoncen tlacitkem OK ulozi se nove hodnoty
				if(dialog.DialogResult == DialogResult.OK)
				{
					this.NumerikcyModel.BV100_01.Casova_konstanta = dialog.BV100_01.CasovaKonstanta;
					this.NumerikcyModel.BV100_01.StavPoResetu = dialog.BV100_01.StavPoResetu;
					this.NumerikcyModel.BV101_01.Casova_konstanta = dialog.BV101_01.CasovaKonstanta;
					this.NumerikcyModel.BV101_01.StavPoResetu = dialog.BV101_01.StavPoResetu;
					this.NumerikcyModel.BV101_03.Casova_konstanta = dialog.BV101_03.CasovaKonstanta;
					this.NumerikcyModel.BV101_03.StavPoResetu = dialog.BV101_03.StavPoResetu;
					this.NumerikcyModel.BV102_01.Casova_konstanta = dialog.BV102_01.CasovaKonstanta;
					this.NumerikcyModel.BV102_01.StavPoResetu = dialog.BV102_01.StavPoResetu;
					this.NumerikcyModel.BV102_05.Casova_konstanta = dialog.BV102_05.CasovaKonstanta;
					this.NumerikcyModel.BV102_05.StavPoResetu = dialog.BV102_05.StavPoResetu;
					this.NumerikcyModel.BV103_01.Casova_konstanta = dialog.BV103_01.CasovaKonstanta;
					this.NumerikcyModel.BV103_01.StavPoResetu = dialog.BV103_01.StavPoResetu;
					this.NumerikcyModel.BV103_03.Casova_konstanta = dialog.BV103_03.CasovaKonstanta;
					this.NumerikcyModel.BV103_03.StavPoResetu = dialog.BV103_03.StavPoResetu;
					this.NumerikcyModel.BV104_01.Casova_konstanta = dialog.BV104_01.CasovaKonstanta;
					this.NumerikcyModel.BV104_01.StavPoResetu = dialog.BV104_01.StavPoResetu;
					this.NumerikcyModel.BV104_03.Casova_konstanta = dialog.BV104_03.CasovaKonstanta;
					this.NumerikcyModel.BV104_03.StavPoResetu = dialog.BV104_03.StavPoResetu;
					this.NumerikcyModel.SSV109_01.Casova_konstanta = dialog.SSV109_01.CasovaKonstanta;
					this.NumerikcyModel.SSV109_01.StavPoResetu = dialog.SSV109_01.StavPoResetu;	
				}
			} // end if simulace spustena
		}
		
		// Funkce spoustena pri kliknuti na menu MENU -> KOMPONENTY CIP -> NASTAVENI SNIMACU
		private void MENUNastaveniSnimacu(object Sender, EventArgs e){
			
			if(!this.SimulaceSpustena){
				
				DialogNastaveniSnimacu dialog = new DialogNastaveniSnimacu();
				
				// naplneni dialogu daty
				dialog.TIC102_03.CasovaKonstanta = this.NumerikcyModel.TIC102_03.Casova_konstanta;
				dialog.TIC102_03.MinimalniHodnota = this.NumerikcyModel.TIC102_03.MinHodnota;
				dialog.TIC102_03.MaximalniHodnota = this.NumerikcyModel.TIC102_03.MaxHodnota;
				
				dialog.TIC103_03.CasovaKonstanta = this.NumerikcyModel.TIC103_03.Casova_konstanta;
				dialog.TIC103_03.MinimalniHodnota = this.NumerikcyModel.TIC103_03.MinHodnota;
				dialog.TIC103_03.MaximalniHodnota = this.NumerikcyModel.TIC103_03.MaxHodnota;
				
				dialog.TIC105_02.CasovaKonstanta = this.NumerikcyModel.TIC105_02.Casova_konstanta;
				dialog.TIC105_02.MinimalniHodnota = this.NumerikcyModel.TIC105_02.MinHodnota;
				dialog.TIC105_02.MaximalniHodnota = this.NumerikcyModel.TIC105_02.MaxHodnota;
				
				dialog.TIC106_02.CasovaKonstanta = this.NumerikcyModel.TIC106_02.Casova_konstanta;
				dialog.TIC106_02.MinimalniHodnota = this.NumerikcyModel.TIC106_02.MinHodnota;
				dialog.TIC106_02.MaximalniHodnota = this.NumerikcyModel.TIC106_02.MaxHodnota;
		
				dialog.TIC109_02.CasovaKonstanta = this.NumerikcyModel.TIC109_02.Casova_konstanta;
				dialog.TIC109_02.MinimalniHodnota = this.NumerikcyModel.TIC109_02.MinHodnota;
				dialog.TIC109_02.MaximalniHodnota = this.NumerikcyModel.TIC109_02.MaxHodnota;
				
				dialog.QIC105_01.CasovaKonstanta = this.NumerikcyModel.QIC105_01.Casova_konstanta;
				dialog.QIC105_01.MinimalniHodnota = this.NumerikcyModel.QIC105_01.MinHodnota;
				dialog.QIC105_01.MaximalniHodnota = this.NumerikcyModel.QIC105_01.MaxHodnota;
				
				dialog.QIC106_01.CasovaKonstanta = this.NumerikcyModel.QIC106_01.Casova_konstanta;
				dialog.QIC106_01.MinimalniHodnota = this.NumerikcyModel.QIC106_01.MinHodnota;
				dialog.QIC106_01.MaximalniHodnota = this.NumerikcyModel.QIC106_01.MaxHodnota;
				
				dialog.QIC109_03.CasovaKonstanta = this.NumerikcyModel.QIC109_03.Casova_konstanta;
				dialog.QIC109_03.MinimalniHodnota = this.NumerikcyModel.QIC109_03.MinHodnota;
				dialog.QIC109_03.MaximalniHodnota = this.NumerikcyModel.QIC109_03.MaxHodnota;
				
				dialog.FIC109_01.CasovaKonstanta = this.NumerikcyModel.FIC109_01.Casova_konstanta;
				dialog.FIC109_01.MinimalniHodnota = this.NumerikcyModel.FIC109_01.MinHodnota;
				dialog.FIC109_01.MaximalniHodnota = this.NumerikcyModel.FIC109_01.MaxHodnota;
				
				// Zobrazeni dialogu
				dialog.ShowDialog();
				
				// pokud byl dialog ukoncen talcitke OK data se ulozi do modelu
				if(dialog.DialogResult == DialogResult.OK){
				
					this.NumerikcyModel.TIC102_03.Casova_konstanta = dialog.TIC102_03.CasovaKonstanta;
					this.NumerikcyModel.TIC102_03.MinHodnota = dialog.TIC102_03.MinimalniHodnota;
					this.NumerikcyModel.TIC102_03.MaxHodnota = dialog.TIC102_03.MaximalniHodnota;
					
					this.NumerikcyModel.TIC103_03.Casova_konstanta = dialog.TIC103_03.CasovaKonstanta;
					this.NumerikcyModel.TIC103_03.MinHodnota = dialog.TIC103_03.MinimalniHodnota;
					this.NumerikcyModel.TIC103_03.MaxHodnota = dialog.TIC103_03.MaximalniHodnota;
					
					this.NumerikcyModel.TIC105_02.Casova_konstanta = dialog.TIC105_02.CasovaKonstanta;
					this.NumerikcyModel.TIC105_02.MinHodnota = dialog.TIC105_02.MinimalniHodnota;
					this.NumerikcyModel.TIC105_02.MaxHodnota = dialog.TIC105_02.MaximalniHodnota;
					
					this.NumerikcyModel.TIC106_02.Casova_konstanta = dialog.TIC106_02.CasovaKonstanta;
					this.NumerikcyModel.TIC106_02.MinHodnota = dialog.TIC106_02.MinimalniHodnota;
					this.NumerikcyModel.TIC106_02.MaxHodnota = dialog.TIC106_02.MaximalniHodnota;
					
					this.NumerikcyModel.TIC109_02.Casova_konstanta = dialog.TIC109_02.CasovaKonstanta;
					this.NumerikcyModel.TIC109_02.MinHodnota = dialog.TIC109_02.MinimalniHodnota;
					this.NumerikcyModel.TIC109_02.MaxHodnota = dialog.TIC109_02.MaximalniHodnota;
					
					this.NumerikcyModel.QIC105_01.Casova_konstanta = dialog.QIC105_01.CasovaKonstanta;
					this.NumerikcyModel.QIC105_01.MinHodnota = dialog.QIC105_01.MinimalniHodnota;
					this.NumerikcyModel.QIC105_01.MaxHodnota = dialog.QIC105_01.MaximalniHodnota;
					
					this.NumerikcyModel.QIC106_01.Casova_konstanta = dialog.QIC106_01.CasovaKonstanta;
					this.NumerikcyModel.QIC106_01.MinHodnota = dialog.QIC106_01.MinimalniHodnota;
					this.NumerikcyModel.QIC106_01.MaxHodnota = dialog.QIC106_01.MaximalniHodnota;
					
					this.NumerikcyModel.QIC109_03.Casova_konstanta = dialog.QIC109_03.CasovaKonstanta;
					this.NumerikcyModel.QIC109_03.MinHodnota = dialog.QIC109_03.MinimalniHodnota;
					this.NumerikcyModel.QIC109_03.MaxHodnota = dialog.QIC109_03.MaximalniHodnota;
					
					this.NumerikcyModel.FIC109_01.Casova_konstanta = dialog.FIC109_01.CasovaKonstanta;
					this.NumerikcyModel.FIC109_01.MinHodnota = dialog.FIC109_01.MinimalniHodnota;
					this.NumerikcyModel.FIC109_01.MaxHodnota = dialog.FIC109_01.MaximalniHodnota;
				}	
			}
		}
		// Funkce spoustenana pri kliknuti na MENU -> KOMUNIKACE S PLC -> Připoj k S7-PLCSIM;
		private void MENUPripojPLCSIM(object Sender, EventArgs e){
			
			
				if(this.KomunikaceS7_PLCSIM == false && this.KomunikacePLC == false){
					
				try{
				    	// Navázání spojení s S7-PLCSIM
						this.ConnectionPLCSIM.ConnectToPLCSIM(); // Naváže spojení
					
						// Spustění časovače přenosu dat 
						this.CasovacPrenosuDat.Interval = Convert.ToInt32(this.PeriodaPrenosuData*1000.0);
						this.CasovacPrenosuDat.Enabled = true;
	
						// Nastavení flagů
						this.KomunikaceS7_PLCSIM = true;	
				}
				catch(Exception) 
				{
					this.ConnectionPLCSIM.DisconnectPLCSIM();
					MessageBox.Show("Nepodařilo se názat spojeni s S7-PLCSIM","Chyba komunikace", MessageBoxButtons.OK, MessageBoxIcon.Error);
					this.KomunikaceS7_PLCSIM = false;
				}
			}
		}
		
		// Funkce spoustena pri kliknuti na MENU -> KOMUNIKACE S PLC -> Odpoj S7-PLCSIM
		private void MENUOdpojPLCSIM(object Sender, EventArgs e){
			
			
				if(this.KomunikaceS7_PLCSIM == true){
	
	  				    // Odstranení spojení  		
						this.ConnectionPLCSIM.DisconnectPLCSIM(); 
					
						// Zastavení časovače přenosu dat
						this.CasovacPrenosuDat.Enabled = false;
					
						// Nastavení flagů
						this.KomunikaceS7_PLCSIM = false;
					} 				
	
		}
		
		// Funkce spouštěná časovačem přenosu dat 
		private void PrenesData(object Sender, EventArgs e){
			
			
			// Pokud je používán program PLCSIM a pokud je spojeni v poradku
			try{
				if( this.KomunikaceS7_PLCSIM && this.ConnectionPLCSIM.SpojeniOK){
				
					// Nahraje data do PLCSIM
					this.NahrajDataDoPLCSIM();
				}
			
				// Pokud je povoleno rizeni z plc prenesou se data z S7-PLCSIM do modelu
				if( this.KomunikaceS7_PLCSIM && this.ConnectionPLCSIM.SpojeniOK && this.RizeniOdPLC){
				
					// Nacte data z PLCSIM
					this.NactiDataZPLCSIM();
				}
			}
			catch(Exception){
				// Pokud nastala chyba komunikace, komikace bude ukoncena;
				MessageBox.Show("Chyba komunikace mezi modelem a S7-PLCSIM", "Chyba komunikace", MessageBoxButtons.OK, MessageBoxIcon.Error);
				this.KomunikaceS7_PLCSIM = false;
			}
		}
			
		
		#endregion
	
		
		// Funkce pro naplneni promenne body potrubi
		// Vypocte aktualni hodnoty bodu pro danou velikost okna
		// Pred volanim teto funkce musi byt inicializovay Komponenty CIP	
		private void VypocetBoduPotrubi(){
			
			// Kontrola inicializace komponent - v pripade neuspechu vyvola vyjimku
			if(!this.Init)
				throw new Exception("Nelze inicializovat body potrubi funkci 'VypocetBoduPotrubi', dokud nejsou inicializovany komponenty CIP");
			
			// Pomocna promenna (Odvozena z velikosti klapky)
			int posun = Convert.ToInt32(BV102_05.size.Width/2.0);
			
			// Pomocna provmenna pro velikost sipky
			int VelikostSipky = this.BV102_05.size.Width/5;
			
			// Vypocet jednotlivych bodu potrubi vratky, vystupiho potrubi a jejich pripoju
			this.BodyPotrubi[0] = new Point(posun - VelikostSipky, BV100_01.GetConnectionPoint1.Y);
			this.BodyPotrubi[1] = new Point(BV102_05.GetConnectionPoint2.X + posun, BV100_01.GetConnectionPoint2.Y);
			this.BodyPotrubi[2] = new Point(BV103_03.GetConnectionPoint2.X + posun, BV100_01.GetConnectionPoint2.Y);
			this.BodyPotrubi[3] = new Point(BV104_03.GetConnectionPoint2.X + posun, BV100_01.GetConnectionPoint2.Y);
			this.BodyPotrubi[4] = new Point(SSV109_01.GetConnectionPoint1.X - posun, BV100_01.GetConnectionPoint2.Y);
			this.BodyPotrubi[5] = new Point(this.Width - posun, BV100_01.GetConnectionPoint2.Y);
			this.BodyPotrubi[6] = new Point(posun, BV101_03.GetConnectionPoint1.Y);
			this.BodyPotrubi[7] = new Point(TankCisVoda.GetConnectionPoint1.X , BV101_03.GetConnectionPoint2.Y);
			this.BodyPotrubi[8] = new Point(TankHNO3.GetConnectionPoint1.X, BV102_05.GetConnectionPoint1.Y);
			this.BodyPotrubi[9] = new Point(BV102_05.GetConnectionPoint2.X + posun,  BV102_05.GetConnectionPoint2.Y);
			this.BodyPotrubi[10] = new Point(TankNaOH.GetConnectionPoint1.X,  BV103_03.GetConnectionPoint1.Y);
			this.BodyPotrubi[11] = new Point(BV103_03.GetConnectionPoint2.X + posun,  BV103_03.GetConnectionPoint2.Y);
			this.BodyPotrubi[12] = new Point(TankVypVoda.GetConnectionPoint1.X,  BV104_03.GetConnectionPoint1.Y);
			this.BodyPotrubi[13] = new Point(BV104_03.GetConnectionPoint2.X + posun,  BV104_03.GetConnectionPoint2.Y);
			this.BodyPotrubi[14] = new Point(SSV109_01.GetConnectionPoint1.X - posun, SSV109_01.GetConnectionPoint1.Y);
			this.BodyPotrubi[15] = new Point(TankCisVoda.GetConnectionPoint2.X, BV101_01.GetConnectionPoint1.Y);
			this.BodyPotrubi[16] = new Point(BV101_01.GetConnectionPoint2.X + posun, BV101_01.GetConnectionPoint2.Y);
			this.BodyPotrubi[17] = new Point(TankHNO3.GetConnectionPoint2.X, BV102_01.GetConnectionPoint1.Y);
			this.BodyPotrubi[18] = new Point(BV102_01.GetConnectionPoint2.X + posun, BV102_01.GetConnectionPoint2.Y);
			this.BodyPotrubi[19] = new Point(TankNaOH.GetConnectionPoint2.X, BV103_01.GetConnectionPoint1.Y);
			this.BodyPotrubi[20] = new Point(BV103_01.GetConnectionPoint2.X + posun, BV103_01.GetConnectionPoint2.Y);
			this.BodyPotrubi[21] = new Point(TankVypVoda.GetConnectionPoint2.X, BV104_01.GetConnectionPoint1.Y);
			this.BodyPotrubi[22] = new Point(BV104_01.GetConnectionPoint2.X + posun, BV104_01.GetConnectionPoint2.Y);
			this.BodyPotrubi[23] = new Point(BV101_01.GetConnectionPoint2.X + posun, CP109.GetConnectionPoint1.Y);
			this.BodyPotrubi[24] = new Point(BV102_01.GetConnectionPoint2.X + posun, CP109.GetConnectionPoint1.Y);
			this.BodyPotrubi[25] = new Point(BV103_01.GetConnectionPoint2.X + posun, CP109.GetConnectionPoint1.Y);
			this.BodyPotrubi[26] = new Point(BV104_01.GetConnectionPoint2.X + posun, CP109.GetConnectionPoint1.Y);
			this.BodyPotrubi[27] = new Point(SSV109_01.GetConnectionPoint3.X, CP109.GetConnectionPoint1.Y);
			this.BodyPotrubi[28] = new Point(this.Width - posun + VelikostSipky, SSV109_01.GetConnectionPoint2.Y);
			
			// Vypocet bodu cirkulacnich potrubi a potrubi k nadrzim s koncentraty
			this.BodyPotrubi[29] = new Point(DP111.GetConnectionPoint1.X, DP111.GetConnectionPoint1.Y - posun);
			this.BodyPotrubi[30] = new Point(DP111.GetConnectionPoint1.X + 3*posun, DP111.GetConnectionPoint1.Y - posun);
			this.BodyPotrubi[31] = new Point(CP106.GetConnectionPoint1.X - 2*posun, DP111.GetConnectionPoint1.Y - 2*posun);
			this.BodyPotrubi[32] = new Point(THE_105.GetConnectionPoint1.X - posun, DP111.GetConnectionPoint1.Y - 2*posun - VelikostSipky);
			this.BodyPotrubi[33] = new Point(THE_106.GetConnectionPoint3.X + posun, DP111.GetConnectionPoint1.Y - 2*posun - VelikostSipky);
			this.BodyPotrubi[34] = new Point(CP107.GetConnectionPoint2.X + posun, DP111.GetConnectionPoint1.Y - 2*posun);
			this.BodyPotrubi[35] = new Point(DP112.GetConnectionPoint1.X - 3*posun, DP112.GetConnectionPoint1.Y - posun);
			this.BodyPotrubi[36] = new Point(DP112.GetConnectionPoint1.X, DP112.GetConnectionPoint1.Y - posun);
			this.BodyPotrubi[37] = new Point(CP106.GetConnectionPoint1.X - 2*posun, CP106.GetConnectionPoint1.Y);
			this.BodyPotrubi[38] = new Point(THE_105.GetConnectionPoint1.X - posun, THE_105.GetConnectionPoint1.Y);
			this.BodyPotrubi[39] = new Point(THE_106.GetConnectionPoint3.X + posun, THE_106.GetConnectionPoint3.Y);
			this.BodyPotrubi[40] = new Point(CP107.GetConnectionPoint2.X + posun, CP107.GetConnectionPoint2.Y);
			this.BodyPotrubi[41] = new Point(THE_105.GetConnectionPoint3.X + (THE_106.GetConnectionPoint1.X - THE_105.GetConnectionPoint3.X)/2, THE_105.GetConnectionPoint1.Y);
			this.BodyPotrubi[42] = new Point(THE_105.GetConnectionPoint4.X + posun, THE_105.GetConnectionPoint4.Y);
			this.BodyPotrubi[43] = new Point(THE_106.GetConnectionPoint2.X - posun, THE_106.GetConnectionPoint2.Y);
			this.BodyPotrubi[44] = new Point(THE_105.GetConnectionPoint4.X + posun, this.ClientSize.Height - posun + VelikostSipky);
			this.BodyPotrubi[45] = new Point(THE_105.GetConnectionPoint3.X + (THE_106.GetConnectionPoint1.X - THE_105.GetConnectionPoint3.X)/2, this.ClientSize.Height - posun);
			this.BodyPotrubi[46] = new Point(THE_106.GetConnectionPoint2.X - posun, this.ClientSize.Height - posun + VelikostSipky);
			
			// Bod pro pripojeni vystupniho prutokomeru
			this.BodyPotrubi[47] = new Point(BodyPotrubi[27].X, SSV109_01.GetConnectionPoint3.Y + (BodyPotrubi[27].Y - SSV109_01.GetConnectionPoint3.Y)/2);
			
		}
	
		// Funknkce pro vykresleni potrubi
		// Pred volanim je nutne, aby byly inicializovany komponenty CIP a Potrubi
		private void DrawPipeline( Graphics gfx){
			
			if(gfx == null)
				throw new ArgumentNullException("Pokus o vykresleni potrubi do pradneho grafickeho kontextu");
			
			if (!this.Init)
				throw new Exception("Pokus o vykresleni potrubi pri neinicializovanych komponentach CIP ");
			
			// Deklarace pera pro vykreslovani potrubi
			Pen PeroPotrubi = new Pen(System.Drawing.Color.Black, 2);
			
			// Vykresleni potrubi vratky a pripojnych potrubi
			gfx.DrawLine(PeroPotrubi, this.BodyPotrubi[5], BV100_01.GetConnectionPoint2);
			gfx.DrawLine(PeroPotrubi, this.BodyPotrubi[0], BV100_01.GetConnectionPoint1);
			gfx.DrawLine(PeroPotrubi, this.BodyPotrubi[7], BV101_03.GetConnectionPoint2);
			gfx.DrawLine(PeroPotrubi, this.BodyPotrubi[6], BV101_03.GetConnectionPoint1);
			gfx.DrawLine(PeroPotrubi, this.BodyPotrubi[1], this.BodyPotrubi[9]);
			gfx.DrawLine(PeroPotrubi, this.BodyPotrubi[2], this.BodyPotrubi[11]);
			gfx.DrawLine(PeroPotrubi, this.BodyPotrubi[3], this.BodyPotrubi[13]);
			gfx.DrawLine(PeroPotrubi, this.BodyPotrubi[4], this.BodyPotrubi[14]);
			gfx.DrawLine(PeroPotrubi, this.BodyPotrubi[9], BV102_05.GetConnectionPoint2);
			gfx.DrawLine(PeroPotrubi, this.BodyPotrubi[11], BV103_03.GetConnectionPoint2);
			gfx.DrawLine(PeroPotrubi, this.BodyPotrubi[13], BV104_03.GetConnectionPoint2);
			gfx.DrawLine(PeroPotrubi, this.BodyPotrubi[14], SSV109_01.GetConnectionPoint1);
			gfx.DrawLine(PeroPotrubi, this.BodyPotrubi[28], SSV109_01.GetConnectionPoint2);
			gfx.DrawLine(PeroPotrubi, this.BodyPotrubi[8], BV102_05.GetConnectionPoint1);
			gfx.DrawLine(PeroPotrubi, this.BodyPotrubi[10], BV103_03.GetConnectionPoint1);
			gfx.DrawLine(PeroPotrubi, this.BodyPotrubi[12], BV104_03.GetConnectionPoint1);
			gfx.DrawLine(PeroPotrubi, this.TankCisVoda.GetConnectionPoint1, this.BodyPotrubi[7]);
			gfx.DrawLine(PeroPotrubi, this.TankHNO3.GetConnectionPoint1, this.BodyPotrubi[8]);
			gfx.DrawLine(PeroPotrubi, this.TankNaOH.GetConnectionPoint1, this.BodyPotrubi[10]);
			gfx.DrawLine(PeroPotrubi, this.TankVypVoda.GetConnectionPoint1, this.BodyPotrubi[12]);
			
			// Odchozi potrubi ze stanice a jeho pripoje
			gfx.DrawLine(PeroPotrubi, this.TankCisVoda.GetConnectionPoint2, this.BodyPotrubi[15]);
			gfx.DrawLine(PeroPotrubi, this.TankHNO3.GetConnectionPoint2, this.BodyPotrubi[17]);
			gfx.DrawLine(PeroPotrubi, this.TankNaOH.GetConnectionPoint2, this.BodyPotrubi[19]);
			gfx.DrawLine(PeroPotrubi, this.TankVypVoda.GetConnectionPoint2, this.BodyPotrubi[21]);
			gfx.DrawLine(PeroPotrubi, BV101_01.GetConnectionPoint1, this.BodyPotrubi[15]);
			gfx.DrawLine(PeroPotrubi, BV102_01.GetConnectionPoint1, this.BodyPotrubi[17]);
			gfx.DrawLine(PeroPotrubi, BV103_01.GetConnectionPoint1, this.BodyPotrubi[19]);
			gfx.DrawLine(PeroPotrubi, BV104_01.GetConnectionPoint1, this.BodyPotrubi[21]);
			gfx.DrawLine(PeroPotrubi, BV101_01.GetConnectionPoint2, this.BodyPotrubi[16]);
			gfx.DrawLine(PeroPotrubi, BV102_01.GetConnectionPoint2, this.BodyPotrubi[18]);
			gfx.DrawLine(PeroPotrubi, BV103_01.GetConnectionPoint2, this.BodyPotrubi[20]);
			gfx.DrawLine(PeroPotrubi, BV104_01.GetConnectionPoint2, this.BodyPotrubi[22]);
			gfx.DrawLine(PeroPotrubi, this.BodyPotrubi[16], this.BodyPotrubi[23]);
			gfx.DrawLine(PeroPotrubi, this.BodyPotrubi[18], this.BodyPotrubi[24]);
			gfx.DrawLine(PeroPotrubi, this.BodyPotrubi[20], this.BodyPotrubi[25]);
			gfx.DrawLine(PeroPotrubi, this.BodyPotrubi[22], this.BodyPotrubi[26]);
			gfx.DrawLine(PeroPotrubi, this.BodyPotrubi[22], this.BodyPotrubi[26]);
			gfx.DrawLine(PeroPotrubi, this.BodyPotrubi[23], CP109.GetConnectionPoint1);
			gfx.DrawLine(PeroPotrubi, this.BodyPotrubi[27], CP109.GetConnectionPoint2);
			gfx.DrawLine(PeroPotrubi, this.BodyPotrubi[27], SSV109_01.GetConnectionPoint3);
			
			// Cyrkulacni potrubi a potrubi od koncentratu
			gfx.DrawLine(PeroPotrubi,this.BodyPotrubi[29], this.BodyPotrubi[30]);
			gfx.DrawLine(PeroPotrubi,this.BodyPotrubi[35], this.BodyPotrubi[36]);
			gfx.DrawLine(PeroPotrubi,this.BodyPotrubi[31], this.BodyPotrubi[37]);
			gfx.DrawLine(PeroPotrubi,this.BodyPotrubi[32], this.BodyPotrubi[38]);
			gfx.DrawLine(PeroPotrubi,this.BodyPotrubi[33], this.BodyPotrubi[39]);
			gfx.DrawLine(PeroPotrubi,this.BodyPotrubi[34], this.BodyPotrubi[40]);
			gfx.DrawLine(PeroPotrubi,this.BodyPotrubi[29], this.DP111.GetConnectionPoint1);
			gfx.DrawLine(PeroPotrubi,this.BodyPotrubi[36], this.DP112.GetConnectionPoint1);
			gfx.DrawLine(PeroPotrubi,CP106.GetConnectionPoint1, this.BodyPotrubi[37]);
			gfx.DrawLine(PeroPotrubi,CP107.GetConnectionPoint2, this.BodyPotrubi[40]);
			gfx.DrawLine(PeroPotrubi,CP106.GetConnectionPoint2, this.THE_105.GetConnectionPoint2);
			gfx.DrawLine(PeroPotrubi,CP107.GetConnectionPoint1, this.THE_106.GetConnectionPoint4);
			gfx.DrawLine(PeroPotrubi,this.BodyPotrubi[38], this.THE_105.GetConnectionPoint1);
			gfx.DrawLine(PeroPotrubi,this.BodyPotrubi[39], this.THE_106.GetConnectionPoint3);
			gfx.DrawLine(PeroPotrubi,this.THE_105.GetConnectionPoint3, this.THE_106.GetConnectionPoint1);
			gfx.DrawLine(PeroPotrubi,this.THE_105.GetConnectionPoint4, this.BodyPotrubi[42]);
			gfx.DrawLine(PeroPotrubi,this.THE_106.GetConnectionPoint2, this.BodyPotrubi[43]);
		    gfx.DrawLine(PeroPotrubi,this.BodyPotrubi[42], this.BodyPotrubi[44]);
			gfx.DrawLine(PeroPotrubi,this.BodyPotrubi[41], this.BodyPotrubi[45]);
			gfx.DrawLine(PeroPotrubi,this.BodyPotrubi[43], this.BodyPotrubi[46]);
			
			// Připojení senzorů
			gfx.DrawLine(PeroPotrubi,  QIC109_03.GetConnectionPoint2, this.BodyPotrubi[3]);
			gfx.DrawLine(PeroPotrubi,  TIC109_02.GetConnectionPoint2, this.BodyPotrubi[3]);
			gfx.DrawLine(PeroPotrubi,  FIC109_01.GetConnectionPoint3, this.BodyPotrubi[47]);
			gfx.DrawLine(PeroPotrubi,  TIC102_03.GetConnectionPoint1, TankHNO3.GetConnectionPoint3);
			gfx.DrawLine(PeroPotrubi,  TIC103_03.GetConnectionPoint1, TankNaOH.GetConnectionPoint3);
		    gfx.DrawLine(PeroPotrubi,  QIC105_01.GetConnectionPoint3, TIC105_02.GetConnectionPoint1);
			gfx.DrawLine(PeroPotrubi,  QIC106_01.GetConnectionPoint1, TIC106_02.GetConnectionPoint3);
			
			// Vykresleni sipek na potrubí
			
			// Pomocna provmenna pro velikost sipky
			int VelikostSipky = this.BV102_05.size.Width/5;
			PaintSipka(gfx, this.BodyPotrubi[0], PeroPotrubi, VelikostSipky, 3);
			PaintSipka(gfx, this.BodyPotrubi[6], PeroPotrubi, VelikostSipky, 2);
			PaintSipka(gfx, this.BodyPotrubi[5], PeroPotrubi, VelikostSipky, 3);
			PaintSipka(gfx, this.BodyPotrubi[28], PeroPotrubi, VelikostSipky, 2);
			PaintSipka(gfx, this.BodyPotrubi[30], PeroPotrubi, VelikostSipky, 2);
			PaintSipka(gfx, this.BodyPotrubi[35], PeroPotrubi, VelikostSipky, 3);
			PaintSipka(gfx, this.BodyPotrubi[31], PeroPotrubi, VelikostSipky, 0);
			PaintSipka(gfx, this.BodyPotrubi[34], PeroPotrubi, VelikostSipky, 0);
			PaintSipka(gfx, this.BodyPotrubi[32], PeroPotrubi, VelikostSipky, 1);
			PaintSipka(gfx, this.BodyPotrubi[33], PeroPotrubi, VelikostSipky, 1);
			PaintSipka(gfx, this.BodyPotrubi[44], PeroPotrubi, VelikostSipky, 0);
			PaintSipka(gfx, this.BodyPotrubi[45], PeroPotrubi, VelikostSipky, 1);
			PaintSipka(gfx, this.BodyPotrubi[46], PeroPotrubi, VelikostSipky, 0);
		}
		
		// Funkce pro vykreslení šipek k potrubím
		private void PaintSipka(Graphics gfx, Point Bod, Pen pero, int velikost, int StylSipky){
			
			switch(StylSipky){
				
				// Sipka smerem dolu, zadany bod je v hrotu sipky
				case 0:

				gfx.DrawLine(pero, Bod, new Point(Bod.X + velikost, Bod.Y - velikost));			
				gfx.DrawLine(pero, Bod, new Point(Bod.X - velikost, Bod.Y - velikost));
				break;
				
				// Sipka smerem nahoru, zadany bod je v hrotu sipky
				case 1:
				gfx.DrawLine(pero, Bod, new Point(Bod.X + velikost, Bod.Y + velikost));			
				gfx.DrawLine(pero, Bod, new Point(Bod.X - velikost, Bod.Y + velikost));
				break;
				
				// Sipka doprava, zadany bod je v hrotu sipky
				case 2:
				gfx.DrawLine(pero, Bod, new Point(Bod.X - velikost, Bod.Y + velikost));			
				gfx.DrawLine(pero, Bod, new Point(Bod.X - velikost, Bod.Y - velikost));
				break;
				
				// Sipka doleva, zadany bod je v hrotu sipky
				case 3:
				gfx.DrawLine(pero, Bod, new Point(Bod.X + velikost, Bod.Y + velikost));			
				gfx.DrawLine(pero, Bod, new Point(Bod.X + velikost, Bod.Y - velikost));
				break;
			}
		}
		
		// Funkce pro kopirovani stavu komponent z numerickeho modelu
		// do vyzualizacniho rozhrani
		private void CopyState(){
			
			TankNaOH.stav = this.NumerikcyModel.TankNaOH.Stav;
			TankHNO3.stav = this.NumerikcyModel.TankHNO3.Stav;
			TankVypVoda.stav = this.NumerikcyModel.TankVypVoda.Stav;
			TankCisVoda.stav = this.NumerikcyModel.TankCisVoda.Stav;
		
		
			BV104_03.stav = this.NumerikcyModel.BV104_03.StavProVizualizaci;
			BV103_03.stav = this.NumerikcyModel.BV103_03.StavProVizualizaci;
			BV102_05.stav = this.NumerikcyModel.BV102_05.StavProVizualizaci;
			BV100_01.stav = this.NumerikcyModel.BV100_01.StavProVizualizaci;
			BV101_03.stav = this.NumerikcyModel.BV101_03.StavProVizualizaci;
			BV101_01.stav = this.NumerikcyModel.BV101_01.StavProVizualizaci;
			BV102_01.stav = this.NumerikcyModel.BV102_01.StavProVizualizaci;
			BV103_01.stav = this.NumerikcyModel.BV103_01.StavProVizualizaci;
			BV104_01.stav = this.NumerikcyModel.BV104_01.StavProVizualizaci;
		
			CP109.stav = this.NumerikcyModel.CP109.Stav;
			CP107.stav = this.NumerikcyModel.CP107.Stav;
			CP106.stav = this.NumerikcyModel.CP106.Stav;
		
			SSV109_01.stav = this.NumerikcyModel.SSV109_01.Stav;
			THE_105.stav = this.NumerikcyModel.THE_105.Stav;
			THE_106.stav = this.NumerikcyModel.THE_106.Stav;
			DP111.stav = this.NumerikcyModel.DP111.Stav;
			DP112.stav = this.NumerikcyModel.DP112.Stav;
			DP111.CerpadloKoncentratu = this.NumerikcyModel.DP111.CerpadloKoncentratu;
			DP112.CerpadloKoncentratu = this.NumerikcyModel.DP112.CerpadloKoncentratu;
		
			QIC109_03.stav = this.NumerikcyModel.QIC109_03.StavVjednotkach;
			TIC109_02.stav = this.NumerikcyModel.TIC109_02.StavVjednotkach;
			FIC109_01.stav = this.NumerikcyModel.FIC109_01.StavVjednotkach;	
			TIC102_03.stav = this.NumerikcyModel.TIC102_03.StavVjednotkach;	
			TIC103_03.stav = this.NumerikcyModel.TIC103_03.StavVjednotkach;
			TIC105_02.stav = this.NumerikcyModel.TIC105_02.StavVjednotkach;
			QIC105_01.stav = this.NumerikcyModel.QIC105_01.StavVjednotkach;
			TIC106_02.stav = this.NumerikcyModel.TIC106_02.StavVjednotkach;
			QIC106_01.stav = this.NumerikcyModel.QIC106_01.StavVjednotkach;
			
		}
		
		// Funkce pro kopirovani zadanych hodnott z grafickeho rozhrani do modelu
		private void CopyZadaneHod(){
			
		
			NumerikcyModel.BV104_03.ZadanaHodnota = this.BV104_03.ZadanaHodnota;
			NumerikcyModel.BV103_03.ZadanaHodnota = this.BV103_03.ZadanaHodnota;
			NumerikcyModel.BV102_05.ZadanaHodnota = this.BV102_05.ZadanaHodnota;
			NumerikcyModel.BV100_01.ZadanaHodnota = this.BV100_01.ZadanaHodnota;
			NumerikcyModel.BV101_03.ZadanaHodnota = this.BV101_03.ZadanaHodnota;
			NumerikcyModel.BV101_01.ZadanaHodnota = this.BV101_01.ZadanaHodnota;
			NumerikcyModel.BV102_01.ZadanaHodnota = this.BV102_01.ZadanaHodnota;
			NumerikcyModel.BV103_01.ZadanaHodnota = this.BV103_01.ZadanaHodnota;
			NumerikcyModel.BV104_01.ZadanaHodnota = this.BV104_01.ZadanaHodnota;
		
			NumerikcyModel.CP109.ZadanaHodnotaVprocentechRozsahu = this.CP109.ZadanaHodnota;
			NumerikcyModel.CP107.ZadanaHodnotaVprocentechRozsahu = this.CP107.ZadanaHodnota;
			NumerikcyModel.CP106.ZadanaHodnotaVprocentechRozsahu = this.CP106.ZadanaHodnota;
		
			NumerikcyModel.SSV109_01.ZadanaHodnota = this.SSV109_01.ZadanaHodnota;
			NumerikcyModel.THE_105.ZadanaHodnotaVprocentechRozsahu = this.THE_105.ZadanaHodnota;
			NumerikcyModel.THE_106.ZadanaHodnotaVprocentechRozsahu = this.THE_106.ZadanaHodnota;
			NumerikcyModel.DP111.ZadanaHodnota = this.DP111.ZadanaHodnota;
			NumerikcyModel.DP112.ZadanaHodnota = this.DP112.ZadanaHodnota;
		}
		
		// Funkce spustena pri kliku na klapku, ... Zmeni Zadanou hodnotu z 0.0 na 1.0 a naopak
		// Volana jako event dane klapky
		private double ProhodZadanouHodnotu(double OldZadHod){
					
			if(OldZadHod > 0.5)
				return 0.0;
			else
				return 1.0;
		}
		
		// Funkce spustena pri kliku na spojite regulovatelny prvek 
		private double NovaZadanaHodnota(double OldZadHod){
			
			DialogZadanaHodnota diag = new DialogZadanaHodnota();
			diag.HodnotaPosuvniku = OldZadHod;
			diag.ShowDialog();
			
			if(diag.DialogResult == DialogResult.OK)
				return diag.HodnotaPosuvniku;
			else
				return OldZadHod;
		}
		
		// Funkce pro přenos dat z modelu do S7-PLCSIM
		private void NahrajDataDoPLCSIM(){
			
				// Zápis bitů na vstupy PLCSIM
				Byte[] a = new Byte[5]{0,0,0,0,0};
				
				if(this.NumerikcyModel.CP109.CidloZapnuto)			a[0] +=1;  	// Cidlo chodu cerpadla na vystupu stanice = I0.0
				if(this.NumerikcyModel.CP109.TepelnaPojistka)		a[0] +=2;  	// Tepelna pojistna cerpadla na vystupu stanice
				if(this.NumerikcyModel.CP107.CidloZapnuto)			a[0] +=4;	// Cidlo chodu cerpadla cirkulace NaOH
				if(this.NumerikcyModel.CP107.TepelnaPojistka)		a[0] +=8;	// Tepelna pojistna cerpadla cirkulace NaOH
				if(this.NumerikcyModel.CP106.CidloZapnuto)			a[0] +=16;	// Cidlo chodu cerpadla cirkulace HNO3
				if(this.NumerikcyModel.CP106.TepelnaPojistka)		a[0] +=32;	// Tepelna pojistna cerpadla cirkulace HNO3
				if(this.NumerikcyModel.DP111.CerpadloKoncentratu)	a[0] +=64;	// Cidlo chodu cerpadla koncentratu HNO3
				if(this.NumerikcyModel.DP111.TepelnaPojistka)		a[0] +=128; // Tepelna pojistna cerpadla koncentratu HNO3
				
				if(this.NumerikcyModel.DP112.CerpadloKoncentratu)	a[1] +=1; 	// Cidlo chodu cerpadla koncentratu NaOH
				if(this.NumerikcyModel.DP112.TepelnaPojistka)		a[1] +=2;	// Tepelna pojistna cerpadla koncentratu NaOH
				if(this.NumerikcyModel.BV100_01.CidloPolohy_open)  	a[1] +=4; 	// Cidlo otevreni klapky do kanalizace
				if(this.NumerikcyModel.BV100_01.CidloPolohy_close)  a[1] +=8;	// Cidlo zavreni klapky do kanalizace
				if(this.NumerikcyModel.BV101_03.CidloPolohy_open)   a[1] +=16;	// Cidlo otevreni klapky přivodu ciste vody
				if(this.NumerikcyModel.BV101_03.CidloPolohy_close)  a[1] +=32;	// Cidlo zavreni klapky přivodu ciste vody
				if(this.NumerikcyModel.BV102_05.CidloPolohy_open)   a[1] +=64;	// Cidlo otevreni klapky přivodu do tanku HNO3
				if(this.NumerikcyModel.BV102_05.CidloPolohy_close)  a[1] +=128; // Cidlo zavreni klapky přivodu do tanku HNO3
				
				if(this.NumerikcyModel.BV103_03.CidloPolohy_open)	a[2] +=1; 	// Cidlo otevreni klapky přivodu do tanku NaOH	
				if(this.NumerikcyModel.BV103_03.CidloPolohy_close)	a[2] +=2;	// Cidlo zavreni klapky přivodu do tanku NaOH
				if(this.NumerikcyModel.BV104_03.CidloPolohy_open)   a[2] +=4;	// Cidlo otevreni klapky přivodu do tanku Proplachove vody
				if(this.NumerikcyModel.BV104_03.CidloPolohy_close)  a[2] +=8;	// Cidlo zavreni klapky přivodu do tanku Proplachove vody
				if(this.NumerikcyModel.BV101_01.CidloPolohy_open)   a[2] +=16;	// Cidlo otevreni klapky vývodu z tanku čisté vody	
				if(this.NumerikcyModel.BV101_01.CidloPolohy_close)  a[2] +=32;	// Cidlo zavreni klapky vývodu z tanku čisté vody	
				if(this.NumerikcyModel.BV102_01.CidloPolohy_open)   a[2] +=64;  // Cidlo otevreni klapky přivodu z tanku Roztoku HNO3
				if(this.NumerikcyModel.BV102_01.CidloPolohy_close)  a[2] +=128;	// Cidlo zavreni klapky přivodu z tanku Roztoku HNO3
				
				if(this.NumerikcyModel.BV103_01.CidloPolohy_open)	a[3] +=1; 	// Cidlo otevreni klapky vývodu z tanku  Roztoku NaOH
				if(this.NumerikcyModel.BV103_01.CidloPolohy_close)	a[3] +=2;	// Cidlo zavreni klapky vývodu z tanku Roztoku NaOH	
				if(this.NumerikcyModel.BV104_01.CidloPolohy_open)   a[3] +=4;	// Cidlo otevreni klapky přivodu z tanku Proplachove vody	
				if(this.NumerikcyModel.BV104_01.CidloPolohy_close) 	a[3] +=8;	// Cidlo zavreni klapky přivodu z tanku Proplachove vody
				if(this.NumerikcyModel.SSV109_01.CidloPolohy_open)  a[3] +=16;	// Cidlo indikace polohy stridaciho ventilu 1
				if(this.NumerikcyModel.SSV109_01.CidloPolohy_close) a[3] +=32;	// Cidlo indikace polohy stridaciho venitlu 2
				if(this.NumerikcyModel.TankCisVoda.SnimacLAH)    	a[3] +=64; 	// Čidlo horni hladiny tanku s čistou vodou
				if(this.NumerikcyModel.TankCisVoda.SnimacLAL)    	a[3] +=128;	// Čidlo spodní hladiny tanku s čistou vodou
					
				if(this.NumerikcyModel.TankHNO3.SnimacLAH)			a[4] +=1;  		// Čidlo horni hladiny tanku s roztokem HNO3
				if(this.NumerikcyModel.TankHNO3.SnimacLAL)			a[4] +=2;  		// Čidlo spodní hladiny tanku s roztokem HNO3
				if(this.NumerikcyModel.TankNaOH.SnimacLAH)			a[4] +=4;			// Čidlo horni hladiny tanku s roztokem NaOH
				if(this.NumerikcyModel.TankNaOH.SnimacLAL)			a[4] +=8;			// Čidlo spodní hladiny tanku s roztokem NaOH
				if(this.NumerikcyModel.TankVypVoda.SnimacLAH)		a[4] +=16;			// Čidlo horni hladiny tanku s výplachovouv vodou
				if(this.NumerikcyModel.TankVypVoda.SnimacLAL)		a[4] +=32;			// Čidlo spodní hladiny tanku s výplachovouv vodou
				if(this.NumerikcyModel.DP111.SnimacLAL)				a[4] +=64;			// Čidlo spodní hladiny tanku Koncentrátem HNO3
				if(this.NumerikcyModel.DP112.SnimacLAL)				a[4] +=128;    	// Čidlo spodní hladiny tanku Koncentrátem NaOH
			
				this.ConnectionPLCSIM.WriteInputByteImage(0, a);
				
				Int16[] data = new Int16[9];
				// Zápis slov do S7-PLCSIM
				data[0] = this.NumerikcyModel.TIC102_03.DestandartizovanaHodnotaWort;			// Snímač teploty roztoku HNO3 v tanku
				data[1] = this.NumerikcyModel.TIC103_03.DestandartizovanaHodnotaWort;			// Snímač teploty roztoku NaOH v tanku
				data[2] = this.NumerikcyModel.TIC105_02.DestandartizovanaHodnotaWort;			// Snímač teploty roztoku HNO3 za ohřívačem
				data[3] = this.NumerikcyModel.TIC106_02.DestandartizovanaHodnotaWort;			// Snímač teploty roztoku NaOH za ohřívačem
				data[4] = this.NumerikcyModel.TIC109_02.DestandartizovanaHodnotaWort;			// Snímač teploty vratky
				data[5] = Convert.ToInt16(this.NumerikcyModel.FIC109_01.DestandartizovanaHodnotaWort*this.CasoveZrychleni);	// Výstupní průtokoměr
				data[6] = this.NumerikcyModel.QIC105_01.DestandartizovanaHodnotaWort;			// Snímač vodivosti roztoku HNO3
				data[7] = this.NumerikcyModel.QIC106_01.DestandartizovanaHodnotaWort;			// Snímač vodivosti roztoku NaOH
				data[8] = this.NumerikcyModel.QIC109_03.DestandartizovanaHodnotaWort;			//Snímač vodivosti vratky
				

				this.ConnectionPLCSIM.WriteInputWortImage(156, data);
				



		}
		// Funkce pro přenost dat z S7-PLCSIM do modelu
		private void NactiDataZPLCSIM(){
			
				byte[] data = new byte[2]{0,0};
			
			// Proměnné spojitě ovládaných prvků
			Int16[] Data = new Int16[3]{0,0,0};
			
			data = this.ConnectionPLCSIM.ReadOutputImageByte(0, 2);
			Data = this.ConnectionPLCSIM.ReadOutputImageWort(254, 3);
			//this.NumerikcyModel.CP109.DestandartizovanaHodnotaWort = Data[0];
			this.NumerikcyModel.THE_105.DestandartizovanaHodnotaWort = Data[1];
			this.NumerikcyModel.THE_106.DestandartizovanaHodnotaWort = Data[2];
			
	
			
			// Rozkodovaní do bitových proměnných
			// Ovládání klapky vpusti vratky do tanku HNO3 Q0.7
			if(data[0] >= 128){
				data[0] -= 128;
				this.NumerikcyModel.BV102_05.ZadanaHodnota = 1.0;
			} else
				this.NumerikcyModel.BV102_05.ZadanaHodnota = 0.0;
			
			
			// Ovládání klapky přivodu čisté vody Q0.6
			if(data[0] >= 64){
				data[0] -= 64;
				this.NumerikcyModel.BV101_03.ZadanaHodnota = 1.0;
			} else
				this.NumerikcyModel.BV101_03.ZadanaHodnota = 0.0;
			
			// Ovládání klapky vypusti vratky do kanalizace Q0.5
			if(data[0] >= 32){
				data[0] -= 32;
				this.NumerikcyModel.BV100_01.ZadanaHodnota = 1.0;
			} else
				this.NumerikcyModel.BV100_01.ZadanaHodnota = 0.0;
			
			// Spuštění dávkovacího čerpadla NaOH Q0.4
			if(data[0] >= 16){
				data[0] -= 16;
				this.NumerikcyModel.DP112.CerpadloKoncentratu = true;
			} else
				this.NumerikcyModel.DP112.CerpadloKoncentratu = false;
			
			// Spuštění dávkovacího čerpadla HNO3 Q0.3
			if(data[0] >= 8){
				data[0] -= 8;
				this.NumerikcyModel.DP111.CerpadloKoncentratu = true;
			} else
				this.NumerikcyModel.DP111.CerpadloKoncentratu = false;
			
			// Spuštění čerpadla okruhu tanku NaOH Q0.2	
			if(data[0] >= 4){
				data[0] -= 4;
				this.NumerikcyModel.CP107.ZadanaHodnotaVprocentechRozsahu = 1.0;
			} else
				this.NumerikcyModel.CP107.ZadanaHodnotaVprocentechRozsahu = 0.0;
			
			// Spuštění čerpadla okruhu tanku HNO3 Q0.1	
			if(data[0] >= 2){
				data[0] -= 2;
				this.NumerikcyModel.CP106.ZadanaHodnotaVprocentechRozsahu = 1.0;
			} else
				this.NumerikcyModel.CP106.ZadanaHodnotaVprocentechRozsahu = 0.0;
			
			// Spuštění čerpadla na výstupu stanice Q0.0	
			// Pokud není čerpadlo spuštěno je nastavena žádaná hodnota na nulu
			// Pokud je čerpadlo zapnuto je ovládáno spojitou veličinou
			if(data[0] < 1)
				this.NumerikcyModel.CP109.ZadanaHodnotaVprocentechRozsahu = 0.0;
			else
				this.NumerikcyModel.CP109.DestandartizovanaHodnotaWort = Data[0];

			
			// Další byte
			
			// Tento byt je nevyuzity Q1.7
			if(data[1] >= 128)
				data[1] -= 128;

			// Ovládání střídacího ventilů
			if(data[1] >= 64){
				data[1] -= 64;
				this.NumerikcyModel.SSV109_01.ZadanaHodnota = 1.0;
			} else
				this.NumerikcyModel.SSV109_01.ZadanaHodnota = 0.0;
			
			// Ovládání klapky výpusti tanku proplachové vody Q1.5
			if(data[1] >= 32){
				data[1] -= 32;
				this.NumerikcyModel.BV104_01.ZadanaHodnota = 1.0;
			} else
				this.NumerikcyModel.BV104_01.ZadanaHodnota = 0.0;
			
			// Ovládání klapky výpusti tanku NaOH Q1.4
			if(data[1] >= 16){
				data[1] -= 16;
				this.NumerikcyModel.BV103_01.ZadanaHodnota = 1.0;
			} else
				this.NumerikcyModel.BV103_01.ZadanaHodnota = 0.0;
			
			// Ovládání klapky výpusti tanku HNO3 Q1.3
			if(data[1] >= 8){
				data[1] -= 8;
				this.NumerikcyModel.BV102_01.ZadanaHodnota = 1.0;
			} else
				this.NumerikcyModel.BV102_01.ZadanaHodnota = 0.0;
			
			// Ovládání klapky výpusti tanku čisté vody Q1.2	
			if(data[1] >= 4){
				data[1] -= 4;
				this.NumerikcyModel.BV101_01.ZadanaHodnota = 1.0;
			} else
				this.NumerikcyModel.BV101_01.ZadanaHodnota = 0.0;
			
			// Ovládání vpusti vratky tanku proplachové vody Q1.1	
			if(data[1] >= 2){
				data[1] -= 2;
				this.NumerikcyModel.BV104_03.ZadanaHodnota = 1.0;
			} else
				this.NumerikcyModel.BV104_03.ZadanaHodnota = 0.0;
			
			// Ovládání klapky vpusti vratky do tanku NaOH Q1.0	
			if(data[1] >= 1){
				this.NumerikcyModel.BV103_03.ZadanaHodnota = 1.0;
			} else
				this.NumerikcyModel.BV103_03.ZadanaHodnota = 0.0;
		
		}

		// Prázdný konstruktor formulare
		public MainForm()
		{
			 
			 // Inicializace prvků formuláře
			 this.StartPosition = FormStartPosition.CenterScreen;
			 this.Name = "Model čistící stanice";
			 this.Text = "Model čistící stanice CIP";
			 this.Width = 1000;
			 this.Height = 700;
			 this.BackColor = Color.White;
			 this.Paint += new PaintEventHandler(OnPaintEvent);
			 this.SizeChanged +=new EventHandler(OnResizeEndEvent);
			 this.Click += new EventHandler(OnClickEvent); 
			 this.MenuStart +=new EventHandler(MenuClickEvent);
			 this.Closed += new EventHandler(FunkceEventuClose);
			 // Spustí událost paint když se mění velikost formuláře
			 this.SetStyle(ControlStyles.ResizeRedraw, true);
			 
			 // Zapnudí double buferingu
			 this.DoubleBuffered = true;

			 // Nastaveni hodnot velikosti klientske oblasti formuláře
			 Width_old = this.ClientSize.Width;
			 Height_old= this.ClientSize.Height;
			 
			 // Inicializace Flagu idikujicic stav Simulace
			 this.SimulaceSpustena = false;
			 this.RizeniOdPLC = true;
			 this.RizeniOdUzivatele = false;
			 this.KomunikacePLC = false;
			 this.KomunikaceS7_PLCSIM = false;
			 
			 PeriodaVzorkovani = 0.1;
			 PeriodaVykreslovani = 0.3;
			 PeriodaPrenosuData = 0.2;
			 TeplotaOkoli = 25.0;
			 MernaTepelnaKapacita = 4190.0;
			 CasoveZrychleni = 1.0;
			 
			 
			 #region Inicializace Hlavniho menu
			 
			 // Nastaveni polozky SIMULACE
			 MenuItem Start = new MenuItem("Start Simulace", MENUStartClickEvetn);
			 Start.Shortcut = Shortcut.CtrlS;

			 MenuItem Stop = new MenuItem("Zastavení Simulace", MENUStopClickEvetn);
			 Stop.Shortcut = Shortcut.CtrlC;
			 Stop.Enabled = false;
			 
			 MenuItem Reset = new MenuItem("Reset Modelu", this.MENUResetSimulaceEvetn);

			 MenuItem RizeniPlc = new MenuItem ("Řízení modelu z PLC", MENURizeniPLCEvetn);
			 RizeniPlc.RadioCheck = true;
			 RizeniPlc.Checked = true;
			 RizeniPlc.Enabled = false;
			 
			 MenuItem RizeniUzivatelem = new MenuItem("Řízení modelu uživatelem", MENURizeniUzivEvetn);
			 RizeniUzivatelem.RadioCheck = true;
			 RizeniUzivatelem.Checked = false;
			 RizeniUzivatelem.Enabled = false;
			 
			 MenuItem Ovladani =new MenuItem("Ovládání modelu", new MenuItem[]{RizeniPlc, RizeniUzivatelem});
			 
			 // Nastaveni simulace
			 MenuItem NastaveniSimulace = new MenuItem("Nastavní parametrů", MENUNastaveniSimulaceClick);
			 
			 // Vytvoreni polozky menu
			 MenuItem Simulace = new MenuItem("Simulace", new MenuItem[]{Start, Stop, Reset, Ovladani, NastaveniSimulace} );
		
			 // Polozka KOMPONENTY CIP
			 MenuItem Tanky = new MenuItem("Nastavní tanků", MENUNastaveniTankuClck);
			 MenuItem Ventily = new MenuItem("Nastavení ventilů", this.MENUNastaveniVentiluClck);
			 MenuItem Snimace = new MenuItem("Nastavení snímačů", this.MENUNastaveniSnimacu);
			 
			 MenuItem KomponentyCIP = new MenuItem("Komponenty CIP", new MenuItem[]{Tanky, Ventily, Snimace});
			 
			 
			 // Polozka KOMUNIKACE S PLC
			 MenuItem ConnectPLCSIM = new MenuItem("Připoj k S7-PLCSIM",this.MENUPripojPLCSIM);
			 MenuItem DisConnectPLCSIM = new MenuItem("Odpojení S7-PLCSIM", this.MENUOdpojPLCSIM);
			 
			 MenuItem ConnectionPLC = new MenuItem("Připojení k PLC", new MenuItem[]{ConnectPLCSIM, DisConnectPLCSIM});
			 
			                                       // Vytvoreni Hlavniho menu
			 this.Menu = new MainMenu(new MenuItem[]{Simulace, KomponentyCIP, ConnectionPLC});
			 
			 #endregion
			 
			 #region Inicializace komponent CIP
			 
			  // Inicializace tanku Vyplachova voda
			 TankVypVoda = new Tank();
			 TankVypVoda.Text2 = "Výplachová";
			 TankVypVoda.Text1 = "voda";
			 TankVypVoda.Text3 = "4000 L";
			 TankVypVoda.Position = new Point(660,160);
			 TankVypVoda.size = new Size(100, 170);
			 TankVypVoda.BarvaTekutiny = Brushes.Aqua;
						 	
			 // Inicializace tanku NaOH
			 TankNaOH = new Tank();
			 TankNaOH.Text2 = "Roztok";
			 TankNaOH.Text1 = "NaOH";
			 TankNaOH.Text3 = "4000 L";
			 TankNaOH.Position = new Point(440,160);
			 TankNaOH.size = new Size(100, 170);
			 TankNaOH.BarvaTekutiny = Brushes.YellowGreen;
			 
			 // Inicializace tanku HNO3
			 TankHNO3 = new Tank();
			 TankHNO3.Text2 = "Roztok";
			 TankHNO3.Text1 = "HNO3";
			 TankHNO3.Text3 = "4000 L";
			 TankHNO3.Position = new Point(220,160);
			 TankHNO3.size = new Size(100, 170);
			 TankHNO3.BarvaTekutiny = Brushes.YellowGreen;
			 
			 // Inicializace tanku Ciste vody
			 TankCisVoda = new Tank();
			 TankCisVoda.Text2 = "Čistá";
			 TankCisVoda.Text1 = "voda";
			 TankCisVoda.Text3 = "2000 L";
			 TankCisVoda.Position = new Point(80,220);
			 TankCisVoda.size = new Size(90, 110);
			 TankCisVoda.BarvaTekutiny = Brushes.Aqua;
			 
			 // Inicializace klapek
			 BV104_03 = new Klapka();
			 BV104_03.Text1 = "BV104-03";
			 BV104_03.Position = new Point(735, 85);
			 BV104_03.size = new Size(50, 60);
			 BV104_03.Click += new KomponentyCIP.ClickNaKomponentuHandler(this.ProhodZadanouHodnotu);
			 
			 BV103_03 = new Klapka();
			 BV103_03.Text1 = "BV103-03";
			 BV103_03.Position = new Point(515, 85);
			 BV103_03.size = new Size(50, 60);
			 BV103_03.Click += new KomponentyCIP.ClickNaKomponentuHandler(this.ProhodZadanouHodnotu);
			 
			 BV102_05 = new Klapka();
			 BV102_05.Text1 = "BV102-05";
			 BV102_05.Position = new Point(295, 85);
			 BV102_05.size = new Size(50, 60);
			 BV102_05.Click += new KomponentyCIP.ClickNaKomponentuHandler(this.ProhodZadanouHodnotu);
			 
			 BV100_01 = new Klapka();
			 BV100_01.Text1 = "BV100-01";
			 BV100_01.Position = new Point(50, 35);
			 BV100_01.size = new Size(50, 60);
			 BV100_01.Click += new KomponentyCIP.ClickNaKomponentuHandler(this.ProhodZadanouHodnotu);

			 BV101_03 = new Klapka();
			 BV101_03.Text1 = "BV101-03";
			 BV101_03.Position = new Point(50, 140);
			 BV101_03.size = new Size(50, 60);
			 BV101_03.Click += new KomponentyCIP.ClickNaKomponentuHandler(this.ProhodZadanouHodnotu);
			 
			 BV101_01 = new Klapka();
			 BV101_01.Text1 = "BV101-01";
			 BV101_01.Position = new Point(150, 342);
			 BV101_01.size = new Size(50, 60);
			 BV101_01.Click += new KomponentyCIP.ClickNaKomponentuHandler(this.ProhodZadanouHodnotu);

			 BV102_01 = new Klapka();
			 BV102_01.Text1 = "BV102-01";
			 BV102_01.Position = new Point(295, 342);
			 BV102_01.size = new Size(50, 60);
			 BV102_01.Click += new KomponentyCIP.ClickNaKomponentuHandler(this.ProhodZadanouHodnotu);
			 
			 BV103_01 = new Klapka();
			 BV103_01.Text1 = "BV103-01";
			 BV103_01.Position = new Point(515, 342);
			 BV103_01.size = new Size(50, 60);
			 BV103_01.Click += new KomponentyCIP.ClickNaKomponentuHandler(this.ProhodZadanouHodnotu);
			 
			 BV104_01 = new Klapka();
			 BV104_01.Text1 = "BV104-01";
			 BV104_01.Position = new Point(735, 342);
			 BV104_01.size = new Size(50, 60);
			 BV104_01.Click += new KomponentyCIP.ClickNaKomponentuHandler(this.ProhodZadanouHodnotu);
	 
			 // Inicializace cerpadel
			 CP109 = new Cerpadlo();
			 CP109.Position = new Point(840,385);
			 CP109.size = new Size(50,100);
			 CP109.Text1 = "Čerpadlo CP109";
			 CP109.Click += new KomponentyCIP.ClickNaKomponentuHandler(this.NovaZadanaHodnota);

			 CP106 = new Cerpadlo();
			 CP106.Position = new Point(280,560);
			 CP106.size = new Size(50,100);
			 CP106.Text1 = "Čerpadlo CP106";
			 CP106.Click += new KomponentyCIP.ClickNaKomponentuHandler(this.ProhodZadanouHodnotu);
			 
			 CP107 = new Cerpadlo();
			 CP107.Position = new Point(720,560);
			 CP107.size = new Size(50,100);
			 CP107.Text1 = "Čerpadlo CP107";
			 CP107.Click += new KomponentyCIP.ClickNaKomponentuHandler(this.ProhodZadanouHodnotu);

			 // Stridaci ventil
			 SSV109_01 = new StridaciVentil();
			 SSV109_01.Text1 = "SSV109-01";
			 SSV109_01.Position = new Point(890,170);
			 SSV109_01.size = new Size(60, 40);
			 SSV109_01.Click += new KomponentyCIP.ClickNaKomponentuHandler(this.ProhodZadanouHodnotu);
 
			 // Vymeniky
			 THE_105 = new Vymenik();
			 THE_105.Text1 = "THE-105";
			 THE_105.Position = new Point(395, 542);
			 THE_105.size = new Size(80,80);
			 THE_105.Click += new KomponentyCIP.ClickNaKomponentuHandler(this.NovaZadanaHodnota);

			 THE_106 = new Vymenik();
			 THE_106.Text1 = "THE-106";
			 THE_106.Position = new Point(575, 542);
			 THE_106.size = new Size(80,80);
			 THE_106.Click += new KomponentyCIP.ClickNaKomponentuHandler(this.NovaZadanaHodnota);

			 DP111 = new NadrzKoncentratu();
			 DP111.Text1 = "Koncentrát HNO3";
			 DP111.Position = new Point(60, 520);
			 DP111.size = new Size(60, 110);
			 DP111.Click += new KomponentyCIP.ClickNaKomponentuHandler(this.ProhodZadanouHodnotu);

			 DP112 = new NadrzKoncentratu();
			 DP112.Text1 = "Koncentrát NaOH";
			 DP112.Position = new Point(900, 520);
			 DP112.size = new Size(60, 110);
			 DP112.Click += new KomponentyCIP.ClickNaKomponentuHandler(this.ProhodZadanouHodnotu);
			 
			 // Snímače
			 QIC109_03 = new Snimac();
			 QIC109_03.Position = new Point(733, 15);
			 QIC109_03.size = new Size(50,40);
			 QIC109_03.Text1 = "Vodivost";
			 QIC109_03.Jednotka = "mS";

			 TIC109_02 = new Snimac();
			 TIC109_02.Position = new Point(835, 15);
			 TIC109_02.size = new Size(50,40);
			 TIC109_02.Text1 = "Teplota";
			 TIC109_02.Jednotka = "°C";
			 
			 FIC109_01 = new Snimac();
			 FIC109_01.Position = new Point(853, 295);
			 FIC109_01.size = new Size(50,40);
			 FIC109_01.Text1 = "Průtok";
			 FIC109_01.Jednotka = "l/s";
			 
			 TIC102_03 = new Snimac();
			 TIC102_03.Position = new Point(335, 225);
			 TIC102_03.size = new Size(50,40);
			 TIC102_03.Text1 = "Teplota";
			 TIC102_03.Jednotka = "°C";
			 
			 TIC103_03 = new Snimac();
			 TIC103_03.Position = new Point(555, 225);
			 TIC103_03.size = new Size(50,40);
			 TIC103_03.Text1 = "Teplota";
			 TIC103_03.Jednotka = "°C";
			 
			 TIC105_02 = new Snimac();
			 TIC105_02.Position = new Point(390, 485);
			 TIC105_02.size = new Size(50,40);
			 TIC105_02.Text1 = "Teplota";
			 TIC105_02.Jednotka = "°C";
			 
			 TIC106_02 = new Snimac();
			 TIC106_02.Position = new Point(610, 485);
			 TIC106_02.size = new Size(50,40);
			 TIC106_02.Text1 = "Teplota";
			 TIC106_02.Jednotka = "°C";
			 
			 QIC105_01 = new Snimac();
			 QIC105_01.Position = new Point(298, 485);
			 QIC105_01.size = new Size(50,40);
			 QIC105_01.Text1 = "Vodivost";
			 QIC105_01.Jednotka = "mS";
			 
			 QIC106_01 = new Snimac();
			 QIC106_01.Position = new Point(698, 485);
			 QIC106_01.size = new Size(50,40);
			 QIC106_01.Text1 = "Vodivost";
			 QIC106_01.Jednotka = "mS";		 
			 
			 #endregion
			 
			 // Casovač prěnosu dat mezi PLC a PLCSIM;
			 CasovacPrenosuDat = new System.Timers.Timer(500);
			 CasovacPrenosuDat.Elapsed += new ElapsedEventHandler(this.PrenesData);
			 
			 // Inicializace casovace prekreslení
			 CasovacPrekresleni = new System.Timers.Timer(200);
			 CasovacPrekresleni.Elapsed += new ElapsedEventHandler(this.OnTimerDrawElapsed);
			
			 
			  // Inicializace komunikacniho modulu s PLCSIM
			 ConnectionPLCSIM = new PLCSIM();
			 
			 // Inicializace numerikceho modelu
			 NumerikcyModel = new NumerickyModelCIP();
			 
			 // Prekopirovani stavu z numerickeho modelu
			 this.CopyState();
			 
			 // Potvrzeni inicializace formuláře a jeho komponent
			 Init = true;
			 
		}
	}
}
