Autor Beitrag
Maria2
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Sa 02.03.19 22:25 
Hallo Zusammen,

ich möchte gerne wissen, wie ich bei Visual studio c# die Messzeit ermitteln kann? Ich hab ein button für Überdruck und eins für unterdruck.
Wenn ich diese betätige, soll er anfangen in millisekunden zu zählen. Wenn diese button nicht aktiv ist, beendet der Meszeit.

Zurzeit zählt er die Messzeit beim Start von Arduino Board. Ich messe Druck mit Arduino und habe ein Benutzeroberfläche erstellt. Leider wird in Textbox und in Chart die gesamte startzeit von arduino angegeben anstatt nur die Messzeit der Button betätigung. Kan mir einer helfen oder tipp geben, wie ich das gewünschte ziel erreiche?

Danke


Moderiert von user profile iconTh69: Topic aus C# - Die Sprache verschoben am Sa 02.03.2019 um 21:44
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 02.03.19 22:54 
Hallo und :welcome:,

dafür gibt es die Klasse Stopwatch. Ein paar Codebeispiele dazu findest du unter C# Stopwatch Examples: StartNew and Elapsed.
Du mußt die Variable nur als Member deiner Klasse anlegen, so daß du in den jeweiligen Button_Click-Methoden darauf zugreifen kannst.

Wenn du die Zeit laufend anzeigen willst, dann erzeuge zusätzlich noch einen Timer (für WinForms), in dessen Tick-Methode du dann die Zeit in der TextBox ausgibst.

Alternativ könntest du dir auch in der Button-Methode die aktuelle Zeit merken (auch wieder mit einer Membervariablen) und jeweils die Differenz dazu ausgeben.
Maria2 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: So 03.03.19 18:19 
Hallo,

danke für die Antwort :-)

Also ich muss jeweils unter folgende button schreiben:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
private void motorSteuerungON_Button_Click(object sender, EventArgs e)
{
  motorSteuerungON_Button.Enabled = false;
  motorSteuerungOff_Button.Enabled = true;
  if (port.IsOpen)
    port.Write("motorOn");
}

private void motorSteuerungOff_Button_Click(object sender, EventArgs e)
{
  motorSteuerungON_Button.Enabled = true;
  motorSteuerungOff_Button.Enabled = false;

  if (port.IsOpen)
    port.Write("motorOff");
}

ich möchte das er ab 0 in millisekunde zählt. In arduino hab ich 250millisekunde als delay eingestellt. das würde heißen, das er 0, 250, 500.... zählt.
Was muss ich dann in Chart machen? weil ich gebe den wert einmal in textbox und einmal als Chart (live-stream)aus
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
private void chart1Thread(double sensor, int time)
{
  //Console.WriteLine("Sensor 1: {0}", sensor);
  chart1.Invoke(new Action(() =>
  {
    chart1.Series["Sensor1"].Points.AddXY(time, sensor);

    if (chart1.ChartAreas[0].AxisX.Maximum > chart1.ChartAreas[0].AxisX.ScaleView.Size)
      chart1.ChartAreas[0].AxisX.ScaleView.Scroll(chart1.ChartAreas[0].AxisX.Maximum);
  }));
}

private void chart2Thread(double sensor, int time)
{
  //Console.WriteLine("Sensor 2: {0}", sensor);
  chart1.Invoke(new Action(() =>
  {
    chart1.Series["Sensor2"].Points.AddXY(time, sensor);
  }));
}

private void chart3Thread(double sensor, int time)
{
  //Console.WriteLine("Sensor 3: {0}", sensor);
  chart1.Invoke(new Action(() =>
  {
    chart1.Series["Sensor3"].Points.AddXY(time, sensor);
  }));
}

Für x-Achse der Chart:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
private void chart1_MouseWheel(object sender, MouseEventArgs e)
{
  var chart = (Chart)sender;
  var xAxis = chart.ChartAreas[0].AxisX;
  var yAxis = chart.ChartAreas[0].AxisY;

  try
  {
    if (e.Delta < 0// Scrolled down.
    {
      xAxis.ScaleView.ZoomReset();
      yAxis.ScaleView.ZoomReset();
    }
    else if (e.Delta > 0// Scrolled up.
    {
      var xMin = xAxis.ScaleView.ViewMinimum;
      var xMax = xAxis.ScaleView.ViewMaximum;
      var yMin = yAxis.ScaleView.ViewMinimum;
      var yMax = yAxis.ScaleView.ViewMaximum;

      var posXStart = xAxis.PixelPositionToValue(e.Location.X) - (xMax - xMin) / 4;
      var posXFinish = xAxis.PixelPositionToValue(e.Location.X) + (xMax - xMin) / 4;
      var posYStart = yAxis.PixelPositionToValue(e.Location.Y) - (yMax - yMin) / 4;
      var posYFinish = yAxis.PixelPositionToValue(e.Location.Y) + (yMax - yMin) / 4;

      xAxis.ScaleView.Zoom(posXStart, posXFinish);
      yAxis.ScaleView.Zoom(posYStart, posYFinish);
    }
  }
  catch { }
}


Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 03.03.19 19:25 
Und was ist deine konkrete Frage dazu?
Maria2 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: So 03.03.19 21:21 
Meine Frage ist, ob ich unter den Button Motor on und Motor off die Zeit einstellung programmieren muss? Die nächste Frage ist, ob unter Chart auch zeit Code erstellt werden muss oder ob es reicht wenn es unter Button steht. Ist überhaupt das Code für mouseviel richtig für x-Achse ?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 03.03.19 22:30 
Ja, in den beiden Button_Click-Methoden startest und stoppst du die Stopwatch:
ausblenden C#-Quelltext
1:
2:
3:
stopwatch.Start();
// bzw.
stopwatch.Stop();


Und in den chartXThread-Methoden fragst du ab, ob die Stopwatch läuft und läßt dir die Millisekunden ausgeben:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
if (stopwatch.IsRunning)
{
  int ms = stopwatch.ElapsedMilliseconds;
  // zu Chart hinzufügen ...
}

So, jetzt habe ich schon fast den gesamten Code gepostet...

PS: Du meinst "MouseWheel" bei deiner letzten Frage? Damit zoomst (skalierst) du doch nur innerhalb des Charts.
Maria2 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: So 03.03.19 23:44 
vielen Dank :-)

Ich versuche das jetzt so zu machen, hoffentlich bekomme ich es hin.

Das mit Mousewheel ist tatsächlich nur zoom, da hast du recht.
Maria2 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mo 04.03.19 14:59 
leider funktioniert es nicht so :-( Weiß nicht was ich da falsch mache
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 05.03.19 10:25 
Dann wissen wir leider auch so nicht. :nixweiss:

Kriegst du den Code nicht zum Kompilieren (d.h. Fehlermeldungen) oder hast du Fehler zur Laufzeit?
Maria2 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 06.03.19 12:55 
Erstmal zeigt er fehler und es zählt die Messzeit nicht. das heißt es ist immer so wie es vorher war :-(
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
private void motorSteuerungON_Button_Click(object sender, EventArgs e)
{
  motorSteuerungON_Button.Enabled = false;
  motorSteuerungOff_Button.Enabled = true;
  if (port.IsOpen)
    port.Write("motorOn");
  Stopwatch stopWatch = new Stopwatch();
  stopWatch.Start();
  Thread.Sleep(250);
  stopWatch.Stop();
}
private void motorSteuerungOff_Button_Click(object sender, EventArgs e)
{
  motorSteuerungON_Button.Enabled = true;
  motorSteuerungOff_Button.Enabled = false;

  if (port.IsOpen)
    port.Write("motorOff");
  Stopwatch stopWatch = new Stopwatch();
  stopWatch.Start();
  Thread.Sleep(10000);
  stopWatch.Stop();
  TimeSpan ts = stopWatch.Elapsed;
}

private void chart1Thread(double sensor, int time)
{
  //Console.WriteLine("Sensor 1: {0}", sensor);
  chart1.Invoke(new Action(() =>
  {
    chart1.Series["Sensor1"].Points.AddXY(time, sensor);

    if (chart1.ChartAreas[0].AxisX.Maximum > chart1.ChartAreas[0].AxisX.ScaleView.Size)
      chart1.ChartAreas[0].AxisX.ScaleView.Scroll(chart1.ChartAreas[0].AxisX.Maximum);
  }));
  if (Stopwatch.IsRunning) //das wird rot markiert beim Komlieren
  {
    int ms = stopwatch.ElapsedMilliseconds; //das wird rot markiert beim Komlieren
  }
}


Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 06.03.19 14:56 
Ich schrieb ja auch:
Th69 hat folgendes geschrieben:
Du mußt die Variable nur als Member deiner Klasse anlegen, ...

d.h. nicht als lokale Variable.

Daher auch die Compilerfehler.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 07.03.19 01:09 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Maria2 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Do 07.03.19 23:54 
Ich habe stopwatch folgendermaßen eingefügt und es funktioniert. Leider zählt er die Messzeit nicht richtig und macht zwischendurch Fehler. Ich weiß nicht ob es an dem String liegt? oder sieht ihr den Fehler?

Das ist stopwatch:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
private void motorSteuerungON_Button_Click(object sender, EventArgs e)
        {
            motorSteuerungON_Button.Enabled = false;
            motorSteuerungOff_Button.Enabled = true;
            if (port.IsOpen)
                port.Write("motorOn");
            if (stopWatch.IsRunning)
            {
                stopWatch.Restart();
            }
            else
            {
                stopWatch.Start();
            }
            //chart1.alle linien löschen googlen.Dann von 0 anfangen.
            //stopWatch.Start();
            //Thread.Sleep(250);
            //stopWatch.Stop();
        }

        private void motorSteuerungOff_Button_Click(object sender, EventArgs e)
        {
            motorSteuerungON_Button.Enabled = true;
            motorSteuerungOff_Button.Enabled = false;

            if (port.IsOpen)
                port.Write("motorOff");
            //Stopwatch stopWatch = new Stopwatch();
            //stopWatch.Start();
            //Thread.Sleep(10000);
            //stopWatch.Stop();
            //TimeSpan ts = stopWatch.Elapsed;
            if (stopWatch.IsRunning)
            {
                stopWatch.Restart();
            }
            else
            {
                stopWatch.Start();
            }
            
            //chart1.alle linien löschen googlen.Dann von 0 anfangen.
        }
ist hier etwas falsch?
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
        private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            while (port.IsOpen)
            {
                Thread.Sleep(250);
              // string stopw  = "Stopwatch: " +stopWatch.ElapsedMilliseconds.ToString()+"\n";
                var sp = (SerialPort)sender;
                string receivedText = sp.ReadExisting();
                //Console.WriteLine(receivedText);

                serialMonitor.Invoke(new Action(() =>
                {
                    //serialMonitor.AppendText(receivedText);
                    //serialMonitor.ScrollToCaret();

                    string[] decimalarray = receivedText.Split(' ');
                    if (decimalarray.Length == 4)
                    {
                       // string monitorText = "     " + decimalarray[0] + "              " + decimalarray[1] + "               " + decimalarray[2] + "             " + decimalarray[3];
                        string monitorText = "     " + decimalarray[0] + "              " + decimalarray[1] + "               " + decimalarray[2] + "             " + stopWatch.ElapsedMilliseconds.ToString() + "\n";
                        serialMonitor.AppendText(monitorText);
                        //serialMonitor.AppendText(stopw);
                        serialMonitor.ScrollToCaret();
         
                    }
                    /*
                    string[] decimalarray = receivedText.Split(' ');
                    if (decimalarray.Length == 4)
                    {
                        string monitorText = "     " + decimalarray[0] + "       |       " + decimalarray[1] + "        |       " + decimalarray[2] + "      |       " + decimalarray[3];
                        serialMonitor.AppendText(monitorText);
                        serialMonitor.ScrollToCaret();
                    }
                    */

                }));

                lock (_lock)
                {
                    _queue.Enqueue(receivedText);
                }

                // notify the waiting thread

                _signal.Set();
            }
        }

        private void openPortButton_Click(object sender, EventArgs e)
        {
            openPort_Button.Enabled = false;
            closePort_Button.Enabled = true;
            port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
            port.Open();

            if (!chartThread.IsAlive)
                chartThread.Start();
        }


Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 08.03.19 01:41 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 08.03.19 09:27 
Maria2: Ist das eine Schüleraufgabe oder bist du noch in der Ausbildung? Dafür, daß dir (anscheinend) noch diverse Grundlagen fehlen, hantierst du in deinem Projekt schon mit sehr fortgeschrittenen Funktionalitäten (wie z.B. SerialPort, Threads, lock, Signals, ...).

Du solltest verstehen, was jede einzelne Zeile in deinem Code bewirkt. Kannst du denn schon mit dem Debugger umgehen (ansonsten s. Ein erster Blick auf den Visual Studio-Debugger)?
Dann würdest du auch recht leicht den von user profile iconFrühlingsrolle bemerkten Fehler entdecken (mittels Haltepunkt und Einzelschrittausführung sowie dem Überwachungsfenster, d.h. Variableninhalte überprüfen).

PS: Und bitte poste deinen Code hier mit entsprechenden C#-Tags (so wie ich es nachträglich gemacht habe).
Maria2 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Fr 08.03.19 14:01 
Das Stoppuhr soll ja neu starten, wenn ich den andere Button betätige.
Motor on und off hat in diesem fall nicht zu bedeuten....hatte vorher vorgehabt ein Schalter einzusetzen. Das tue ich nicht mehr, deshalb benutze ich "motoron on" für Erzeugung von Überdruck und "motor off" für Erzeugung von Unterdruck.

Restart hab ich deswegen eingefügt, weil ich möchte das die Zeit mit 0 anfängt (nicht die Startzeit von Arduino) und wenn es nicht tut, soll er wieder starten. Oder hab ich da ein Denkfehler?
Das Problem hier ist, das der Arduino am PC angeschlossen bleibt und er zählt ja die Zeiten ab dem Start der Board. So würde ich aber nicht die Zeit erhalten, die ich erst bei Betätigung der Button brauche (Messzeit). Aus diesem Grund muss ich Visual mitteilen, das er bei Betätigung der button erst mit 0 ms anfängt und bei betätigung der anderen Button fängt er dort wieder von o an.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 08.03.19 14:49 
OK, dann sollte es so funktionieren (auch wenn du zwingend die Bezeichner ändern solltest - in einigen Wochen weißt du dann selber nicht mehr, was die Methoden bedeuten sollen).
Maria2 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Sa 09.03.19 11:09 
das stimmt :-) funktionieren tut es jetzt :-)

Moderiert von user profile iconTh69: Neue Frage entfernt.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 09.03.19 11:34 
Bitte erstelle dafür, entsprechend der Richtlinien "3.3 Frage formulieren - Eine Frage pro Topic", ein neues Thema (und auch gleich mit passenden C#-Tags, also [cs]...[/cs]), danke.

Solange sperre ich dieses Thema.

Edit: Thema wieder entsperrt. Neue Frage: CSV-​Datei in Excell richtig abspeichern