時間:2024-07-05 10:44:46來æºï¼šæ·±åœ³å¸‚æ£é‹å‹•技術有é™å…¬å¸
  å‰é¢å…©ç¯€èª²ç¨‹æˆ‘們介紹了怎么建立Deltaå¹¶è¯æ©Ÿæ¢°æ‰‹çš„æ£é€†è§£ä»¥åŠå¦‚何通éŽè¦–覺進行匹é…定ä½ã€‚本節課程給大家分享如何通éŽC#語言開發æ£é‹å‹•Deltaå¹¶è¯æ©Ÿæ¢°æ‰‹å‚³é€å¸¶åŒæ¥çš„視覺分æ€ã€‚
  VPLC711硬件介紹
  VPLC711是æ£é‹å‹•推出的一款基于x86平臺和Windowsæ“作系統的高性能機器視覺EtherCATé‹å‹•控制器,具備強大的é‹ç®—èƒ½åŠ›å’Œéˆæ´»æ€§ã€‚它具有出色的實時性能和多路高速硬件輸入與多路高速PSOè¼¸å‡ºï¼Œèƒ½å¤ ç²¾æº–æŽ§åˆ¶å¤šè»¸åŒæ¥é‹å‹•,并與外部è¨å‚™å¯¦ç¾å¤šå”è°çš„高速通信。
  VPLC711支æŒå¤šç¨®ç¡¬ä»¶æŽ¥å£å’Œé€šä¿¡å”è°ï¼Œæ–¹ä¾¿èˆ‡å…¶ä»–è¨å‚™çš„連接和集æˆã€‚除æ¤ä¹‹å¤–,VPLC711還具備視覺處ç†åŠŸèƒ½ï¼Œèƒ½å¤ å¯¦æ™‚è™•ç†åœ–åƒæ•¸æ“šï¼Œå¯¦ç¾è¦–è¦ºæª¢æ¸¬ã€æ¸¬é‡å’Œå®šä½ç‰æ‡‰ç”¨ã€‚
  VPLC711å…§ç½®Windowsé‹å‹•æŽ§åˆ¶å¯¦æ™‚å…§æ ¸MotionRT7,形æˆä¸€ç¨®é–‹æ”¾å¼IPC形態實時軟控制器/軟PLC,為用戶æä¾›éˆæ´»é›†æˆçš„é‹å‹•控制+視覺一體化解決方案。
  VPLC711ç¡¬ä»¶åƒæ•¸
  1.采用x86高性能CPU,EtherCAT坿”¯æŒ1ms 64è»¸åŒæ¥é‹è¡Œ;
  2.æ¿è¼‰RS232,RS485,EtherNet*5,EtherCAT,USB3.0*4硬件接å£;
3.æ¿è¼‰20DI,其ä¸4個高速色標鎖å˜ï¼Œ2組高速單端編碼器;
4.æ¿è¼‰20DO,其ä¸4個高速單端脈沖軸,4組高速PWM;
  5.支æŒDVI-D,HDMI顯示,支æŒé›™ç¶²å£ä¸åŒIPè¨ç½®ã€‚
  
  C#語言進行Deltaå¹¶è¯æ©Ÿæ¢°æ‰‹çš„開發之é‹å‹•庫和視覺庫的添åŠ
  1.在VS2010èœå–®â€œæ–‡ä»¶â€â†’“新建â€â†’â€œé …ç›®â€ï¼Œå•Ÿå‹•å‰µå»ºé …ç›®å‘導。
  2.鏿“‡é–‹ç™¼èªžè¨€ç‚ºâ€œVisual C#â€å’Œ.NET Framework 4以åŠWindows窗體應用程åºã€‚
  3.æ‰¾åˆ°å» å®¶æä¾›çš„光盤資料里é¢çš„C#函數庫,路徑如下(32ä½åº«ç‚ºä¾‹)。
  1)é€²å…¥å» å•†æä¾›çš„光盤資料找到“04PCå‡½æ•¸â€æ–‡ä»¶å¤¾ï¼Œå¹¶é»žæ“Šé€²å…¥ã€‚
  2)鏿“‡â€œå‡½æ•¸åº«2.1â€æ–‡ä»¶å¤¾ã€‚
  3)鏿“‡â€œWindowså¹³è‡ºâ€æ–‡ä»¶å¤¾ã€‚
  4)æ ¹æ“šéœ€è¦é¸æ“‡å°æ‡‰çš„å‡½æ•¸åº«ï¼Œé€™é‡Œé¸æ“‡32ä½åº«ã€‚
  5)解壓C#壓縮包,é‡Œé¢æœ‰C#å°æ‡‰çš„函數庫。
  6)函數庫具體路徑如下。
  4.å°‡å» å•†æä¾›çš„C#庫文件以åŠç›¸é—œæ–‡ä»¶å¾©åˆ¶åˆ°æ–°å»ºçš„é …ç›®ä¸(注æ„這里é¢çš„PCå‡½æ•¸åº«é»˜èªæä¾›çš„æ˜¯é‹å‹•庫,如果使用視覺功能還需è¦ç²å–視覺庫,視覺庫å¯ä»¥æ‰¾å» 商的相關銷售或技術人員ç²å–)。
1)å°‡Zmcaux.cs(é‹å‹•庫)å’ŒZvision.cs(視覺庫)æ–‡ä»¶å¾©åˆ¶åˆ°æ–°å»ºçš„é …ç›®é‡Œé¢ä¸ã€‚
  2)å°‡zauxdll.dllã€zmotion.dllå’Œzvision.dll文件放入bin\debug文件夾ä¸ã€‚
  5.用vsæ‰“é–‹æ–°å»ºçš„é …ç›®æ–‡ä»¶ï¼Œåœ¨å³é‚Šçš„解決方案資æºç®¡ç†å™¨ä¸é»žæ“Šé¡¯ç¤ºæ‰€æœ‰æ–‡ä»¶ï¼Œç„¶åŽé¼ æ¨™å³æ“ŠZmcaux.cs與 Zvision.csæ–‡ä»¶ï¼Œé»žæ“ŠåŒ…æ‹¬åœ¨é …ç›®ä¸ã€‚
  6.雙擊Form1.cs里é¢çš„Form1,出ç¾ä»£ç¢¼ç·¨è¼¯ç•Œé¢ï¼Œåœ¨æ–‡ä»¶é–‹é 寫入using cszmcaux,using ZVisionå¹¶è²æ˜ŽæŽ§åˆ¶å™¨å¥æŸ„g_handle。
  PC函數介紹
  1. éˆæŽ¥æŽ§åˆ¶å™¨ï¼Œç²å–éˆæŽ¥å¥æŸ„。
  2. çš®å¸¶åŒæ¥æŒ‡ä»¤ã€‚
  Basicè…³æœ¬å¿«é€Ÿé©—è‰æŒ‡ä»¤ç”¨æ³•
  1.編寫Basic測試腳本進行MoveSync指令的用法測試。
  ·
  '**************************************************************************************'背景:å‡è¨æœ‰ä¸€å°å°å°„åž‹çš„å…‰é›»å‚³æ„Ÿå™¨å›ºå®šåœ¨æµæ°´ç·šçš„å…©ç«¯ï¼Œä¾†å¯¦æ™‚æª¢æ¸¬æµæ°´ç·šä¸Šçš„產å“åˆ°ä½æƒ…æ³'MOVESYNCæŒ‡ä»¤åƒæ•¸å¡«å¯«èªªæ˜Žï¼š'syncposition:物體到感應點時皮帶軸的ä½ç½®ï¼Œéœ€è¦é€šéŽç·¨ç¢¼å™¨éŽ–å˜æŠŠç”¢å“çš„å°æ‡‰ä½ç½®è¨˜éŒ„下來。'pos1:跟隨軸1原點到光電傳感器感應點的ä½ç½®ï¼Œå°äºŽæ¯å€‹ç”¢å“都是固定的。'**************************************************************************************GLOBAL CONST BeltAxis=4 '皮帶軸是軸4GLOBAL CONST FollowAxis1=0 '跟隨軸1是軸0GLOBAL CONST InducPos1=30 '跟隨軸1原點到光電傳感器感應點的ä½ç½®GLOBAL CONST StandbyPos1=50'跟隨軸1的待機ä½GLOBAL CONST EmptyPos1=400 '跟隨軸1的放料ä½'åœæ¢æ‰€æœ‰è»¸RAPIDSTOP(2)WAIT IDLE 'åˆå§‹åŒ–ç›¸é—œè»¸çš„è»¸åƒæ•¸BASE(FollowAxis1, BeltAxis)ATYPE = 1,1UNITS = 1000,1000SPEED = 50,100DPOS = 0,0'觸發示波器采集波形TRIGGERDELAY(1000)'跟隨軸先é‹å‹•到待機ä½BASE(FollowAxis1)MOVEABS(StandbyPos1)'皮帶軸開始é‹å‹•VMOVE(1) AXIS(BeltAxis)'å‡è¨çš®å¸¶é‹å‹•到200çš„ä½ç½®æ™‚,有一個產å“被檢測到BASE(FollowAxis1)Wait UNTIL MPOS(BeltAxis)> 200MOVESYNC(0, 2000, 200, BeltAxis, InducPos1) 'è·Ÿéš¨è»¸åŠ é€ŸåŒæ¥æ®µè©²æŒ‡ä»¤åŸ·è¡Œå®ŒåŽå°‡åŒæ¥ä¸Šç”¢å“MOVE_OP(0, ON) 'åŒæ¥ä¸ŠåŽæ‰“é–‹çœŸç©ºå¸ MOVESYNC(0, 1000, 200, BeltAxis, InducPos1) 'ç¹¼çºŒåŒæ¥1sMOVESYNC(-1, 0, 0, -1, EmptyPos1) '走到放料ä½ç½®MOVE_OP(0, OFF) '到放料ä½åŽé—œé–‰çœŸç©ºå¸
  2.通éŽRTSys軟件的示波器觀察波形,分æžåŒæ¥éŽç¨‹ã€‚
ã€€ã€€æ ¹æ“šç¤ºæ³¢å™¨çš„æ•¸æ“šåˆ†æž
  1ã€ç”¢å“剛剛被檢測到時,皮帶的ä½ç½®æ˜¯200,跟隨軸的ä½ç½®æ˜¯50。
  2ã€è·Ÿéš¨è»¸è¿½ä¸Šç”¢å“ï¼Œå¹¶ä¿æŒé€Ÿåº¦å’Œçš®å¸¶è»¸åŒæ¥æ™‚皮帶的ä½ç½®æ˜¯400,跟隨軸1çš„ä½ç½®æ˜¯230。
  3ã€ç”±1å’Œ2å¯çŸ¥ï¼Œç”¢å“åœ¨åŒæ¥éŽç¨‹ä¸å‰é€²äº†200(400-200)。
  4ã€å› 為跟隨軸1原點到光電傳感器感應點的ä½ç½®InducPos1我們給的數據是30,所以在跟隨軸1和皮帶平行的情æ³ä¸‹ï¼Œçš®å¸¶å¸¶è‘—產å“å¾€å‰è·‘了200åŽï¼Œæ¤æ™‚æ¤åˆ»è·Ÿéš¨è»¸1原點到光產å“的實際è·é›¢æ˜¯230(200+30)。
  5ã€é‚£ä¹ˆç¬¬4é»žè¨ˆç®—çš„çµæžœå’Œç¬¬2çš„åŒæ¥å®ŒæˆåŽè·Ÿéš¨è»¸1的實際ä½ç½®æ˜¯ä¸€è‡´çš„ï¼Œæ‰€ä»¥æµæ°´ç·šåŒæ¥æŒ‡ä»¤æ¸¬è©¦æ£å¸¸ã€‚
  C#例程建è¨ä¹‹è¦–è¦ºæµæ°´ç·šåŒæ¥åˆ†æ€
  1.çš®å¸¶åŒæ¥æŒ‡ä»¤é—œéµåƒæ•¸è©³ç´°ä»‹ç´¹ã€‚ZAux_Direct_MoveSync(ZMC_HANDLE handle,float imode,int synctime,float syncposition,int syncaxis,int imaxaxises,int *piAxislist,float *pfDisancelist).(1)åƒæ•¸imode:imode = 0+angleï¼Œè¡¨ç¤ºåŒæ¥æ¨¡å¼ï¼Œå¦‚果皮帶和X軸平行,填0å³å¯ã€‚
  imode = -1ï¼Œè¡¨ç¤ºçµæŸåŒæ¥æ¨¡å¼,å¯é‹å‹•到指定的絕å°ä½ç½®ï¼Œä¸€èˆ¬åŒæ¥ä¸ŠæŠ“å–完物料åŽé‹å‹•到放料ä½ä½¿ç”¨ã€‚
  (2)åƒæ•¸synctime: åŒæ¥æ™‚間,mså–®ä½.é‹å‹•在指定時間內完æˆï¼Œå®Œæˆæ™‚è»¸è·Ÿçš®å¸¶è»¸ä¸Šç‰©é«”ä¿æŒé€Ÿåº¦ä¸€è‡´ã€‚0è¡¨ç¤ºæ ¹æ“šé‹å‹•è»¸çš„é€Ÿåº¦åŠ é€Ÿåº¦ä¾†ä¼°è¨ˆåŒæ¥æ™‚間。
  (3)åƒæ•¸syncposition: 視覺或傳感器è˜åˆ¥åˆ°çš®å¸¶æ˜¯çš„ç”¢å“æ™‚ï¼Œçš®å¸¶æ¤æ™‚æ¤åˆ»çš„ä½ç½®ä¿¡æ¯MPOS。
  (4)åƒæ•¸pfDisancelist:如果是視覺定ä½ç”¢å“æ™‚ï¼Œé€™å€‹åƒæ•¸ç›´æŽ¥å¡«è¦–覺è˜åˆ¥åˆ°ç”¢å“時產å“çš„ä¸–ç•Œåæ¨™ã€‚
ã€€ã€€å¦‚æžœç”¨å…‰é›»å‚³æ„Ÿå™¨æª¢æ¸¬ç”¢å“æ™‚ï¼Œé€™å€‹åƒæ•¸æ˜¯å›ºå®šçš„ï¼Œåœ¨å‚³æ„Ÿå™¨å‰›å‰›å¥½æ„Ÿæ‡‰åˆ°ç”¢å“æ™‚,產å“ç•¶å‰ä½ç½®çš„絕å°å標。å¯ä»¥åœ¨æ¤æ™‚æ¤åˆ»æ‰‹å‹•é‹å‹•從軸來定ä½åˆ°ç”¢å“處來ç²å–ä½ç½®ä¿¡æ¯ã€‚
  2.è¦–è¦ºæµæ°´ç·šåŒæ¥åˆ†æ€æµç¨‹åœ–。
  (1)視覺匹é…定ä½ä»£ç¢¼è©³æƒ…。
  ·
  /************************************************************************************'任務編號: ç„¡'函數功能: 視覺定ä½ç”¢å“'Input: ç„¡'Output: ç„¡ '返回值: å線程---é€²è¡Œè¦–è¦ºå®šä½ **************************************************************************************/public void RunSubTaskVisua(){ int TempArrid = 0; float TempVar = 0; WriteLog("視覺功能æ£å¸¸å•Ÿå‹•"); while (SysRunFlag > 0) { //æš«åœæŒ‰éˆ•沒有按下時 while (SysRunFlag == 1) { //é‡‡é›†åœ–åƒ VisuaOper.CameAcquisition(); //進行模æ¿åŒ¹é… RTDisplay.Image = VisuaOper.ShapeFind(); if (MainWindows.BeltMpos != 0)//如果采集照片的時候皮帶編碼器ä½ç½®ç²å–æ£å¸¸ { //æ“作MoveSyncBuffæ•¸æ“šå…ˆåŠ éŽ– while (true) { if (MainWindows.SetMoveSyncFlag == 0) { MainWindows.SetMoveSyncFlag = 1; break; } } //找到å¯ä»¥å˜å„²æ•¸æ“šçš„æ•¸çµ„起始下標 int ArrId = 0; for (int i = 0; i < 50; i++) { if (MainWindows.MoveSyncBuff[i, 0] == 0) { ArrId = i; break; } } //é–‹å§‹å˜å„²æ•¸æ“š ä¸€æ¬¡åŒ¹é…æœ€å¤š10å€‹çµæžœ TempArrid = ArrId; for (int i = 0; i < 10; i++) { //å¦‚æžœåˆ†æ•¸æ»¿è¶³è¦æ±‚ if (MainWindows.VisionRst[i, 0] >= MainWindows.VisionScore) { int j; //如果有é‡å¾©çš„目標需è¦å‰”除 for (j = 0; j < TempArrid; j++) { TempVar = MainWindows.VisionRst[i, 1] - MainWindows.BeltMpos - MainWindows.MoveSyncBuff[j, 1] + MainWindows.MoveSyncBuff[j, 4]; if (((TempVar) <= 10) && (TempVar >= -10)) { j = -10; break; } } if (j >= 0) { MainWindows.MoveSyncBuff[ArrId, 0] = 1; MainWindows.MoveSyncBuff[ArrId, 1] = MainWindows.VisionRst[i, 1]; //å˜å„²åŒ¹é…çµæžœçš„X忍™ MainWindows.MoveSyncBuff[ArrId, 2] = MainWindows.VisionRst[i, 2]; //å˜å„²åŒ¹é…çµæžœçš„Y忍™ MainWindows.MoveSyncBuff[ArrId, 3] = MainWindows.VisionRst[i, 3]; //å˜å„²åŒ¹é…çµæžœçš„角度åç§» MainWindows.MoveSyncBuff[ArrId, 4] = MainWindows.BeltMpos; //å˜å„²åŒ¹é…åˆ°ç”¢å“æ™‚,傳é€å¸¶çš„ä½ç½®ä¿¡æ¯ ArrId = ArrId + 1; IdentiNum.Text = (Convert.ToInt32(IdentiNum.Text) + 1).ToString(); WriteLog("視覺目標:" + "(" + MainWindows.VisionRst[i, 1].ToString("0,0") + "," + MainWindows.VisionRst[i, 2].ToString("0,0") + ")"); } } //分數清空 MainWindows.VisionRst[i, 0] = 0; } //解鎖 MainWindows.SetMoveSyncFlag = 0; } } Thread.Sleep(100); }}
  (2)æµæ°´ç·šåŒæ¥åˆ†æ€ä»£ç¢¼è©³æƒ…。
  ·
  /************************************************************************************'任務編號: ç„¡'函數功能: æµæ°´ç·šåŒæ¥åˆ†æ€'Input: ç„¡'Output: ç„¡ '返回值: ç„¡ **************************************************************************************/public void RunSubTaskMotion(){ float[] MoveSyncTemp = new float[5]; float TempMpos = 0; while (SysRunFlag > 0) { while (SysRunFlag == 1) { if (MainWindows.MoveSyncBuff[0, 0] == 1) { MainWindows.ZauxErr = zmcaux.ZAux_Direct_GetMpos(MainWindows.g_Handle, MainWindows.ConveyorAxisId, ref TempMpos); //如果編碼器ä½ç½®æŠ“å–æ£ç¢º if (0 == MainWindows.ZauxErr) { //編碼器往å‰é‹å‹•了多少 TempMpos = TempMpos - MainWindows.MoveSyncBuff[0, 4];
  //判斷是å¦è™•äºŽåŒæ¥èµ·å§‹å€ if (((MainWindows.MoveSyncBuff[0, 1] + TempMpos) >= MainWindows.SyncReX[0]) && ((MainWindows.MoveSyncBuff[0, 1] + TempMpos) <= MainWindows.SyncReX[1])) { WriteLog("é–‹å§‹åŒæ¥æŠ“å–"); //å–一組數據 MoveSyncTemp[0] = MainWindows.MoveSyncBuff[0, 1] ; //X MoveSyncTemp[1] = MainWindows.MoveSyncBuff[0, 2] ; //Y MoveSyncTemp[2] = MainWindows.GetBinHigt; //å–æ–™é«˜åº¦ MoveSyncTemp[3] = MainWindows.MoveSyncBuff[0, 3]; //Aanle MoveSyncTemp[4] = MainWindows.MoveSyncBuff[0, 4]; //Mpos //ä¸‹ç™¼åŒæ¥é‹å‹•的指令 //0ã€å¾©ä½è¼¸å‡ºå£ zmcaux.ZAux_Direct_MoveOp(MainWindows.g_Handle, MainWindows.gVAxisList[0], MainWindows.VacSucIo, 0); //1ã€å…ˆåŒæ¥ä¸Šå‚³é€å¸¶ zmcaux.ZAux_Direct_MoveSync(MainWindows.g_Handle, 0, 0, MainWindows.MoveSyncBuff[0, 4], MainWindows.ConveyorAxisId, 4, MainWindows.gVAxisList, MoveSyncTemp); //2ã€åŒæ¥ä¸€æ®µæ™‚é–“(關節軸有滯åŽ) 50ms zmcaux.ZAux_Direct_MoveSync(MainWindows.g_Handle, 0, 50, MainWindows.MoveSyncBuff[0, 4], MainWindows.ConveyorAxisId, 4, MainWindows.gVAxisList, MoveSyncTemp); //3ã€æ‰“開真空å¸å˜´ zmcaux.ZAux_Direct_MoveOp(MainWindows.g_Handle, MainWindows.gVAxisList[0], MainWindows.VacSucIo, 1); //4ã€åŒæ¥ä¸€æ®µæ™‚é–“ 1500ms zmcaux.ZAux_Direct_MoveSync(MainWindows.g_Handle, 0, 700, MainWindows.MoveSyncBuff[0, 4], MainWindows.ConveyorAxisId, 4, MainWindows.gVAxisList, MoveSyncTemp); //5ã€åŒæ¥æ®µæŠŠZ軸æå‡åˆ°å®‰å…¨é«˜åº¦ï¼Œé¸æ“‡è»¸åˆ°æ”¾æ–™è§’度 MoveSyncTemp[2] = MainWindows.StandPos[2]; //å–æ–™é«˜åº¦ zmcaux.ZAux_Direct_MoveSync(MainWindows.g_Handle, 0, 100, MainWindows.MoveSyncBuff[0, 4], MainWindows.ConveyorAxisId, 4, MainWindows.gVAxisList, MoveSyncTemp); //4ã€è§£é™¤åŒæ¥åŽ»æ”¾æ–™é»ž MoveSyncTemp[0] = MainWindows.EmptPos[0]; //X MoveSyncTemp[1] = MainWindows.EmptPos[1]; //Y MoveSyncTemp[2] = MainWindows.EmptPos[2]; //放料高度 MoveSyncTemp[3] = MainWindows.EmptPos[3]; //Aanle zmcaux.ZAux_Direct_MoveSync(MainWindows.g_Handle, -1, 0, 0, -1, 4, MainWindows.gVAxisList, MoveSyncTemp); //5ã€é—œé–‰çœŸç©ºå¸å˜´æ”¾æ–™,Delay100ms zmcaux.ZAux_Direct_MoveOp(MainWindows.g_Handle, MainWindows.gVAxisList[0], MainWindows.VacSucIo, 0); zmcaux.ZAux_Direct_MoveDelay(MainWindows.g_Handle, MainWindows.gVAxisList[0], 100); //6ã€åŽ»å®‰å…¨é«˜åº¦ MoveSyncTemp[0] = MainWindows.EmptPos[0]; //X MoveSyncTemp[1] = MainWindows.EmptPos[1]; //Y MoveSyncTemp[2] = MainWindows.StandPos[2]; //放料高度 MoveSyncTemp[3] = MainWindows.EmptPos[3]; //Aanle zmcaux.ZAux_Direct_MoveAbs(MainWindows.g_Handle, 4, MainWindows.gVAxisList, MoveSyncTemp);
  //æ“作MoveSyncBuffæ•¸æ“šå…ˆåŠ éŽ– while (true) { if (MainWindows.SetMoveSyncFlag == 0) { MainWindows.SetMoveSyncFlag = 1; break; } } //視覺匹é…ç·©æ²–å€æ•¸æ“šå¾€å‰è¦†è“‹ for (int k = 0; k < 49; k++) { MainWindows.MoveSyncBuff[k, 0] = MainWindows.MoveSyncBuff[k + 1, 0]; MainWindows.MoveSyncBuff[k, 1] = MainWindows.MoveSyncBuff[k + 1, 1]; MainWindows.MoveSyncBuff[k, 2] = MainWindows.MoveSyncBuff[k + 1, 2]; MainWindows.MoveSyncBuff[k, 3] = MainWindows.MoveSyncBuff[k + 1, 3]; MainWindows.MoveSyncBuff[k, 4] = MainWindows.MoveSyncBuff[k + 1, 4]; } //解鎖 MainWindows.SetMoveSyncFlag = 0; //ç‰å¾…è¼¸å‡ºå£æ‰“é–‹ int TimeOut = 10000; TimeOut = 100000; //ç‰å¾…è»¸åœæ¢ int AxisIdle = 0; //è»¸åœæ¢ç‹€æ…‹ while (TimeOut > 0) { zmcaux.ZAux_Direct_GetIfIdle(MainWindows.g_Handle, MainWindows.gVAxisList[0], ref AxisIdle); if (AxisIdle == (-1)) { break; } Thread.Sleep(10); TimeOut = TimeOut - 10; } if (TimeOut <= 0) { //超時è¦å ±éŒ¯ï¼Œç¨‹åºè¦åœæ¢ WriteLog("ç‰å¾…è»¸åœæ¢è¶…時"); //Thread.Sleep(100); SysRunFlag = 0; break; } SortNum.Text = (Convert.ToInt32(SortNum.Text) + 1).ToString(); WriteLog("放料æˆåŠŸ"); //退出while 單次循環 continue; } else if ((MainWindows.MoveSyncBuff[0, 1] + TempMpos) > MainWindows.SyncReX[1]) { //æ“作MoveSyncBuffæ•¸æ“šå…ˆåŠ éŽ– while (true) { if (MainWindows.SetMoveSyncFlag == 0) { MainWindows.SetMoveSyncFlag = 1; break; } } //視覺匹é…ç·©æ²–å€æ•¸æ“šå¾€å‰è¦†è“‹ for (int k = 0; k < 49; k++) { MainWindows.MoveSyncBuff[k, 0] = MainWindows.MoveSyncBuff[k + 1, 0]; MainWindows.MoveSyncBuff[k, 1] = MainWindows.MoveSyncBuff[k + 1, 1]; MainWindows.MoveSyncBuff[k, 2] = MainWindows.MoveSyncBuff[k + 1, 2]; MainWindows.MoveSyncBuff[k, 3] = MainWindows.MoveSyncBuff[k + 1, 3]; MainWindows.MoveSyncBuff[k, 4] = MainWindows.MoveSyncBuff[k + 1, 4]; } //解鎖 MainWindows.SetMoveSyncFlag = 0; //如果視覺匹é…ç·©æ²–å€æ²’有數據了 if (MainWindows.MoveSyncBuff[0, 0] == 0) { //DeltaåŽ»å¾…æ©Ÿä½ zmcaux.ZAux_Direct_MoveAbs(MainWindows.g_Handle, 4, MainWindows.gVAxisList, MainWindows.StandPos); WriteLog("去待機ä½"); } } } } else { //DeltaåŽ»å¾…æ©Ÿä½ zmcaux.ZAux_Direct_MoveAbs(MainWindows.g_Handle, 4, MainWindows.gVAxisList, MainWindows.StandPos); } Thread.Sleep(50); } //åœæ¢å‚³é€å¸¶ zmcaux.ZAux_Direct_Single_Cancel(MainWindows.g_Handle, MainWindows.ConveyorAxisId, 2); }}
ã€€ã€€æ¼”ç¤ºè¦–é »
  本次,æ£é‹å‹•技術C#之Deltaå¹¶è¯æ©Ÿæ¢°æ‰‹çš„è¦–è¦ºåŒæ¥åˆ†æ€ï¼Œå°±åˆ†äº«åˆ°é€™é‡Œã€‚
  更多精彩內容請關注“æ£é‹å‹•å°åŠ©æ‰‹â€å…¬çœ¾è™Ÿï¼Œéœ€è¦ç›¸é—œé–‹ç™¼ç’°å¢ƒèˆ‡ä¾‹ç¨‹ä»£ç¢¼ï¼Œè«‹å’¨è©¢æ£é‹å‹•技術銷售工程師:400-089-8936。
  本文由æ£é‹å‹•技術原創,æ¡è¿Žå¤§å®¶è½‰è¼‰ï¼Œå…±åŒå¸ç¿’,一起æé«˜ä¸åœ‹æ™ºèƒ½åˆ¶é€ æ°´å¹³ã€‚æ–‡ç« ç‰ˆæ¬Šæ¸æ£é‹å‹•æŠ€è¡“æ‰€æœ‰ï¼Œå¦‚æœ‰è½‰è¼‰è«‹æ³¨æ˜Žæ–‡ç« ä¾†æºã€‚
上一篇:方案分享 - ä¿å£“機
下一篇:三è±ä¼ºæœç”¨ä»€ä¹ˆç¸½ç·šæŽ§åˆ¶
ä¸åœ‹å‚³å‹•網版權與å…è²¬è²æ˜Žï¼šå‡¡æœ¬ç¶²æ³¨æ˜Ž[來æºï¼šä¸åœ‹å‚³å‹•ç¶²]的所有文å—ã€åœ–片ã€éŸ³è¦–å’Œè¦–é »æ–‡ä»¶ï¼Œç‰ˆæ¬Šå‡ç‚ºä¸åœ‹å‚³å‹•ç¶²(www.siyutn.com)ç¨å®¶æ‰€æœ‰ã€‚如需轉載請與0755-82949061è¯ç³»ã€‚任何媒體ã€ç¶²ç«™æˆ–å€‹äººè½‰è¼‰ä½¿ç”¨æ™‚é ˆæ³¨æ˜Žä¾†æºâ€œä¸åœ‹å‚³å‹•ç¶²â€ï¼Œé•å者本網將追究其法律責任。
本網轉載并注明其他來æºçš„稿件,å‡ä¾†è‡ªäº’è¯ç¶²æˆ–æ¥å…§æŠ•稿人士,版權屬于原版權人。轉載請ä¿ç•™ç¨¿ä»¶ä¾†æºåŠä½œè€…ï¼Œç¦æ¢æ“…自篡改,é•è€…è‡ªè² ç‰ˆæ¬Šæ³•å¾‹è²¬ä»»ã€‚
相關資訊