none
Letzer Index auslesen RRS feed

  • 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)
            {
                
            }
    	}
    }


    Freitag, 14. Juli 2017 10:14

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ß,
    Dimitar


    Bitte 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.

    Montag, 17. Juli 2017 13:45
    Administrator
  • Danke aber habe das Problem mittlerweile selber gefunden.

    kann geschlossen werden
    Donnerstag, 3. August 2017 15:40
  • 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

    Donnerstag, 3. August 2017 20:36
    Moderator