時(shÃ)間:2023-03-10 14:34:53來(lái)æºï¼šæ·±åœ³å¸‚æ£é‹(yùn)å‹•(dòng)技術(shù)有é™å…¬å¸
  本文主è¦ä»‹ç´¹æ£é‹(yùn)å‹•(dòng)技術(shù)EtherCAT控制器在VS平臺(tái)采用C++語(yÇ”)言實(shÃ)ç¾(xià n)çš„å„種PSO功能。æ£é‹(yùn)å‹•(dòng)æä¾›å¤šç¨®PSO模å¼ä¾›ç”¨æˆ¶æé…ä¸åŒçš„å ´(chÇŽng)景使用。上節(jié)講解了多軸PSOç‰è·å‘¨æœŸå’Œå›ºå®šæ™‚(shÃ)間周期兩種比較輸出模å¼ï¼Œæœ¬ç¯€(jié)主è¦è¬›è§£äºŒç¶ä¸‰ç¶æ¯”較輸出模å¼ã€‚
  01ã€ç¡¬ä»¶ä»‹ç´¹
  ZMC408CE是æ£é‹(yùn)å‹•(dòng)推出的一款多軸高性能EtherCAT總線é‹(yùn)å‹•(dòng)控制器,具有EtherCATã€EtherNETã€RS232ã€CANå’ŒU盤(pán)ç‰é€šè¨ŠæŽ¥å£ï¼ŒZMC系列é‹(yùn)å‹•(dòng)æŽ§åˆ¶å™¨å¯æ‡‰(yÄ«ng)用于å„種需è¦è„«æ©Ÿ(jÄ«)或è¯(lián)機(jÄ«)é‹(yùn)è¡Œçš„å ´(chÇŽng)åˆã€‚
  ZMC408CE支æŒ8軸é‹(yùn)å‹•(dòng)æŽ§åˆ¶ï¼Œæœ€å¤šå¯æ“´(kuò)展至32軸,支æŒç›´ç·šæ’補(bÇ”)ã€ä»»æ„圓弧æ’補(bÇ”)ã€ç©ºé–“圓弧ã€èžºæ—‹æ’補(bÇ”)ã€é›»å凸輪ã€é›»å齒輪ã€åŒæ¥è·Ÿéš¨ç‰åŠŸèƒ½ã€‚ZMC408CE支æŒ8軸é‹(yùn)å‹•(dòng)控制,å¯é‡‡ç”¨è„ˆæ²–軸(帶編碼器å饋)或EtherCAT總線軸,通用IO包å«24個(gè)輸入å£å’Œ16個(gè)輸出å£ï¼Œéƒ¨åˆ†IO為高速I(mÇŽi)O,EtherCAT最快100us的刷新周期。ZMC408CE支æŒ8個(gè)通é“的硬件比較輸出ã€ç¡¬ä»¶å®šæ™‚(shÃ)器ã€é‹(yùn)å‹•(dòng)ä¸ç²¾æº–(zhÇ”n)輸出,還支æŒ8通é“PWM輸出,å°(duì)應(yÄ«ng)的輸出å£ç‚ºOUT0-7,支æŒ8個(gè)通é“åŒæ™‚(shÃ)觸發(fÄ)硬件比較輸出,用于多通é“的視覺(jué)飛æ‹å ´(chÇŽng)åˆç‰ã€‚ZMC408CE支æŒPLCã€Basicã€HMI組態(tà i)三種編程方å¼ã€‚PCä¸Šä½æ©Ÿ(jÄ«)API編程支æŒC#ã€C++ã€LabVIEWã€Matlabã€Qtã€Linuxã€VB.Netã€Pythonç‰æŽ¥å£ã€‚
  ZMC408CEå…§(nèi)置高精度PSOä½ç½®åŒæ¥è¼¸å‡ºåŠŸèƒ½ï¼Œåœ¨åŠ å·¥åœ“è§’èˆ‡æ›²ç·šæ™‚(shÃ)å³ä½¿é€²(jìn)行有減速調(dià o)æ•´ï¼Œåœ¨é«˜é€ŸåŠ å·¥çš„å ´(chÇŽng)åˆä¸ä¹Ÿèƒ½æŽ§åˆ¶æ¿€å…‰è¼¸å‡ºçš„ç‰é–“è·è¼¸å‡ºã€‚
  02ã€PSO技術(shù)介紹
  PSO(position synchronized output)å³ä½ç½®åŒæ¥è¼¸å‡ºï¼Œæœ¬è³ª(zhì)是通éŽ(guò)采集實(shÃ)時(shÃ)的編碼器å饋ä½ç½®(ç„¡(wú)編碼器å¯ä½¿ç”¨è¼¸å‡ºçš„脈沖ä½ç½®)與比較模å¼è¨(shè)定的ä½ç½®é€²(jìn)行比較,控制OPé«˜é€ŸåŒæ¥è¼¸å‡ºä¿¡è™Ÿ(hà o),PSO示æ„圖如下。
  PSO一般與激光器(或點(diÇŽn)è† å™´å°„é–¥ç‰è¨(shè)å‚™)åŒæ¥è¼¸å‡ºä¿¡è™Ÿ(hà o)進(jìn)行相ä½åŒæ¥ï¼Œåœ¨é‹(yùn)å‹•(dòng)軌跡的所有階段以æ’定的空間(或æ’定時(shÃ)é–“)間隔觸發(fÄ)輸出開(kÄi)é—œ(guÄn)ï¼ŒåŒ…æ‹¬åŠ é€Ÿã€æ¸›é€Ÿå’Œå‹»é€Ÿæ®µï¼Œå¾žè€Œå¯¦(shÃ)ç¾(xià n)脈沖能é‡å‡å‹»åœ°ä½œç”¨åœ¨è¢«åŠ å·¥ç‰©é«”ä¸Šã€‚PSO功能的特點(diÇŽn)是能高速且穩(wÄ›n)定的輸出信號(hà o)ï¼Œå› ?yà n)檩敵é¼î³èŒ¸éŠèš‹?ï¼Œæ‰€ä»¥èƒ½å¤ åœ¨æ•´å€‹(gè)é‹(yùn)å‹•(dòng)軌跡ä¸ä»¥å›ºå®šçš„è·é›¢è§¸ç™¼(fÄ)輸出信號(hà o)而ä¸ç”¨è€ƒæ…®ç¸½é«”速度,å³åœ¨ç›´ç·šéƒ¨åˆ†ä»¥å¾ˆå¿«çš„速度é‹(yùn)å‹•(dòng)ï¼Œè€Œåœ¨åœ“è§’éƒ¨åˆ†æ¸›é€Ÿçš„åŒæ™‚(shÃ)也能ä¿è‰è¼¸å‡ºé–“è·æ’å®šã€‚é€šå¸¸åœ“è§’åŠ å·¥éƒ¨åˆ†åœ¨æ•´å€‹(gè)åŠ å·¥éŽ(guò)程ä¸å 有比較å°çš„部分,這樣在ä¿è‰åŠ å·¥æ•ˆæžœçš„åŒæ™‚(shÃ),就å¯ä»¥æœ€å¤§é™åº¦åœ°æé«˜ç”¢(chÇŽn)能。
  æ£é‹(yùn)å‹•(dòng)çš„PSO功能調(dià o)用ZAux_Direct_HwPswitch2函數(shù)接å£å¯¦(shÃ)ç¾(xià n),該函數(shù)采用硬件實(shÃ)ç¾(xià n)IO的高速比較輸出,響應(yÄ«ng)速度é”(dá)到微秒級(jÃ)別,故å硬件比較輸出。
  03ã€C++語(yÇ”)言MFC進(jìn)行é‹(yùn)å‹•(dòng)æŽ§åˆ¶é …(xià ng)目的開(kÄi)發(fÄ)
  1.新建MFCé …(xià ng)ç›®å¹¶æ·»åŠ å‡½æ•¸(shù)庫(kù)
  注:本例程在VS2010ç·¨è¯ç’°(huán)境下,基于.NET Framework 4.0框架創(chuà ng)建的MFC窗體應(yÄ«ng)用程åºã€‚
  (1)工具欄èœå–®â€œæ–‡ä»¶â€â†’“新建â€â†’â€œé …(xià ng)ç›®â€ï¼Œå•Ÿå‹•(dòng)創(chuà ng)å»ºé …(xià ng)ç›®å‘?qÅ«)Ð?/p>
  (2)鏿“‡é–‹(kÄi)發(fÄ)語(yÇ”)言為“Visual C++â€å’Œ.NET Framework 4以åŠMFC應(yÄ«ng)用程åºï¼Œå¡«å¯«(xiÄ›)好程åºå以åŠé¸æ“‡å¥½ç¨‹åºå˜æ”¾è·¯å¾‘,點(diÇŽn)擊確定。
  (3)點(diÇŽn)擊下一æ¥ã€‚
  (4)鏿“‡é¡ž(lèi)型為“基于å°(duì)話框â€ï¼Œé»ž(diÇŽn)æ“Šä¸‹ä¸€æ¥æˆ–者完æˆå³å¯ã€‚
  2.æ‰¾åˆ°å» å®¶æä¾›çš„C++函數(shù)庫(kù)文件
(1)進(jìn)å…¥å» å•†æä¾›çš„光盤(pán)資料,找到“8.PC函數(shù)â€æ–‡ä»¶å¤¾ï¼Œå¹¶é»ž(diÇŽn)擊進(jìn)入,找到C++函數(shù)庫(kù),路徑如下(64ä½åº«(kù)為例)。
  (2)鏿“‡â€œå‡½æ•¸(shù)庫(kù)2.1â€æ–‡ä»¶å¤¾ã€‚
  (3)鏿“‡â€œWindows平臺(tái)â€æ–‡ä»¶å¤¾ã€‚
  (4)æ ¹æ“š(jù)需è¦é¸æ“‡å°(duì)應(yÄ«ng)的函數(shù)庫(kù)ï¼Œé€™é‡Œé¸æ“‡â€œ64ä½åº«(kù)â€ã€‚(5)解壓C++å£“ç¸®åŒ…ï¼Œé‡Œé¢æœ‰C++å°(duì)應(yÄ«ng)的函數(shù)庫(kù)。
  (6)函數(shù)庫(kù)具體路徑如下。
  (7)å°‡å» å•†æä¾›çš„C++庫(kù)文件以åŠç›¸é—œ(guÄn)文件復(fù)åˆ¶åˆ°æ–°å»ºçš„é …(xià ng)ç›®ä¸ã€‚
  3.åœ¨é …(xià ng)ç›®ä¸æ·»åŠ éœæ…‹(tà i)庫(kù)和相關(guÄn)é æ–‡ä»¶éœæ…‹(tà i)庫(kù):zauxdll.lib, zmotion.lib相關(guÄn)é æ–‡ä»¶ï¼šzauxdll2.h, zmotion.h
(1)å…ˆå³æ“Šé æ–‡ä»¶ï¼ŒæŽ¥è‘—ä¾æ¬¡é¸æ“‡:â€œæ·»åŠ â€â†’“ç¾(xià n)æœ‰é …(xià ng)â€ã€‚
  (2)在彈出的窗å£ä¸ä¾æ¬¡æ·»åŠ éœæ…‹(tà i)庫(kù)和相關(guÄn)é æ–‡ä»¶ã€‚
  (3)è²æ˜Žç”¨åˆ°çš„é æ–‡ä»¶å’Œå®šç¾©æŽ§åˆ¶å™¨é€£æŽ¥å¥æŸ„。
  至æ¤ï¼Œé …(xià ng)目新建完æˆã€‚
  4.查看PC函數(shù)手冊(cè)
  用戶需è¦å¾žPC函數(shù)手冊(cè)ä¸ç²å–é‹(yùn)å‹•(dòng)控制開(kÄi)發(fÄ)使用的函數(shù)接å£ï¼Œå°(duì)照手冊(cè)說(shuÅ)明使用,PC函數(shù)手冊(cè)在光盤(pán)資料查看,具體路徑如下:“光盤(pán)資料\8.PC函數(shù)\函數(shù)庫(kù)2.1\ZMotion函數(shù)庫(kù)編程手冊(cè)V2.1.pdfâ€ã€‚
  5.控制器網(wÇŽng)å£é€£æŽ¥å‡½æ•¸(shù)接å£
  PC編程一般使用網(wÇŽng)å£å°(duì)控制器和工控機(jÄ«)進(jìn)è¡ŒéˆæŽ¥ã€‚ZAux_FastOpen();å¦‚æžœéˆæŽ¥æˆåŠŸï¼Œè©²æŽ¥å£æœƒ(huì)返回一個(gè)éˆæŽ¥å¥æŸ„。通éŽ(guò)æ“作這個(gè)éˆæŽ¥å¥æŸ„å¯ä»¥å¯¦(shÃ)ç¾(xià n)å°(duì)控制器的控制。ZAux_OpenEth()接å£èªª(shuÅ)明:
ã€€ã€€é …(xià ng)目應(yÄ«ng)用截圖:
  6.硬件比較輸出函數(shù)接å£ä½¿ç”¨å°(duì)䏋使©Ÿ(jÄ«)寄å˜å™¨æ“作的指令æ“ä½œéˆæŽ¥å¥æŸ„“g_handleâ€ï¼Œå°(duì)控制器進(jìn)行寄å˜å™¨å…§(nèi)容å–值,實(shÃ)時(shÃ)æŽ§åˆ¶ä¸‹ä½æ©Ÿ(jÄ«)相關(guÄn)的指令如下。實(shÃ)時(shÃ)å…¨å±€è®Šé‡æŒ‡ä»¤ï¼šZAux_Direct_HwPswitch2硬件比較輸出指令到ä½ç½®åŽç¡¬ä»¶è‡ªå‹•(dòng)觸發(fÄ)op輸出信號(hà o)。
  7.硬件定時(shÃ)器函數(shù)接å£
  ZAux_Direct_HwTimer硬件定時(shÃ)器硬件比較輸出åŽä¸€æ®µæ™‚(shÃ)間還原電平。
  04ã€MFC程åºçš„é‹(yùn)行和讀寫(xiÄ›)控制開(kÄi)發(fÄ)
  1.Demo交互界é¢å¦‚下
  2.äºŒç¶æ¯”較模å¼
  (1)2D比較(模å¼25)
  語(yÇ”)法:HW_PSWITCH2(25,opnum,opstate,maxerr,num,tablepos)mode 25:二ç¶çš„æ¯”較模å¼;opnum:å°(duì)應(yÄ«ng)的輸出å£;
  opstate:第一個(gè)比較點(diǎn)的輸出狀態(tà i);
  maxerr:比較ä½ç½®æ¯å€‹(gè)軸左å³çš„脈沖å差,進(jìn)å…¥å差范åœåŽé–‹(kÄi)始比較,æ¤åƒæ•¸(shù)ä¸èƒ½å¯«(xiÄ›)0;
  num:table里é¢å˜å„²(chÇ”)的比較點(diÇŽn)忍™(biÄo)個(gè)數(shù);
  tablepos:第一個(gè)比較點(diÇŽn)忍™(biÄo)所在table編號(hà o)。
  說(shuÅ)明:比較點(diÇŽn)寫(xiÄ›)在TABLEä¸ï¼Œå…©å€‹(gè)連續(xù)çš„TABLE數(shù)據(jù)組æˆä¸€å€‹(gè)2D忍™(biÄo),æ¯åˆ°é”(dá)一個(gè)比較ä½ç½®OPå轉(zhuÇŽn)一次。圖ä¸è—(lán)色段表示OPé–‹(kÄi)啟,å„類(lèi)常用æ’補(bÇ”)é‹(yùn)å‹•(dòng)凿”¯æŒæ¯”較,比較點(diÇŽn)忍™(biÄo)ä¸€å®šçš„è¦æº–(zhÇ”n)確,å¦å‰‡æœƒ(huì)影響åŽé¢é»ž(diÇŽn)的比較。
  該模å¼ä¸»è¦åŠŸèƒ½ç‚ºï¼Œç¢°åˆ°è¨(shè)ç½®å¥½çš„äºŒç¶æ¯”較點(diÇŽn)之åŽï¼Œè¼¸å‡ºå£é›»å¹³å轉(zhuÇŽn)。
  該模å¼ä½¿ç”¨æ™‚(shÃ)éœ€è¦æŒ‡å®šé«˜é€Ÿè¼¸å‡ºå£ï¼Œå°‡é¦–個(gè)比較點(diÇŽn)的輸出狀態(tà i)ã€æ¯”較軸è¨(shè)置好之åŽï¼Œå†è¨(shè)置比較點(diÇŽn)(å³è¨(shè)ç½®table寄å˜å™¨ï¼Œé»ž(diÇŽn)數(shù)é‡ç‰),è¨(shè)置比較點(diÇŽn)脈沖最大誤差ç‰åƒæ•¸(shù)åŽï¼Œå•Ÿå‹•(dòng)比較。緊接著驅(qÅ«)å‹•(dòng)軸é‹(yùn)å‹•(dòng)å³å¯ã€‚脈沖å差說(shuÅ)明:2D模å¼ä¸‹è¨(shè)ç½®XY忍™(biÄo)éœ€è¦æº–(zhÇ”n)確,軸é‹(yùn)å‹•(dòng)ä¸åˆ°æº–(zhÇ”n)確的TABLE比較點(diÇŽn)時(shÃ)將無(wú)法觸發(fÄ),3D模å¼åŒç†ã€‚æ•…å¤šç¶æ¯”較模å¼å¼•入一個(gè)ç‰¹æ®Šåƒæ•¸(shù)maxerrä½ç½®èŒƒåœå差,左å³èŒƒåœå‡æœ‰æ•ˆï¼Œå³å¯¦(shÃ)éš›ä½ç½®å標(biÄo)點(diÇŽn)與TABLE的比較點(diÇŽn)的差值在maxerr范åœå…§(nèi)便有效,觸發(fÄ)時(shÃ)刻為當(dÄng)å‰ä½ç½®é€²(jìn)入比較點(diÇŽn)的觸發(fÄ)范åœå…§(nèi)便觸發(fÄ)比較,比較范åœç¤ºæ„圖如下。
  注æ„:maxerr的單ä½ç‚ºè„ˆæ²–數(shù)çš„åå·®ï¼Œä¸æ˜¯è·é›¢çš„å差。如下圖所示,è¨(shè)置高速比較輸出å£ç‚º0,首個(gè)比較點(diÇŽn)的輸出狀態(tà i)為1,比較軸為0,1;è¨(shè)置兩個(gè)比較點(diÇŽn),比較點(diÇŽn)忍™(biÄo)分別為:(100,50),(160,80)。å³ç•¶(dÄng)軸é‹(yùn)å‹•(dòng)到點(diÇŽn)(100,50)和點(diÇŽn)(160,80),誤差范åœåœ¨Â±50個(gè)脈沖左å³çš„èŒƒåœæ™‚(shÃ),都會(huì)觸發(fÄ)電平變化。
ã€€ã€€ç¤ºæ³¢å™¨æ³¢å½¢å¦‚åœ–æ‰€ç¤ºï¼šåœ¨åæ¨™(biÄo)(100,50)時(shÃ)輸出為1ï¼Œç›´åˆ°åæ¨™(biÄo)(160,80)的時(shÃ)候æ¢å¾©(fù)為0。
  (2)2D比較(模å¼26)
  語(yǔ)法:HW_PSWITCH2(26,opnum,opstate,maxerr,num,tablepos,[ophwtimeus,ophwtimes,hwcyctimeus])
  mode 26:二ç¶çš„æ¯”較模å¼;opnum:å°(duì)應(yÄ«ng)的輸出å£;opstate:第一個(gè)比較點(diÇŽn)的輸出狀態(tà i);maxerr:比較ä½ç½®æ¯å€‹(gè)軸左å³çš„脈沖å差,進(jìn)å…¥å差范åœåŽé–‹(kÄi)始比較,æ¤åƒæ•¸(shù)ä¸èƒ½å¯«(xiÄ›)0;num:table里é¢å˜å„²(chÇ”)的比較點(diÇŽn)忍™(biÄo)個(gè)數(shù);tablepos:第一個(gè)比較點(diÇŽn)忍™(biÄo)所在table編號(hà o);* ä»¥ä¸‹åƒæ•¸(shù)å’ŒHW_TIMER二é¸ä¸€ï¼ŒHW_TIMERå–®ç¨(dú)寫(xiÄ›)å¯ä»¥å‹•(dòng)æ…‹(tà i)調(dià o)æ•´åƒæ•¸(shù) *ophwtimeus:脈沖時(shÃ)é–“;ophwtimes:脈沖個(gè)數(shù);hwcyctimeus:脈沖周期。說(shuÅ)明:比較點(diÇŽn)寫(xiÄ›)在TABLEä¸ï¼Œå…©å€‹(gè)連續(xù)çš„TABLE數(shù)據(jù)組æˆä¸€å€‹(gè)2D忍™(biÄo),æ¯åˆ°é”(dá)一個(gè)比較ä½ç½®è§¸ç™¼(fÄ)OP,æ¯å€‹(gè)比較點(diÇŽn)OPå轉(zhuÇŽn)的次數(shù)å’Œå轉(zhuÇŽn)周期由HW_TIMERè¨(shè)ç½®;到é”(dá)下一個(gè)TABLEä½ç½®ï¼ŒOP冿¬¡è§¸ç™¼(fÄ)。類(lèi)似模å¼7和模å¼36。
  該模å¼ä¸»è¦åŠŸèƒ½ç‚ºï¼Œç¢°åˆ°è¨(shè)ç½®å¥½çš„äºŒç¶æ¯”較點(diÇŽn)之åŽï¼Œè¼¸å‡ºå£è¼¸å‡ºä¸€æ–·è¨(shè)置好的定時(shÃ)脈沖。該模å¼ä½¿ç”¨æ™‚(shÃ)ï¼Œéœ€è¦æŒ‡å®šé«˜é€Ÿè¼¸å‡ºå£ï¼Œå°‡é¦–個(gè)比較點(diÇŽn)的輸出狀態(tà i)ã€æ¯”較軸è¨(shè)置好之åŽï¼Œå†è¨(shè)置比較點(diÇŽn)(å³è¨(shè)ç½®table寄å˜å™¨ï¼Œé»ž(diÇŽn)數(shù)é‡ç‰),è¨(shè)置好比較點(diÇŽn)之åŽå†è¨(shè)置脈沖有效時(shÃ)é–“ã€è„ˆæ²–周期時(shÃ)間,以åŠè„ˆæ²–個(gè)數(shù)(é‡å¾©(fù)次數(shù)),è¨(shè)置比較點(diÇŽn)的脈沖最大誤差ç‰åƒæ•¸(shù)åŽï¼Œå•Ÿå‹•(dòng)比較。緊接著驅(qÅ«)å‹•(dòng)軸é‹(yùn)å‹•(dòng)å³å¯ã€‚如下圖所示,è¨(shè)置高速比較輸出å£ç‚º0,首個(gè)比較點(diÇŽn)的輸出狀態(tà i)為1,比較軸為0,1;è¨(shè)置兩個(gè)比較點(diÇŽn),比較點(diÇŽn)忍™(biÄo)分別為:(100,100),(200,200)。å³ç•¶(dÄng)軸é‹(yùn)å‹•(dòng)到點(diÇŽn)(100,100),點(diÇŽn)(200,200),誤差范åœåœ¨Â±10個(gè)脈沖左å³çš„èŒƒåœæ™‚(shÃ),都會(huì)觸發(fÄ)兩個(gè)周期為60ms,脈沖有效時(shÃ)間為20ms的脈沖。
ã€€ã€€ç¤ºæ³¢å™¨æ³¢å½¢å¦‚åœ–æ‰€ç¤ºï¼šåœ¨åæ¨™(biÄo)(100,100),(200,200)的時(shÃ)候都會(huì)觸發(fÄ)兩個(gè)周期為60ms,脈沖有效時(shÃ)間為20ms的脈沖。
  3.ä¸‰ç¶æ¯”較模å¼
  (1)3D比較(模å¼35)
  語(yǔ)法:HW_PSWITCH2(35,opnum,opstate,maxerr,num,tablepos)
  mode 35:三ç¶çš„æ¯”較模å¼;opnum:å°(duì)應(yÄ«ng)的輸出å£;opstate:第一個(gè)比較點(diÇŽn)的輸出狀態(tà i);maxerr:比較ä½ç½®æ¯å€‹(gè)軸左å³çš„脈沖å差,進(jìn)å…¥å差范åœåŽé–‹(kÄi)始比較,æ¤åƒæ•¸(shù)ä¸èƒ½å¯«(xiÄ›)0;num:table里é¢å˜å„²(chÇ”)的比較點(diÇŽn)忍™(biÄo)個(gè)數(shù);tablepos:第一個(gè)比較點(diÇŽn)忍™(biÄo)所在table編號(hà o);說(shuÅ)明:比較點(diÇŽn)寫(xiÄ›)在TABLEä¸ï¼Œä¸‰å€‹(gè)連續(xù)çš„TABLE數(shù)據(jù)組æˆä¸€å€‹(gè)3D忍™(biÄo),æ¯åˆ°é”(dá)一個(gè)比較ä½ç½®è§¸ç™¼(fÄ)OP,æ¯å€‹(gè)比較點(diÇŽn)OPå轉(zhuÇŽn)的次數(shù)å’Œå轉(zhuÇŽn)周期由HW_TIMERè¨(shè)ç½®;到é”(dá)下一個(gè)TABLEä½ç½®ï¼ŒOP冿¬¡è§¸ç™¼(fÄ)。類(lèi)似模å¼26和模å¼7。
  該模å¼ä¸»è¦åŠŸèƒ½ç‚ºï¼Œç¢°åˆ°è¨(shè)ç½®å¥½çš„ä¸‰ç¶æ¯”較點(diÇŽn)之åŽï¼Œè¼¸å‡ºå£é›»å¹³å轉(zhuÇŽn)。
  該模å¼ä½¿ç”¨æ™‚(shÃ)éœ€è¦æŒ‡å®šé«˜é€Ÿè¼¸å‡ºå£ï¼Œå°‡é¦–個(gè)比較點(diÇŽn)的輸出狀態(tà i)ã€æ¯”較軸è¨(shè)置好之åŽï¼Œå†è¨(shè)置比較點(diÇŽn)(å³è¨(shè)ç½®table寄å˜å™¨ï¼Œé»ž(diÇŽn)數(shù)é‡ç‰),è¨(shè)置比較點(diÇŽn)的脈沖最大誤差ç‰åƒæ•¸(shù)åŽï¼Œå•Ÿå‹•(dòng)比較。緊接著驅(qÅ«)å‹•(dòng)軸é‹(yùn)å‹•(dòng)å³å¯ã€‚如下圖所示,è¨(shè)置高速比較輸出å£ç‚º0,首個(gè)比較點(diÇŽn)的輸出狀態(tà i)為1,比較軸為0,1,2;è¨(shè)ç½®4個(gè)比較點(diÇŽn),比較點(diÇŽn)忍™(biÄo)分別為:(80,40,20),(160,80,40),(240,120,60),(320,160,80)。å³ç•¶(dÄng)軸é‹(yùn)å‹•(dòng)到點(diÇŽn)(80,40,20),(160,80,40),(240,120,60),(320,160,80),誤差范åœåœ¨Â±10個(gè)脈沖左å³çš„èŒƒåœæ™‚(shÃ),都會(huì)觸發(fÄ)電平變化。
ã€€ã€€ç¤ºæ³¢å™¨æ³¢å½¢å¦‚åœ–æ‰€ç¤ºï¼šåœ¨åæ¨™(biÄo)(80,40,20),(160,80,40),(240,120,60),(320,160,80)時(shÃ)會(huì)發(fÄ)生電平變化。
ã€€ã€€æ ¸å¿ƒç¨‹åºç¤ºä¾‹ï¼š
  ·
  /*åƒæ•¸(shù):mode 25, 26 ,35,36.2D/3D的比較模å¼Axisnum:軸數(shù)組Opnum :å°(duì)應(yÄ«ng)的輸出å£Opstate: 第一個(gè)比較點(diÇŽn)的輸出狀態(tà i).maxerr:比較ä½ç½®æ¯å€‹(gè)軸左å³çš„脈沖åå·®, 進(jìn)å…¥å差范åœåŽé–‹(kÄi)始比較.num :TABLE 里é¢å˜å„²(chÇ”)的比較點(diÇŽn)個(gè)數(shù).tablepos: 第一個(gè)比較點(diÇŽn)忍™(biÄo)所在 TABLE 編號(hà o)與 hwtimer 并用時(shÃ), å¯ä»¥å‹•(dòng)æ…‹(tà i)調(dià o)æ•´ hwtimer åƒæ•¸(shù).ModePara1:脈沖時(shÃ)é–“ModePara2:脈沖個(gè)數(shù)ModePara3:脈沖周期*/int32 CMyControlDlg:: ZAux_Direct_HwPswitch2_2D(ZMC_HANDLE handle, int *Axisnum,int Mode,int Opnum , int Opstate,int maxerr,int num, int tablepos, float ModePara1, float ModePara2,float ModePara3){ if(0 > Axisnum[0] || Axisnum[0] > MAX_AXIS_AUX) { return ERR_AUX_PARAERR; } char cmdbuff[2048]; char tempbuff[2048]; char cmdbuffAck[2048]; //生æˆå‘½ä»¤ sprintf(cmdbuff, "BASE(%d,%d)\n", Axisnum[0], Axisnum[1]); switch(Mode) { case 25: sprintf(tempbuff, "HW_PSWITCH2(%d,%d,%d,%d,%d,%d)", Mode, Opnum, Opstate, maxerr,num,tablepos); strcat(cmdbuff, tempbuff); break; case 26: sprintf(tempbuff, "HW_PSWITCH2(%d,%d,%d,%d,%d,%d,%f,%f,%f)", Mode,Opnum, Opstate, maxerr,num,tablepos,ModePara1,ModePara2,ModePara3); strcat(cmdbuff, tempbuff); break; case 35: sprintf(tempbuff, "HW_PSWITCH2(%d,%d,%d,%d,%d,%d)", Mode, Opnum, Opstate, maxerr,num,tablepos); strcat(cmdbuff, tempbuff); break; case 36: sprintf(tempbuff, "HW_PSWITCH2(%d,%d,%d,%d,%d,%d,%f,%f,%f)", Mode,Opnum, Opstate, maxerr,num,tablepos,ModePara1,ModePara2,ModePara3); strcat(cmdbuff, tempbuff); break; default: return ERR_AUX_PARAERR; break; } //調(dià o)用命令執(zhÃ)行函數(shù) int ret=ZAux_Execute(handle, cmdbuff, cmdbuffAck,2048); if (strlen(cmdbuffAck)!=0) return ERR_ACKERROR; return ret;}
  (2)3D比較(模å¼36)
  語(yÇ”)法:HW_PSWITCH2(36,opnum,opstate,maxerr,num,tablepos, [ophwtimeus,ophwtimes,hwcyctimeus])mode 36:三ç¶çš„æ¯”較模å¼;opnum:å°(duì)應(yÄ«ng)的輸出å£;opstate:第一個(gè)比較點(diÇŽn)的輸出狀態(tà i);maxerr:比較ä½ç½®æ¯å€‹(gè)軸左å³çš„脈沖å差,進(jìn)å…¥å差范åœåŽé–‹(kÄi)始比較,æ¤åƒæ•¸(shù)ä¸èƒ½å¯«(xiÄ›)0;num:table里é¢å˜å„²(chÇ”)的比較點(diÇŽn)忍™(biÄo)個(gè)數(shù);tablepos:第一個(gè)比較點(diÇŽn)忍™(biÄo)所在table編號(hà o);* ä»¥ä¸‹åƒæ•¸(shù)å’ŒHW_TIMER二é¸ä¸€ï¼ŒHW_TIMERå–®ç¨(dú)寫(xiÄ›)å¯ä»¥å‹•(dòng)æ…‹(tà i)調(dià o)æ•´åƒæ•¸(shù) *ophwtimeus:脈沖時(shÃ)é–“;ophwtimes:脈沖個(gè)數(shù);hwcyctimeus:脈沖周期。
  該模å¼ä¸»è¦åŠŸèƒ½ç‚ºï¼Œç¢°åˆ°è¨(shè)ç½®å¥½çš„ä¸‰ç¶æ¯”較點(diÇŽn)之åŽï¼Œè¼¸å‡ºå£è¼¸å‡ºä¸€æ–·è¨(shè)置好的定時(shÃ)脈沖。該模å¼ä½¿ç”¨æ™‚(shÃ)ï¼Œéœ€è¦æŒ‡å®šé«˜é€Ÿè¼¸å‡ºå£ï¼Œå°‡é¦–個(gè)比較點(diÇŽn)的輸出狀態(tà i)ã€æ¯”較軸è¨(shè)置好之åŽï¼Œå†è¨(shè)置比較點(diÇŽn)(å³è¨(shè)ç½®table寄å˜å™¨ï¼Œé»ž(diÇŽn)數(shù)é‡ç‰),è¨(shè)置好比較點(diÇŽn)之åŽå†è¨(shè)置脈沖有效時(shÃ)間,脈沖周期時(shÃ)間,以åŠè„ˆæ²–個(gè)數(shù)(é‡å¾©(fù)次數(shù)),è¨(shè)置比較點(diÇŽn)的脈沖最大誤差ç‰åƒæ•¸(shù)åŽï¼Œå•Ÿå‹•(dòng)比較。緊接著驅(qÅ«)å‹•(dòng)軸é‹(yùn)å‹•(dòng)å³å¯ã€‚如下圖所示,è¨(shè)置高速比較輸出å£ç‚º0,首個(gè)比較點(diÇŽn)的輸出狀態(tà i)為1,比較軸為0,1,2;è¨(shè)ç½®4個(gè)比較點(diÇŽn),比較點(diÇŽn)忍™(biÄo)分別為:(80,40,20),(160,80,40),(240,120,60),(320,160,80)。å³ç•¶(dÄng)軸é‹(yùn)å‹•(dòng)到點(diÇŽn)(80,40,20),(160,80,40),(240,120,60),(320,160,80),誤差范åœåœ¨Â±10個(gè)脈沖左å³çš„èŒƒåœæ™‚(shÃ),都會(huì)觸發(fÄ)電平變化。都會(huì)觸發(fÄ)兩個(gè)周期為40ms,脈沖有效時(shÃ)間為20ms的脈沖。
ã€€ã€€ç¤ºæ³¢å™¨æ³¢å½¢å¦‚åœ–æ‰€ç¤ºï¼šåœ¨åæ¨™(biÄo)(80,40,20),(160,80,40),(240,120,60),(320,160,80)時(shÃ)會(huì)觸發(fÄ)兩個(gè)周期為40ms,脈沖有效時(shÃ)間為20ms的脈沖。
ã€€ã€€æ ¸å¿ƒç¨‹åºç¤ºä¾‹ï¼š
  ·
  /*åƒæ•¸(shù):mode 25, 26 ,35,36.2D/3D的比較模å¼Axisnum:軸數(shù)組Opnum :å°(duì)應(yÄ«ng)的輸出å£Opstate: 第一個(gè)比較點(diÇŽn)的輸出狀態(tà i).maxerr:比較ä½ç½®æ¯å€‹(gè)軸左å³çš„脈沖åå·®, 進(jìn)å…¥å差范åœåŽé–‹(kÄi)始比較.num:TABLE 里é¢å˜å„²(chÇ”)的比較點(diÇŽn)個(gè)數(shù).tablepos: 第一個(gè)比較點(diÇŽn)忍™(biÄo)所在 TABLE 編號(hà o)與 hwtimer 并用時(shÃ), å¯ä»¥å‹•(dòng)æ…‹(tà i)調(dià o)æ•´ hwtimer åƒæ•¸(shù).ModePara1:脈沖時(shÃ)é–“ModePara2:脈沖個(gè)數(shù)ModePara3:脈沖周期*/int32 CMyControlDlg:: ZAux_Direct_HwPswitch2_2D(ZMC_HANDLE handle, int *Axisnum,int Mode,int Opnum , int Opstate,int maxerr,int num, int tablepos, float ModePara1, float ModePara2,float ModePara3){ if(0 > Axisnum[0] || Axisnum[0] > MAX_AXIS_AUX) { return ERR_AUX_PARAERR; } char cmdbuff[2048]; char tempbuff[2048]; char cmdbuffAck[2048]; //生æˆå‘½ä»¤ sprintf(cmdbuff, "BASE(%d,%d)\n", Axisnum[0], Axisnum[1]); switch(Mode) { case 25: sprintf(tempbuff, "HW_PSWITCH2(%d,%d,%d,%d,%d,%d)", Mode, Opnum, Opstate, maxerr,num,tablepos); strcat(cmdbuff, tempbuff); break; case 26: sprintf(tempbuff, "HW_PSWITCH2(%d,%d,%d,%d,%d,%d,%f,%f,%f)", Mode,Opnum, Opstate, maxerr,num,tablepos,ModePara1,ModePara2,ModePara3); strcat(cmdbuff, tempbuff); break; case 35: sprintf(tempbuff, "HW_PSWITCH2(%d,%d,%d,%d,%d,%d)", Mode, Opnum, Opstate, maxerr,num,tablepos); strcat(cmdbuff, tempbuff); break; case 36: sprintf(tempbuff, "HW_PSWITCH2(%d,%d,%d,%d,%d,%d,%f,%f,%f)", Mode,Opnum, Opstate, maxerr,num,tablepos,ModePara1,ModePara2,ModePara3); strcat(cmdbuff, tempbuff); break; default: return ERR_AUX_PARAERR; break; } //調(dià o)用命令執(zhÃ)行函數(shù) int ret=ZAux_Execute(handle, cmdbuff, cmdbuffAck,2048); if (strlen(cmdbuffAck)!=0) return ERR_ACKERROR; return ret;}
完整代碼ç²å–地å€â–¼
  本次,æ£é‹(yùn)å‹•(dòng)技術(shù)é‹(yùn)å‹•(dòng)控制器PSO視覺(jué)飛æ‹èˆ‡ç²¾æº–(zhÇ”n)輸出的C++é–‹(kÄi)發(fÄ)(三):二ç¶/三ç¶/多軸PSO輸出,就分享到這里。
  更多精彩內(nèi)容請(qÇng)é—œ(guÄn)注“æ£é‹(yùn)å‹•(dòng)å°åŠ©æ‰‹â€å…¬çœ¾è™Ÿ(hà o),需è¦ç›¸é—œ(guÄn)é–‹(kÄi)發(fÄ)ç’°(huán)境與例程代碼,請(qÇng)咨詢(xún)æ£é‹(yùn)å‹•(dòng)技術(shù)銷(xiÄo)售工程師:400-089-8936。
  本文由æ£é‹(yùn)å‹•(dòng)技術(shù)原創(chuà ng),æ¡è¿Žå¤§å®¶è½‰(zhuÇŽn)載,共åŒå¸(xué)ç¿’(xÃ),一起æé«˜ä¸åœ‹(guó)æ™ºèƒ½åˆ¶é€ æ°´å¹³ã€‚æ–‡ç« ç‰ˆæ¬Š(quán)æ¸æ£é‹(yùn)å‹•(dòng)技術(shù)所有,如有轉(zhuÇŽn)載請(qÇng)æ³¨æ˜Žæ–‡ç« ä¾†(lái)æºã€‚
ä¸åœ‹(guó)傳動(dòng)ç¶²(wÇŽng)版權(quán)與å…責(zé)è²æ˜Žï¼šå‡¡æœ¬ç¶²(wÇŽng)注明[來(lái)æºï¼šä¸åœ‹(guó)傳動(dòng)ç¶²(wÇŽng)]的所有文å—ã€åœ–片ã€éŸ³è¦–å’Œè¦–é »æ–‡ä»¶ï¼Œç‰ˆæ¬Š(quán)å‡ç‚ºä¸åœ‹(guó)傳動(dòng)ç¶²(wÇŽng)(www.hysjfh.com)ç¨(dú)家所有。如需轉(zhuÇŽn)載請(qÇng)與0755-82949061è¯(lián)系。任何媒體ã€ç¶²(wÇŽng)站或個(gè)人轉(zhuÇŽn)載使用時(shÃ)é ˆæ³¨æ˜Žä¾†(lái)æºâ€œä¸åœ‹(guó)傳動(dòng)ç¶²(wÇŽng)â€ï¼Œé•å者本網(wÇŽng)將追究其法律責(zé)任。
本網(wÇŽng)轉(zhuÇŽn)載并注明其他來(lái)æºçš„稿件,å‡ä¾†(lái)自互è¯(lián)ç¶²(wÇŽng)或æ¥(yè)å…§(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuÇŽn)載請(qÇng)ä¿ç•™ç¨¿ä»¶ä¾†(lái)æºåŠä½œè€…ï¼Œç¦æ¢æ“…自篡改,é•è€…è‡ªè² (fù)版權(quán)法律責(zé)任。
相關(guÄn)資訊