private void Worker_DoWork(object sender, DoWorkEventArgs e) { // run all background tasks here BackgroundWorker worker = sender as BackgroundWorker; DataTable dtComponents = dsData.Tables["Components"]; DataView dv = new DataView(dtComponents); dv.RowFilter = "Pick = 1"; int currentrow = 0; int totalrows = dv.Count; Nozzle1Xoffset = dh.Nozzle1Xoffset; Nozzle1Yoffset = dh.Nozzle1Yoffset; Nozzle2Xoffset = dh.Nozzle2Xoffset; Nozzle2Yoffset = dh.Nozzle2Yoffset; if (totalrows > 0) { /* Components table columns * ComponentCode * ComponentName * PlacementX * PlacementY * PlacementRotate * PlacementNozzle * * component list * ComponentCode * ComponentValue * Package * * PlacementHeight * FeederHeight * FeederX * FeederY * VerifywithCamera * TapeFeeder * * * */ double pcbHeight = double.Parse(dsData.Tables["BoardInfo"].Rows[0][1].ToString()); double feedrate = 100; // double placerate = 20000; // double feederPosX = 0; //double feederPosY = 0; //double feederPosZ = 0; //double placePosX = 0; //double placePosY = 0; //double ComponentRotation = 0; //double PlacementHeight = 0; //int PlacementNozzle = 1; //double PlaceSpeed = 100; // bool TapeFeeder = false; // bool VerifyCamera = false; while (currentrow < totalrows) { if (backgroundWorkerBuildPCB.CancellationPending) { e.Cancel = true; dv.Dispose(); break; } kfl.PlacementNozzle = int.Parse(dv[currentrow]["PlacementNozzle"].ToString()); kfl.PickSpeed = feedrate; kfl.PlaceSpeed = comp.GetPlaceSpeed(dv[currentrow]["ComponentCode"].ToString(), feedrate); kfl.FeederX = CalcXLocation(comp.GetFeederX(dv[currentrow]["ComponentCode"].ToString()), kfl.PlacementNozzle); kfl.FeederY = CalcYLocation(comp.GetFeederY(dv[currentrow]["ComponentCode"].ToString()), kfl.PlacementNozzle); kfl.FeederHeight = comp.GetFeederHeight(dv[currentrow]["ComponentCode"].ToString()); kfl.PlaceHeight = comp.GetPlacementHeight(dv[currentrow]["ComponentCode"].ToString()) - pcbHeight; kfl.TapeFeeder = comp.GetComponentTapeFeeder(dv[currentrow]["ComponentCode"].ToString()); kfl.PlaceX = CalcXLocation(double.Parse(dv[currentrow]["PlacementX"].ToString()), kfl.PlacementNozzle); kfl.PlaceY = CalcYLocation(double.Parse(dv[currentrow]["PlacementY"].ToString()), kfl.PlacementNozzle); kfl.PlaceRotation = double.Parse(dv[currentrow]["PlacementRotate"].ToString()); kfl.VerifyCamera = comp.GetComponentVerifywithCamera(dv[currentrow]["ComponentCode"].ToString()); //feederPosX = CalcXLocation(comp.GetFeederX(dv[currentrow]["ComponentCode"].ToString()), PlacementNozzle); //double feederPosY = CalcYLocation(comp.GetFeederY(dv[currentrow]["ComponentCode"].ToString()), PlacementNozzle); //feederPosZ = comp.GetFeederHeight(dv[currentrow]["ComponentCode"].ToString()); // PlacementHeight = comp.GetPlacementHeight(dv[currentrow]["ComponentCode"].ToString()) - pcbHeight; //TapeFeeder = comp.GetComponentTapeFeeder(dv[currentrow]["ComponentCode"].ToString()); // placePosX = CalcXLocation(double.Parse(dv[currentrow]["PlacementX"].ToString()), kfl.PlacementNozzle); //placePosY = CalcYLocation(double.Parse(dv[currentrow]["PlacementY"].ToString()), kfl.PlacementNozzle); //ComponentRotation = double.Parse(dv[currentrow]["PlacementRotate"].ToString()); //VerifyCamera = comp.GetComponentVerifywithCamera(dv[currentrow]["ComponentCode"].ToString()); if (currentrow == 0) { SetFeederOutputs(comp.GetFeederID(dv[currentrow]["ComponentCode"].ToString())); // send feeder to position } //MessageBox.Show(kfl.FeederY.ToString()); //kf.MoveSingleFeed(kfl.PickSpeed, 100, kfl.FeederY, ClearHeight, ClearHeight, 0, 0); kf.MoveSingleFeed(kfl.PickSpeed, kfl.FeederX, kfl.FeederY, ClearHeight, ClearHeight, 0, 0); if (comp.GetComponentTapeFeeder(dv[currentrow]["ComponentCode"].ToString())) { while (!usbController.GetFeederReadyStatus()) { Thread.Sleep(10); } Thread.Sleep(50); if (kfl.PlacementNozzle == 1) { // use picker 1 kf.MoveSingleFeed(kfl.PickSpeed, kfl.FeederX, kfl.FeederY, kfl.FeederHeight, ClearHeight, 0, 0); Thread.Sleep(Nozzel1PickSleep); // go down and turn on suction usbController.SetVAC1(true); Thread.Sleep(Nozzel1PickSleep); kf.MoveSingleFeed(kfl.PickSpeed, kfl.FeederX, kfl.FeederY, ClearHeight, ClearHeight, 0, 0); } else { // nozzle 2 on tape feeder kf.MoveSingleFeed(kfl.PickSpeed, kfl.FeederX, kfl.FeederY, ClearHeight, kfl.FeederHeight, 0, 0); Thread.Sleep(Nozzel2PickSleep); // go down and turn on suction usbController.SetVAC2(true); Thread.Sleep(Nozzel2PickSleep); kf.MoveSingleFeed(kfl.PickSpeed, kfl.FeederX, kfl.FeederY, ClearHeight, ClearHeight, 0, 0); } } else { // use picker 2 while (usbController.CheckChipMotorRunning()) { Thread.Sleep(10); } kf.MoveSingleFeed(kfl.PickSpeed, kfl.FeederX, kfl.FeederY, ClearHeight, kfl.FeederHeight, 0, 0); Thread.Sleep(Nozzel2PickSleep); // 200 usbController.SetVAC2(true); Thread.Sleep(Nozzel2PickSleep); // 300 kf.MoveSingleFeed(kfl.PickSpeed, kfl.FeederX, kfl.FeederY, ClearHeight, ClearHeight, 0, 0); } // send picker to pick next item if (currentrow >= 0 && (currentrow + 1) < totalrows) { Thread.Sleep(100); Thread.Sleep(100); SetFeederOutputs(comp.GetFeederID(dv[currentrow + 1]["ComponentCode"].ToString())); // send feeder to position } // check if place speed needs to go slower // rotate head and place component //SetResultsLabelText("Placing Component"); if (comp.GetComponentTapeFeeder(dv[currentrow]["ComponentCode"].ToString()) && (kfl.PlacementNozzle == 1)) { /* * if (kfl.VerifyCamera) * { * kfl = CheckWithCamera(kfl, kf, 1, usbController, img); * kf.MoveSingleFeed(kfl.PlaceSpeed, kfl.PlaceX, kfl.PlaceY, ClearHeight, ClearHeight, 0, kfl.PlaceRotation); * kf.MoveSingleFeed(kfl.PlaceSpeed, kfl.PlaceX, kfl.PlaceY, kfl.PlaceHeight, ClearHeight, 0, kfl.PlaceRotation); * * } else * { */ kf.MoveSingleFeed(kfl.PlaceSpeed, kfl.PlaceX, kfl.PlaceY, ClearHeight, ClearHeight, 0, kfl.PlaceRotation); kf.MoveSingleFeed(kfl.PlaceSpeed, kfl.PlaceX, kfl.PlaceY, kfl.PlaceHeight, ClearHeight, 0, kfl.PlaceRotation); // } Thread.Sleep(Nozzel1PlaceSleep); usbController.SetVAC1(false); Thread.Sleep(Nozzel1PlaceSleep); kf.MoveSingleFeed(kfl.PlaceSpeed, kfl.PlaceX, kfl.PlaceY, ClearHeight, ClearHeight, 0, kfl.PlaceRotation); } else { // use picker 2 CalcXwithNeedleSpacing /* * if (kfl.VerifyCamera) * { * kfl = CheckWithCamera(kfl, kf, 2, usbController, img); * kf.MoveSingleFeed(kfl.PlaceSpeed, kfl.PlaceX, kfl.PlaceY, ClearHeight, ClearHeight, kfl.PlaceRotation, 0); * Thread.Sleep(200); * kf.MoveSingleFeed(kfl.PlaceSpeed, kfl.PlaceX, kfl.PlaceY, ClearHeight, kfl.PlaceHeight, kfl.PlaceRotation, 0); * } * else * {*/ kf.MoveSingleFeed(kfl.PlaceSpeed, kfl.PlaceX, kfl.PlaceY, ClearHeight, ClearHeight, kfl.PlaceRotation, 0); Thread.Sleep(Nozzel2PlaceSleep); kf.MoveSingleFeed(kfl.PlaceSpeed, kfl.PlaceX, kfl.PlaceY, ClearHeight, kfl.PlaceHeight, kfl.PlaceRotation, 0); //} // go down and turn off suction Thread.Sleep(Nozzel2PlaceSleep); usbController.SetVAC2(false); Thread.Sleep(Nozzel2PlaceSleep); kf.MoveSingleFeed(kfl.PlaceSpeed, kfl.PlaceX, kfl.PlaceY, ClearHeight, ClearHeight, kfl.PlaceRotation, 0); } currentrow++; } // move near to home point kf.MoveSingleFeed(kfl.PickSpeed, 10, 10, 10, 10, 0, 0); } else { MessageBox.Show("Board file not loaded"); } backgroundWorkerBuildPCB.CancelAsync(); usbController.SetResetFeeder(); usbController.RunVibrationMotor(MotorRunLoop); kf.RunHomeAll(); //dtLog.WriteXml(_LogFile); dv.Dispose(); dtComponents.Dispose(); }
public KflopLocation CheckWithCamera(KflopLocation kfl, Kflop kf, int nozzle, UsbDevice usbController, System.Windows.Controls.Image imgref) { double CameraX = 295.4; double CameraY = 150.2; double CameraX2 = 263.5; double CameraY2 = 150.2; double PlaceX = kfl.PlaceX; double PlaceY = kfl.PlaceY; double PlaceRotation = kfl.PlaceRotation; int retrycounter = 0; img = imgref; outstr.Loc1X = 0; videoCam.Start(); if (nozzle == 1) { kf.MoveSingleFeed(kfl.PlaceSpeed, CameraX, CameraY, ClearHeight, ClearHeight, 0, kfl.PlaceRotation); usbController.SetHeadCameraLED(true); } else { kf.MoveSingleFeed(kfl.PlaceSpeed, CameraX2, CameraY2, ClearHeight, ClearHeight, kfl.PlaceRotation, 0); usbController.SetHeadCameraLED(true); } Thread.Sleep(2000); // verify camera image if needed // loop until part has correct rotation while (VisionCorrectionNeeded && retrycounter < 100) { if (outstr.OffsetX < 0.5 && outstr.OffsetY < 0.5) { PlaceX = PlaceX + outstr.OffsetX; PlaceY = PlaceY + outstr.OffsetY; PlaceRotation = PlaceRotation + outstr.LocAngle; VisionCorrectionNeeded = true; } else { if (nozzle == 1) { PlaceX = PlaceX + outstr.OffsetX; PlaceY = PlaceY + outstr.OffsetY; PlaceRotation = PlaceRotation + outstr.LocAngle; CameraX = CameraX + outstr.OffsetX; CameraY = CameraY + outstr.OffsetY; kf.MoveSingleFeed(kfl.PlaceSpeed, CameraX, CameraY, ClearHeight, ClearHeight, 0, PlaceRotation); } else { PlaceX = PlaceX + outstr.OffsetX; PlaceY = PlaceY + outstr.OffsetY; PlaceRotation = PlaceRotation + outstr.LocAngle; CameraX2 = CameraX2 + outstr.OffsetX; CameraX2 = CameraX2 + outstr.OffsetY; kf.MoveSingleFeed(kfl.PlaceSpeed, CameraX2, CameraY2, ClearHeight, ClearHeight, kfl.PlaceRotation, 0); } VisionCorrectionNeeded = false; } outstr.Loc1X = 0; Thread.Sleep(1000); retrycounter++; } usbController.SetHeadCameraLED(false); if (videoCam != null && videoCam.IsRunning) { videoCam.SignalToStop(); } return(kfl); }