private void butCalcolo_Click(object sender, EventArgs e) { int IndiceFormato; for (int i = 0; i < this.Formati.Length; i++) { if (Formati[i].GetNome().Equals(comboBoxFormato.SelectedItem)) { IndiceFormato = i; break; } } Formato FormatoA = this.Formati[0]; int NumeroCreg = ((FormatoA.PpmF - FormatoA.PpmI) / FormatoA.Passo) + 1; Creg[] CregTot = new Creg[NumeroCreg]; for (int i = 0; i < NumeroCreg; i++) { FormatoA.PpmA = FormatoA.PpmI + (FormatoA.Passo * i); CregTot[i] = new Creg(FormatoA, textBoxPath.Text, 2); chartCreg.Series["Creg"].Points.AddXY(FormatoA.PpmA, CregTot[i].CregAttuale); } int Tolleranza = Convert.ToInt32(textBoxTolleranza.Text); this.CregInit = new Start_Creg(CregTot, Tolleranza, (-1 * Tolleranza)); textBoxBs.Text = CregInit.Bs.ToString(); textBoxBv.Text = CregInit.Bv.ToString(); this.butAvanti.Enabled = true; //Disegno il grafico chartCreg.Series["Creg"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; chartCreg.Series["Creg"].ChartArea = "ChartArea1"; //Aggiorno FormFiglio this.FormFiglio = new Form2(this, this.CregInit); }
private void butCalcolo_Click(object sender, EventArgs e) { //Cancello i punti del grafico precedente foreach (var series in chartCreg.Series) { series.Points.Clear(); } //Rendo visibile il grafico chartCreg.Visible = true; //Ottengo l'indice dell'array del formato selezionato nella combobox int IndiceFormato = 0; for (int i = 0; i < this.Formati.Length; i++) { if (Formati[i].GetNome().Equals(comboBoxFormato.SelectedItem)) { IndiceFormato = i; break; } } //Setto il formato attuale Formato FormatoA = this.Formati[IndiceFormato]; //Calcolo il numero di Creg da calcolare int NumeroCreg = ((FormatoA.PpmF - FormatoA.PpmI) / FormatoA.Passo) + 1; Creg[] CregTot = new Creg[NumeroCreg]; //Istanzio i vari Creg e li inizializzo for (int i = 0; i < NumeroCreg; i++) { FormatoA.PpmA = FormatoA.PpmI + (FormatoA.Passo * i); CregTot[i] = new Creg(FormatoA, textBoxPath.Text, Global.NumPeriodi); chartCreg.Series["Creg"].Points.AddXY(FormatoA.PpmA, CregTot[i].CregAttuale); } //Setto la tolleranza int Tolleranza = Convert.ToInt32(textBoxTolleranza.Text); //Istanzio lo Start_Creg, ovvero la classe che contiene tutti i Creg di inizializzazione this.CregInit = new Start_Creg(CregTot, Tolleranza, (-1 * Tolleranza)); //Visualizzo Bs e Bv textBoxBs.Text = CregInit.Bs.ToString(); textBoxBv.Text = CregInit.Bv.ToString(); this.butAvanti.Enabled = true; //Disegno il grafico chartCreg.Series["Creg"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; chartCreg.Series["Creg"].ChartArea = "ChartArea1"; //Aggiorno FormFiglio this.FormFiglio = new Form2(this, this.CregInit); //Operazioni sulla grafica butCalcolo.Enabled = false; comboBoxFormato.BackColor = Color.LightGreen; textBoxPath.Text = "Inserire Path Salvataggio .CSV"; textBoxTolleranza.Text = "Inserire un Intero"; textBoxPath.Enabled = false; textBoxTolleranza.Enabled = false; }
private void butCalcola_Click(object sender, EventArgs e) { //Se è necessario avvio il timer if (Timer && !timer1.Enabled) { timer1.Start(); } //Setto a false l'allarme, poi controllo se attivarlo o no pictureBoxAllarme.Image = OPC_CTPACK_Software.Properties.Resources.e; pictureBoxAllarme.Enabled = false; //Cancello i punti del grafico precedente chartCreg.Series["CregAttuale"].Points.Clear(); //Prima parte// //Attraverso l'OPC mi interefaccio col PLC, tiro giu i dati e li salvo su CSV double[] PosNow = new double[Global.NumeroCampioni]; double[] VelNow = new double[Global.NumeroCampioni]; double[] CorNow = new double[Global.NumeroCampioni]; int[] Tempo = new int[Global.NumeroCampioni]; //Leggo la velocità a cui sta andando la macchina int PpmNow = (int)Com_Functions.RsLinx_OPC_Client_Read($"[{Global.TopicName}]Ppm_Run").Value; //Controllo che la lettura sia andata a buon fine if (PpmNow == -1) { return; } //Setto Ppm_Start al valore appena letto di Ppm_Run per far capire al PLC che deve partire col campionamento Com_Functions.RsLinx_OPC_Client_Write($"[{Global.TopicName}]Ppm_Start", PpmNow); while (true) { int Controllo = (int)Com_Functions.RsLinx_OPC_Client_Read($"[{Global.TopicName}]Ppm_Start").Value; //Controllo che la lettura sia andata a buon fine if (Controllo == -1) { return; } //Attendo che il plc finisca di fare i campionamenti, quando finisce mette Ppm_Start a 0 if (Controllo == 0) { break; } Thread.Sleep(500); } //Ne creo una nuova istanza per non aver problemi visto che le classi vengono passate per riferimento Formato FormatoAttuale = new Formato(this.CregInit.CregTot[0].Formato.Nome, this.CregInit.CregTot[0].Formato.Motore, this.CregInit.CregTot[0].Formato.Kv, this.CregInit.CregTot[0].Formato.Kt, PpmNow, this.CregInit.CregTot[0].Formato.PpmI, this.CregInit.CregTot[0].Formato.PpmF, this.CregInit.CregTot[0].Formato.Passo); float[] Temp; for (int i = 0; i < PosNow.Length / Global.LengthArray; i++) { Temp = (float[])Com_Functions.RsLinx_OPC_Client_Read_Array($"[{Global.TopicName}]Posizione[{i * Global.LengthArray}]", Global.LengthArray)[0].Value; //Controllo che la lettura sia andata a buon fine if (Temp[0] == -1) { return; } Temp.CopyTo(PosNow, i * Global.LengthArray); Temp = (float[])Com_Functions.RsLinx_OPC_Client_Read_Array($"[{Global.TopicName}]Velocita[{i * Global.LengthArray}]", Global.LengthArray)[0].Value; //Controllo che la lettura sia andata a buon fine if (Temp[0] == -1) { return; } Temp.CopyTo(VelNow, i * Global.LengthArray); Temp = (float[])Com_Functions.RsLinx_OPC_Client_Read_Array($"[{Global.TopicName}]Corrente[{i * Global.LengthArray}]", Global.LengthArray)[0].Value; //Controllo che la lettura sia andata a buon fine if (Temp[0] == -1) { return; } Temp.CopyTo(CorNow, i * Global.LengthArray); } for (int i = 0; i < Tempo.Length; i++) { //Creo l'array Tempo Tempo[i] = (int)(i * (Global.TempoCampionamento * 1000)); } //Mi salvo le variabili che arrivano dal PLC e creo il .CSV con le informazioni alla velocità i StreamWriter FileInfoAsse = new StreamWriter($"{Global.PathTrend}{FormatoAttuale.PpmA}_{FormatoAttuale.Nome}.CSV"); FileInfoAsse.WriteLine($"Formato\t{FormatoAttuale.Nome}"); FileInfoAsse.WriteLine($"Motore\t{FormatoAttuale.Motore.GetModel()}"); FileInfoAsse.WriteLine($"TempoCampionamento\t{Global.TempoCampionamento}"); FileInfoAsse.WriteLine("Time\tPosizione\tVelocità\tCorrente"); for (int k = 0; k < PosNow.Length; k++) { FileInfoAsse.WriteLine($"{Tempo[k]}\t{PosNow[k]}\t{VelNow[k]}\t{CorNow[k]}"); } //Chiudo il File FileInfoAsse.Close(); //Seconda parte// //Apro il CSV appena salvato, calcolo il Creg e lo grafico Creg CregAttuale = new Creg(FormatoAttuale, Global.PathTrend, this.CregInit.CregTot[0].Periodi); //Disegno il punto del CregAttuale sul grafico chartCreg.Series["CregAttuale"].Points.AddXY(CregAttuale.Formato.PpmA, CregAttuale.CregAttuale); //Visualizzo il valore di CregAttuale textBoxCreg.Text = CregAttuale.CregAttuale.ToString(); //Scrivo il valore calcolato di Creg sull'array Com_Functions.RsLinx_OPC_Client_Write($"[{Global.TopicName}]Creg_Attuale", (float)CregAttuale.CregAttuale); //Ottengo il valore di CregTeo relativo ai Ppm attuali necessario per il confronto double CregTeo = 0; if (CregAttuale.Formato.PpmA == CregInit.CregTot[0].Formato.PpmA) { CregTeo = CregInit.CregTot[0].CregAttuale; } else { for (int i = 1; i < CregInit.CregTot.Length; i++) { if (CregAttuale.Formato.PpmA == CregInit.CregTot[i].Formato.PpmA) { CregTeo = CregInit.CregTot[i].CregAttuale; break; } else if ((CregAttuale.Formato.PpmA > CregInit.CregTot[i - 1].Formato.PpmA) && (CregAttuale.Formato.PpmA < CregInit.CregTot[i].Formato.PpmA)) { CregTeo = ((CregInit.CregTot[i - 1].CregAttuale * (CregInit.CregTot[i].Formato.PpmA - CregAttuale.Formato.PpmA)) + (CregInit.CregTot[i].CregAttuale * (CregAttuale.Formato.PpmA - CregInit.CregTot[i - 1].Formato.PpmA))) / CregInit.CregTot[i].Formato.Passo; break; } } } //Controllo se il CregAttuale è nelle soglie, se così non è attivo allarme if (CregAttuale.CregAttuale >= (CregTeo + (CregTeo * CregInit.OffsetPos) / 100)) { pictureBoxAllarme.Enabled = true; } if (CregAttuale.CregAttuale <= (CregTeo + (CregTeo * CregInit.OffsetNeg) / 100)) { pictureBoxAllarme.Enabled = true; } //Scrivo il valore del CregAttuale sul file per lo storico con PPM StreamWriter Storico; if (File.Exists($"{Global.PathStorico}{CregAttuale.Formato.PpmA}_{CregAttuale.Formato.Nome}_Storico_Creg.txt")) { //Se il file esiste già lo apro in append Storico = File.AppendText($"{Global.PathStorico}{CregAttuale.Formato.PpmA}_{CregAttuale.Formato.Nome}_Storico_Creg.txt"); } else { //Se non esiste lo creo e scrivo l'intestazione Storico = new StreamWriter($"{Global.PathStorico}{CregAttuale.Formato.PpmA}_{CregAttuale.Formato.Nome}_Storico_Creg.txt"); Storico.WriteLine($"Tolleranza\t{this.CregInit.OffsetPos}"); Storico.WriteLine($"CregTeo\t{CregTeo}"); Storico.WriteLine(""); Storico.WriteLine("DateTime\t\tCreg"); } //Scrivo il CregAttuale e chiudo il file Storico.WriteLine($"{DateTime.Now}\t{CregAttuale.CregAttuale}"); Storico.Close(); //Scrivo il valore del CregAttuale sul file per lo storico Totale StreamWriter StoricoTot; if (File.Exists($"{Global.PathStorico}TOT_{CregAttuale.Formato.Nome}_Storico_Creg.txt")) { //Se il file esiste già lo apro in append StoricoTot = File.AppendText($"{Global.PathStorico}TOT_{CregAttuale.Formato.Nome}_Storico_Creg.txt"); } else { //Se non esiste lo creo e scrivo l'intestazione StoricoTot = new StreamWriter($"{Global.PathStorico}TOT_{CregAttuale.Formato.Nome}_Storico_Creg.txt"); StoricoTot.WriteLine($"Tolleranza\t{this.CregInit.OffsetPos}"); StoricoTot.WriteLine(""); StoricoTot.WriteLine("DateTime\t\tCreg\t\t\tCregTeo\t\t\tPpm"); } //Scrivo il CregAttuale e chiudo il file StoricoTot.WriteLine($"{DateTime.Now}\t{CregAttuale.CregAttuale}\t{CregTeo}\t{CregAttuale.Formato.PpmA}"); StoricoTot.Close(); }