Fragensteller
Letzer Index auslesen

Allgemeine Diskussion
-
Hallo, ich schreibe gerade ein Programm in C#. Und zwar macht eine Kamera ein Bild von 4 Würfel (2 kleine, ein mittlerer und ein großer) Jetzt sollen die Würfel nach Größe sortiert werden und dann über eine Serielle Kommunikation, deren Postion an einen Roboter gesendet werden.
Bis jetzt haben wir die Umrechnung der Koordinaten und die serielle Schnittstelle. Unser Problem gerade ist das er den größten, den mittleren ausgibt und den kleinen aber immer zweimal den selben Wert ausgibt, haben ja zwei unterschiedliche Postionen die zwei kleinen Würfel
Danke schon mal für die Hilfe.
Habe mal das ganze Programm rein gemacht.using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.IO.Ports; using System.Threading; using HALCONXLib; using System.Linq; namespace HDevelopTemplate { /// <summary> /// Summary description for Form1. /// </summary> public class HDevelopTemplate : System.Windows.Forms.Form { private System.Windows.Forms.Button Run; private AxHALCONXLib.AxHWindowXCtrl HXCtrl; private HDevelopExport HDevExp; private System.Windows.Forms.Label Status; /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.Container components = null; public HDevelopTemplate() { // // Required for Windows Form Designer support // InitializeComponent(); // // TODO: Add any constructor code after InitializeComponent call // HDevExp = new HDevelopExport(); } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code /// <summary> /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// </summary> private void InitializeComponent() { System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(HDevelopTemplate)); this.HXCtrl = new AxHALCONXLib.AxHWindowXCtrl(); this.Run = new System.Windows.Forms.Button(); this.Status = new System.Windows.Forms.Label(); ((System.ComponentModel.ISupportInitialize)(this.HXCtrl)).BeginInit(); this.SuspendLayout(); // // HXCtrl // this.HXCtrl.Enabled = true; this.HXCtrl.Location = new System.Drawing.Point(8, 8); this.HXCtrl.Name = "HXCtrl"; this.HXCtrl.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("HXCtrl.OcxState"))); this.HXCtrl.Size = new System.Drawing.Size(512, 512); this.HXCtrl.TabIndex = 0; this.HXCtrl.Enter += new System.EventHandler(this.HXCtrl_Enter); // // Run // this.Run.Location = new System.Drawing.Point(536, 8); this.Run.Name = "Run"; this.Run.Size = new System.Drawing.Size(65, 25); this.Run.TabIndex = 1; this.Run.Text = "Run"; this.Run.Click += new System.EventHandler(this.Run_Click); // // Status // this.Status.Location = new System.Drawing.Point(8, 528); this.Status.Name = "Status"; this.Status.Size = new System.Drawing.Size(593, 17); this.Status.TabIndex = 2; // // HDevelopTemplate // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(616, 553); this.Controls.AddRange(new System.Windows.Forms.Control[] { this.Status, this.Run, this.HXCtrl}); this.Name = "HDevelopTemplate"; this.Text = "HDevelopTemplate"; this.Load += new System.EventHandler(this.Form1_Load); ((System.ComponentModel.ISupportInitialize)(this.HXCtrl)).EndInit(); this.ResumeLayout(false); } #endregion /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.Run(new HDevelopTemplate()); } private void Form1_Load(object sender, System.EventArgs e) { HDevExp.InitHalcon(); } private void Run_Click(object sender, System.EventArgs e) { HWindowX Window = HXCtrl.HalconWindow; Status.Text = "Running..."; Status.Refresh(); HDevExp.RunHalcon(Window); Status.Text = "Finished."; // Variablen Definieren in Arrays double[] Row_coordinate = (double[])HDevExp.hv_Row; double[] Coloumn_coordinate = (double[])HDevExp.hv_Column; //double[] z = (double[])HDevExp.z; int[] area1 = (int[])HDevExp.hv_Area; double[] angle = (double[])HDevExp.hv_Phi; int würfelanzahl = Row_coordinate.Length; // Definierung von Ports SerialPort SerialPort = new SerialPort("COM1"); SerialPort.BaudRate = 9600; SerialPort.Parity = Parity.None; SerialPort.DataBits = 8; SerialPort.StopBits = StopBits.One; SerialPort.Handshake = Handshake.None; SerialPort.ReadTimeout = 500; SerialPort.WriteTimeout = 500; SerialPort.RtsEnable = true; SerialPort.Open(); // Würfel Größen: int biggest_area = 30000; int middle_area = 16000; int small_area = 8500; ArrayList Index_biggest = new ArrayList(); int h = 1; ArrayList Index_middle = new ArrayList(); int j = 1; ArrayList Index_small = new ArrayList(); int k = 2; //Blöcke nach Größe sortieren int[] TestArray = new int[] {biggest_area, middle_area, small_area}; Array.Reverse(TestArray); Int32[] Index_biggest_1 = (Int32[]) Index_biggest.ToArray(typeof(Int32)); Int32[] Index_middle_1 = (Int32[])Index_middle.ToArray(typeof(Int32)); Int32[] Index_small_1 = (Int32[])Index_small.ToArray(typeof(Int32)); String Msg; //Zielpositionen definieren int robot_position_X; int robot_position_Y; int robot_winkel; //Zielposition Würfel auf Palette //Bei 2. Ebene muss Z_Position höher sein int Ziel_Y; int Ziel_Z; int Ziel_A; int Ziel_B; int Ziel_C; //Schnittstelle.ReadTimeout = 50000; byte[] readbuffer = new byte[1]; //Schnittstelle.Read(readbuffer, 0, 1); //Array.Clear(readbuffer, 0, 1); if (h == 1) //biggest ist da und soll zuerst gestapelt werden (wurde oben schon sortiert) { int index = 0; //Index suchen mit größten Werten for (index=0; index < 4; index++) { int area = area1[index]; if (area >= biggest_area) { break; } } //Position auslesen und umrechnen robot_position_X = (int)(4.5339 * Coloumn_coordinate[index]); robot_position_Y = (int)(3.719 * Row_coordinate[index]); robot_winkel = (int)(180 * angle[index] / System.Math.PI); //P2: Zielpositionen auf der Pallette definieren Ziel_X = (int)1310.5; Ziel_Y = (int)558.9; Ziel_Z = (int)307.3; Ziel_A = (int)17.2; Ziel_B = (int)40.6; Ziel_C = (int)164.1; //biggest wird immer zuerst gestapelt! //Row_Coordinates aus Kamera auslesen Msg = robot_position_X.ToString(); SerialPort.Write(Msg); Msg = " "; SerialPort.Write(Msg);//Leerzeichen Msg = robot_position_Y.ToString(); SerialPort.Write(Msg); Msg = " "; SerialPort.Write(Msg); Msg = robot_winkel.ToString(); SerialPort.Write(Msg); Msg = " "; SerialPort.Write(Msg); // Setze Timeout SerialPort.ReadTimeout = 500000; //SerialPort.Read(readbuffer, 0, 1); //Array.Clear(readbuffer, 0, 1); h = h - 1; //biggest wurde schon gestapelt und ist nicht mehr da } if (j == 1) //middle ist da und wird gestapelt { int index1 = 0; for (; index1 <= area1.Length; index1++ ) { int area = area1[index1]; if(area >= small_area && area < biggest_area) { break; } } //Position auslesen und umrechnen robot_position_X = (int)(4.5339 * Coloumn_coordinate[index1]); robot_position_Y = (int)(3.719 * Row_coordinate[index1]); robot_winkel = (int)(180 * angle[index1] / System.Math.PI); //P3: Zielpositionen auf der Pallette definieren Ziel_X = (int)1312.9; Ziel_Y = (int)556.6; Ziel_Z = (int)335.7; Ziel_A = (int)17.6; Ziel_B = (int)40.6; Ziel_C = (int)164.0; //Row_Coordinates aus Kamera auslesen Msg = robot_position_X.ToString(); SerialPort.Write(Msg); Msg = " "; SerialPort.Write(Msg);//Leerzeichen Msg = robot_position_Y.ToString(); SerialPort.Write(Msg); Msg = " "; SerialPort.Write(Msg); Msg = robot_winkel.ToString(); SerialPort.Write(Msg); Msg = " "; SerialPort.Write(Msg); // Setze Timeout SerialPort.ReadTimeout = 500000; //SerialPort.Read(readbuffer, 0, 1); Array.Clear(readbuffer, 0, 1); j = j - 1; } if (k > 1) //1. kleine Würfel { int index2 = 0; for (; index2 <= area1.Length; index2++) { int area = area1[index2]; if( area <= middle_area&& area >= small_area) { break; } } //Position auslesen und umrechnen robot_position_X = (int)(4.5339 * Coloumn_coordinate[index2]); robot_position_Y = (int)(3.719 * Row_coordinate[index2]); robot_winkel = (int)(180 * angle[index2] / System.Math.PI); //P4: Zielpositionen auf der Pallette definieren Ziel_X = (int)1284.5; Ziel_Y = (int)546.0; Ziel_Z = (int)337.1; Ziel_A = (int)17.6; Ziel_B = (int)40.6; Ziel_C = (int)164.0; //Row_Coordinates aus Kamera auslesen Msg = robot_position_X.ToString(); SerialPort.Write(Msg); Msg = " "; SerialPort.Write(Msg);//Leerzeichen Msg = robot_position_Y.ToString(); SerialPort.Write(Msg); Msg = " "; SerialPort.Write(Msg); Msg = robot_winkel.ToString(); SerialPort.Write(Msg); Msg = " "; SerialPort.Write(Msg); // Setze Timeout SerialPort.ReadTimeout = 500000; //SerialPort.Read(readbuffer, 0, 1); Array.Clear(readbuffer, 0, 1); k = k - 1; } if (k == 1)//2. kleiner Würel { int index3 = 0; for (; index3 <= area1.Length; index3++) { int area = area1[index3]; if (area >= small_area && area < middle_area) { } } //Position auslesen und umrechnen robot_position_X = (int)(4.5339 * Coloumn_coordinate[index3]); robot_position_Y = (int)(3.719 * Row_coordinate[index3]); robot_winkel = (int)(180 * angle[index3] / System.Math.PI); //Zielpositionen auf der Pallette definieren // P5 Ziel_X = (int)1284.5; Ziel_Y = (int)573.3; Ziel_Z = (int)332.1; Ziel_A = (int)17.6; Ziel_B = (int)40.6; Ziel_C = (int)164.0; //Row_Coordinates aus Kamera auslesen Msg = robot_position_X.ToString(); SerialPort.Write(Msg); Msg = " "; SerialPort.Write(Msg);//Leerzeichen Msg = robot_position_Y.ToString(); SerialPort.Write(Msg); Msg = " "; SerialPort.Write(Msg); Msg = robot_winkel.ToString(); SerialPort.Write(Msg); Msg = " "; SerialPort.Write(Msg); // Setze Timeout SerialPort.ReadTimeout = 500000; //SerialPort.Read(readbuffer, 0, 1); Array.Clear(readbuffer, 0, 1); k = k - 1; } } private void HXCtrl_Enter(object sender, System.EventArgs e) { } } }
- Bearbeitet Richierich1991 Freitag, 14. Juli 2017 10:17
- Typ geändert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 28. Juli 2017 09:53 Warten auf Rückmeldung
Alle Antworten
-
Hallo Richierich1991,
Welcher der zwei Codeblöcke, die für die zwei kleinen Würfel vorgesehen sind, wird ausgeführt, der Codeblock mit der Bedingung k > 1 oder k == 1? Würdest Du am Ende des Codeblocks einen Haltepunkt setzen, um zu überprüfen, ob k dekrementiert wird?
Gruß,
DimitarBitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
-
Hi,
es wäre nett, wenn Du die Lösung dennoch hier posten könntest. So hätten andere, die mal ein ähnliches Problem haben, auch etwas davon. Das Forum lebt ja von Usern, die anderen Usern helfen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community