基于VC++çš„æ¥é€²é›»æ©ŸæŽ§åˆ¶æ–¹æ³•探討
時間:2006-08-24 13:44:00來æºï¼šlvjing
å°Ž(dÇŽo)語:?æ¥é€²é›»æ©Ÿæ˜¯ä¸€ç¨®å°‡é›»è„ˆæ²–信號轉(zhuÇŽn)æ›ç‚ºç·šä½ç§»æˆ–è§’ä½ç§»çš„電機
æ¥é€²é›»æ©Ÿæ˜¯ä¸€ç¨®å°‡é›»è„ˆæ²–信號轉(zhuÇŽn)æ›ç‚ºç·šä½ç§»æˆ–è§’ä½ç§»çš„電機,但æ¥é€²é›»æ©Ÿçš„æŽ§åˆ¶é€šå¸¸éƒ½é‡‡ç”¨åŒ¯ç·¨èªžè¨€æˆ–C語言進行軟件開發(fÄ),本文çµ(jié)åˆSC3æ¥é€²é›»æ©ŸæŽ§åˆ¶å™¨åŠå¹³ç§»è‡ºçš„æŽ§åˆ¶é–‹ç™¼(fÄ)為例,介紹了一種如何在Windows平臺下利用Visual C++6.0æä¾›çš„串行通信控件MSComm來實ç¾(xià n)PC機與æ¥é€²é›»æ©ŸæŽ§åˆ¶å™¨ä¹‹é–“的數(shù)據(jù)通訊,最終實ç¾(xià n)ç”±PC機直接控制æ¥é€²é›»æ©Ÿçš„æ–¹æ³•,并詳細(xì)介紹了編寫串行通信程åºçš„基本æ¥é©Ÿå’Œæ–¹æ³•。調(dià o)試çµ(jié)果表明:è¨(shè)計的控制程åºç°¡å–®ã€æ˜“懂,工作å¯é ,且具有å‹å¥½çš„人機交互界é¢ã€‚
æ¥é€²é›»æ©Ÿæ˜¯ä¸€ç¨®å°‡é›»è„ˆæ²–轉(zhuÇŽn)化為角ä½ç§»çš„æ©Ÿé›»å¼æ•¸(shù)模轉(zhuÇŽn)æ›å™¨ï¼Œåœ¨æŽ§åˆ¶ç³»çµ±(tÇ’ng)ä¸å…·æœ‰å分廣泛的用途,但傳統(tÇ’ng)çš„æ¥é€²é›»æ©Ÿçš„æŽ§åˆ¶é€šå¸¸éƒ½é‡‡ç”¨åŒ¯ç·¨èªžè¨€æˆ–C語言進行軟件開發(fÄ),本文利用VC++æä¾›çš„串行通信控件MSComm實ç¾(xià n)PC機與æ¥é€²é›»æ©ŸæŽ§åˆ¶å™¨ä¹‹é–“的串行通信[1]。與 DOS下串行通信程åºä¸åŒçš„æ˜¯ï¼ŒWindowsä¸æå€¡æ‡‰(yÄ«ng)用程åºç›´æŽ¥æŽ§åˆ¶ç¡¬ä»¶ï¼Œè€Œæ˜¯é€šéŽWindowsæ“作系統(tÇ’ng)æä¾›çš„è¨(shè)備驅(qÅ«)動程åºä¾†é€²è¡Œæ•¸(shù)據(jù)傳é€ã€‚串行å£åœ¨Win32䏿˜¯ä½œç‚ºæ–‡ä»¶ä¾†é€²è¡Œè™•ç†çš„ï¼Œè€Œä¸æ˜¯ç›´æŽ¥å°ç«¯å£é€²è¡Œæ“作,å°äºŽä¸²è¡Œé€šä¿¡ï¼ŒWin32æä¾›äº†ç›¸æ‡‰(yÄ«ng)的文件I/O函數(shù)與通信函數(shù),通éŽäº†è§£é€™äº›å‡½æ•¸(shù)的使用,å¯ä»¥ç·¨åˆ¶å‡ºç¬¦åˆä¸åŒéœ€è¦çš„通信程åºã€‚
實ç¾(xià n)串行通信[2]一般有3種方法[3]:使用VC++æä¾›çš„串行通信控件MSCommï¼»4];在單線程ä¸å¯¦ç¾(xià n)自定義的串å£é€šä¿¡é¡žï¼›å¤šç·šç¨‹ä¸‹å¯¦ç¾(xià n)串行通信。çµ(jié)åˆå¯¦éš›æƒ…æ³ï¼Œæœ¬ç³»çµ±(tÇ’ng)采用VC++æä¾›çš„串行通信控件MSComm來進行軟件編程,å¯ä»¥å¾ˆæ–¹ä¾¿åœ°ç®¡ç†èˆ‡æŽ§åˆ¶è¨ˆç®—機串å£ã€‚
1ã€ç³»çµ±(tÇ’ng)組æˆ
ç”±PC機控制æ¥é€²é›»å‹•機的系統(tÇ’ng)如圖1所示。

圖1 PC機控制æ¥é€²é›»æ©Ÿç³»çµ±(tÇ’ng)框圖
本系統(tÇ’ng)的電機控制采用通用的RS 232ï¼»5]串å£çš„ç•°æ¥é€šä¿¡ã€‚由于RS 232早期是為促進公用電話網(wÇŽng)絡(luò)進行數(shù)據(jù)通信而制定的標(biÄo)準(zhÇ”n),其é‚輯電平å°åœ°æ˜¯å°ç¨±çš„,與TTLã€MOSé‚輯電平完全ä¸åŒã€‚é‚輯0電平è¦(guÄ«)定為+5~+15 V之間,é‚輯1電平è¦(guÄ«)定為-5~-15 Vä¹‹é–“ï¼Œå› æ¤ï¼ŒRS 232é©…(qÅ«)動器與TTLé›»å¹³é€£æŽ¥å¿…é ˆç¶“(jÄ«ng)éŽé›»å¹³è½‰(zhuÇŽn)æ›ã€‚
2ã€æŽ§åˆ¶è»Ÿç¡¬ä»¶çš„æŠ€è¡“(shù)åƒæ•¸(shù)
本系統(tÇ’ng)采用å“立漢光儀器有é™å…¬å¸ç”Ÿç”¢(chÇŽn)çš„SC3æ¥é€²é›»æ©ŸæŽ§åˆ¶å™¨åŠå¹³ç§»è‡ºï¼Œå¯¦ç¾(xià n)å¹³ç§»è‡ºçš„ä¸‰ç¶æŽ§åˆ¶ï¼ˆx,y,z)。利用RS 232串å£ç•°æ¥é€šä¿¡å®Œæˆå°æ¥é€²é›»æ©Ÿçš„å–®æ¥å’Œé€£çºŒ(xù)移動控制,并且把電機的實際ä½ç½®æ•¸(shù)據(jù)å饋給PC機處ç†ã€‚
電控平移臺的機械指標(biÄo)如下:
(1) 精密電控旋轉(zhuÇŽn)臺:型號RSA200用于x軸。轉(zhuÇŽn)動范åœ>±40°;傳動比180∶1ï¼›å°æ¥è·0.000 312 5°;臺é¢ç›´å¾‘Φ200;分辨率0.001 25°;é‡å¾©(fù)定ä½ç²¾åº¦<0.005°;最大速度25/sï¼›ä¸å¿ƒæœ€å¤§è² (fù)載60 kg。
(2) é‡è¼‰åž‹é›»æŽ§å¹³ç§»è‡ºï¼šåž‹è™ŸTSA300B,用于zè»¸ã€‚æœ€å°æ¥è·0.003 15 mmï¼›é‡å¾©(fù)定ä½ç²¾åº¦<0.005 mmï¼›åŠ å›ºå®šå¹³ç§»è‡ºæœ‰æ•ˆè¡Œç¨‹ç‚º150 mm。
(3) 超薄型電控平移臺:型號TSA30C,用于yè»¸ã€‚æœ€å°æ¥è·ç‚º0.002 mmï¼›é‡å¾©(fù)定ä½ç²¾åº¦<0.005 mm;有效行程30 mm。SC3æ¥é€²é›»æ©ŸæŽ§åˆ¶å™¨è¨(shè)有手動和è¯(lián)å‹•æ–¹å¼ï¼Œæ‰‹å‹•能è¨(shè)置的æ“作有:速度è¨(shè)å®šã€æ¸é›¶æ“ä½œã€æ–¹å‘è¨(shè)定ã€ä½ç§»é‡è¨(shè)定ç‰ï¼Œè¯(lián)機方å¼å¯ä»¥ä½¿é›»æ©Ÿçš„é‹å‹•ç›´æŽ¥å—æ‡‰(yÄ«ng)用軟件控制。由于是進行二次開發(fÄ)ï¼Œå› æ¤æ‡‰(yÄ«ng)用程åºå¿…é ˆåµŒå…¥åŽŸæŽ§åˆ¶å™¨çš„æŽ§åˆ¶æŒ‡ä»¤åŠå”(xié)è°ã€‚
該指令系統(tÇ’ng)ä¸»è¦æœ‰ä»¥ä¸‹å¹¾æ¢ï¼š
è¯(lián)絡(luò)æŒ‡ä»¤æŒ‡ä»¤æ ¼å¼ï¼šâ€œï¼ŸR" & CHR$(13)
該指令發(fÄ)出200 ms以內(nèi)SC3回é€ï¼šâ€œOKâ€& CHR$(10),表示è¯(lián)絡(luò)æˆåŠŸã€‚
æŸ¥è©¢æŒ‡ä»¤æŒ‡ä»¤æ ¼å¼ï¼šâ€œï¼ŸVâ€& CHR$(13)
SC3接到該指令åŽå›žé€ï¼šâ€œV number†& CHR$(10)。其ä¸number為ASC碼表示的SC3ç•¶(dÄng)å‰é€Ÿåº¦å€¼ã€‚范åœ0~255。
忍™(biÄo)æŸ¥è©¢æŒ‡ä»¤æŒ‡ä»¤æ ¼å¼ï¼šâ€œï¼ŸXâ€& CHR$(13) 或“?Yâ€& CHR$(13)或“?Zâ€& CHR$(13)
SC3接到該指令åŽå›žé€ï¼šâ€œX+number†& CHR$(10),或“Xnumber†& CHR$(10),其他軸類似。其ä¸number為以ASC碼表示的SC3ç•¶(dÄng)å‰å標(biÄo)值,æ£è² (fù)號代表當(dÄng)å‰ä½ç½®åœ¨é–‹æ©Ÿä½ç½®ï¼ˆ0ä½ï¼‰çš„æ£è² (fù)æ–¹å‘çš„ä½ç½®ã€‚
速度è¨(shè)ç½®æŒ‡ä»¤æŒ‡ä»¤æ ¼å¼ï¼šâ€œVâ€& number & CHR$(13)
å…¶ä¸number為以ASC碼表示的速度è¨(shè)置值。范åœ0~255。
æ¸é›¶æŒ‡ä»¤æŒ‡ä»¤æ ¼å¼ï¼šâ€œHXâ€& CHR$(13) 或“HYâ€& CHR$(13) 或“HZâ€& CHR$(13)
SC3接到æ¤é¡žæŒ‡ä»¤åŽé€²è¡Œæ¸é›¶æ“ä½œã€‚å®Œæˆæ¸é›¶æ“作åŽå›žé€ï¼šâ€œOKâ€& CHR$(10),表示SC3æ¸é›¶å®Œç•¢ã€‚
零狀態(tà i)æŸ¥è©¢æŒ‡ä»¤æŒ‡ä»¤æ ¼å¼ï¼šâ€œï¼ŸHâ€& CHR$(13)
SC3接到æ¤é¡žæŒ‡ä»¤åŽå›žé€ï¼šâ€œH000†& CHR$(10)
å…¶ä¸000çš„å«ç¾©ï¼š
ç¬¬ä¸€ä½æ•¸(shù)值:1表示z軸æ¸é›¶æˆåŠŸï¼Œ0表示z軸未æ¸é›¶ã€‚
ç¬¬äºŒä½æ•¸(shù)值:1表示y軸æ¸é›¶æˆåŠŸï¼Œ0表示y軸未æ¸é›¶ã€‚
ç¬¬ä¸‰ä½æ•¸(shù)值:1表示x軸æ¸é›¶æˆåŠŸï¼Œ0表示x軸未æ¸é›¶ã€‚
é‹è¡ŒæŒ‡ä»¤æŒ‡ä»¤æ ¼å¼ï¼šâ€œXdirectionnumberâ€& CHR$(13)或“Y directionnumberâ€& CHR$(13)或“Z directionnumberâ€& CHR$(13)
3ã€è»Ÿä»¶å¯¦ç¾(xià n)
3.1 利用VC++æä¾›çš„串行通信控件MSComm實ç¾(xià n)串行通信
首先,在VC++ï¼»5]的å°è©±æ¡†ä¸å‰µ(chuà ng)建通信控件,若Control工具欄ä¸ç¼ºå°‘該控件,å¯é€šéŽèœå–®Project→Add toProject→Components and Controlæ’å…¥å³å¯ï¼Œå†å°‡è©²æŽ§ä»¶å¾žå·¥å…·ç®±æ‹‰åˆ°å°è©±æ¡†ä¸ã€‚æ¤æ™‚ï¼Œä½ åªéœ€è¦é—œ(guÄn)心控件æä¾›çš„å°Windows通信驅(qÅ«)動程åºçš„API函數(shù)的接å£ï¼Œå³åªéœ€è¦è¨(shè)置和監(jiÄn)視MSComm控件的屬性和事件。
在ClassWizardä¸ç‚ºæ–°å»ºçš„通信控件定義æˆå“¡å°è±¡ï¼ˆCMSComm m_Serial),通éŽè©²å°è±¡ä¾¿å¯ä»¥å°ä¸²å£å±¬æ€§é€²è¡Œè¨(shè)置,MSComm控件共有27個屬性,其ä¸ä¸»è¦åŒ…括:
Commport:è¨(shè)置并返回通信端å£è™Ÿï¼Œç¼ºçœç‚ºCOM1。
Settings:以å—符串的形å¼è¨(shè)置并返回波特率ã€å¥‡å¶æ ¡é©—ã€æ•¸(shù)據(jù)ä½ã€åœæ¢ä½ã€‚
PortOpen:è¨(shè)置并返回通信端å£çš„狀態(tà i),也å¯ä»¥æ‰“開和關(guÄn)閉端å£ã€‚
Input:從接收緩沖å€(qÅ«)返回和刪除å—符。
Output:å‘發(fÄ)é€ç·©æ²–å€(qÅ«)寫入å—符串。
InputLenï¼šæ¯æ¬¡è¨(shè)ç½®Input讀入的å—符個數(shù),缺çœå€¼ç‚º0ï¼Œè¡¨æ˜Žè®€å–æŽ¥æ”¶ç·©æ²–å€(qÅ«)ä¸çš„全部內(nèi)容。
InBufferCount:返回接收緩沖å€(qÅ«)ä¸å·²æŽ¥æ”¶åˆ°çš„å—符數(shù),將其置0å¯ä»¥æ¸…除接收緩沖å€(qÅ«)。
InputMode:定義Input屬性ç²å–數(shù)據(jù)的方å¼ï¼ˆç‚º0:文本方å¼ï¼›ç‚º1:二進制方å¼ï¼‰ã€‚
RThresholdå’ŒSThreshold屬性,表示在OnComm事件發(fÄ)生之å‰ï¼ŒæŽ¥æ”¶ç·©æ²–å€(qÅ«)或發(fÄ)é€ç·©æ²–å€(qÅ«)ä¸å¯æŽ¥æ”¶çš„å—符數(shù)。
以下是通éŽè¨(shè)置控件屬性å°ä¸²å£é€²è¡Œåˆå§‹åŒ–的實例:
打開所需串å£åŽï¼Œéœ€è¦è€ƒæ…®ä¸²å£é€šä¿¡çš„æ™‚機。在接收或發(fÄ)逿•¸(shù)據(jù)éŽç¨‹ä¸ï¼Œå¯èƒ½éœ€è¦ç›£(jiÄn)視并響應(yÄ«ng)一些事件和錯誤,所以事件驅(qÅ«)動是處ç†ä¸²è¡Œç«¯å£äº¤äº’作用的一種éžå¸¸æœ‰æ•ˆçš„æ–¹æ³•。使用OnComm事件和CommEventå±¬æ€§æ•æ‰å¹¶æª¢æŸ¥é€šä¿¡äº‹ä»¶å’ŒéŒ¯èª¤çš„值。發(fÄ)生通信事件或錯誤時,將觸發(fÄ)OnComm事件,CommEvent屬性的值將被改變,應(yÄ«ng)ç”¨ç¨‹åºæª¢æŸ¥CommEvent屬性值并作出相應(yÄ«ng)çš„åæ‡‰(yÄ«ng)。在程åºä¸ç”¨ClassWizard為CMSCommæŽ§ä»¶æ·»åŠ OnComm消æ¯è™•ç†å‡½æ•¸(shù):
3.2 系統(tÇ’ng)åˆå§‹åŒ–
在執(zhÃ)行應(yÄ«ng)ç”¨ç¨‹åºæ™‚é¦–å…ˆå¿…é ˆé€²è¡Œåˆå§‹åŒ–,其åˆå§‹åŒ–ç¨‹åºæ¡†åœ–如圖2所示。

圖2 åˆå§‹åŒ–ç¨‹åºæ¡†åœ–
é‹è¡Œç¨‹åºæ™‚,視圖執(zhÃ)行åˆå§‹åŒ–æ“作函數(shù)OnInitialUpdate(),該函數(shù)å…§(nèi)è¦å…ˆæ‰“開串å£1,通éŽè¨(shè)ç½®å°è±¡m_ContrCom儿ˆå“¡å‡½æ•¸(shù),è¨(shè)置好å„é€šä¿¡åƒæ•¸(shù):
ç„¶åŽç¶“(jÄ«ng)éŽä¸€å€‹ä½ç½®é¸æ“‡å°è©±æ¡†ï¼Œé€šå¸¸é¸â€œä¿æŒåŽŸä¾†çš„ä½ç½®â€ï¼Œç„¶åŽå°±ç™¼(fÄ)出詢å•å„è»¸çš„åæ¨™(biÄo)值的指令。æµç¨‹å¦‚圖2所示。除x軸是直接發(fÄ)é€å標(biÄo)è©¢å•æŒ‡ä»¤ç²å¾—忍™(biÄo)數(shù)據(jù)外,其他2個軸都是通éŽé€£çºŒ(xù)çš„2個定時器來詢å•忍™(biÄo)的,定時器響應(yÄ«ng)åŽåŸ·(zhÃ)行圖3的程åºã€‚æ¤åŽå°±é€²å…¥å¾…æ“作畫é¢ã€‚
3.3 é‹è¡Œæ“作的編程
在電機é‹å‹•æ“作å€(qÅ«)çš„å„æ–‡æœ¬æ¡†å…§(nèi)輸入æŸä¸€è»¸å‘çš„ä½ç§»å€¼ã€é€Ÿåº¦å€¼ï¼ŒæŒ‰ä¸‹â€œé‹è¡Œâ€æŒ‰éˆ•ï¼Œå‰‡ç¨‹åºæœƒæŠŠä½ç§»å€¼è½‰(zhuÇŽn)化為å—符型的實際è¦é‹è¡Œçš„æ¥æ•¸(shù),通éŽä¸²å£é€åˆ°SC3æ¥é€²é›»æ©ŸæŽ§åˆ¶å™¨ï¼ŒæŽ§åˆ¶å°æ‡‰(yÄ«ng)的軸的電機é‹è¡Œç›¸æ‡‰(yÄ«ng)çš„æ¥æ•¸(shù)。é‹è¡Œçµ(jié)æŸåŽï¼ŒSC3會返回一個“OKâ€å—符至串å£ï¼ŒPC機接å—到這個å—符åŽï¼Œå°±çŸ¥é“電機é‹è¡Œçµ(jié)æŸï¼Œç„¶åŽå‘串å£ç™¼(fÄ)é€å標(biÄo)è©¢å•æŒ‡ä»¤ï¼ŒSC3æœƒå›žé€æœ‰é—œ(guÄn)忍™(biÄo)數(shù)據(jù),PC機接到這些數(shù)據(jù)åŽé€²è¡Œè™•ç†é‹ç®—并在文本框ä¸é¡¯ç¤ºå‡ºä¾†ã€‚這樣就çµ(jié)æŸäº†ä¸€å€‹å®Œæ•´çš„é‹è¡Œæ“作。
所有主è¦çš„PC機和SC3控制器的有關(guÄn)數(shù)據(jù)通信程åºéƒ½åœ¨MSComm控件內(nèi)。包括所有的接å—ã€è˜åˆ¥è¿”回å—符,å„軸å‘忍™(biÄo)çš„é‹ç®—和顯示。
ç•¶(dÄng)æ¥é€²é‹å‹•完畢åŽï¼Œè¿”回到PC機的數(shù)據(jù)為æ¥é€²é›»æ©Ÿå·²ç¶“(jÄ«ng)é‹è¡Œçš„æ¥æ•¸(shù)ï¼Œæ ¹æ“š(jù)é€™å€‹æ¥æ•¸(shù)è¦è¨ˆç®—相應(yÄ«ng)çš„åæ¨™(biÄo)ï¼Œå¿…é ˆçŸ¥é“å„軸的脈沖當(dÄng)é‡ã€‚æ¥é€²é›»æ©Ÿæ¯èµ°ä¸€æ¥ï¼Œé›»ç§»è‡ºçš„ä½ç§»ç‰äºŽè„ˆæ²–ç•¶(dÄng)é‡ï¼Œå³åˆ†è¾¨çŽ‡ã€‚
忍™(biÄo)值=åˆå§‹å標(biÄo)+é‹è¡Œæ¥æ•¸(shù)*脈沖當(dÄng)é‡
平移臺脈沖當(dÄng)é‡=çµ²æ å°Ž(dÇŽo)程mm*æ¥è·è§’/(360*細(xì)分?jÇn)?shù))
旋轉(zhuÇŽn)臺(x軸)的脈沖當(dÄng)é‡ï¼ˆåº¦ï¼‰=æ¥é€²é›»æ©Ÿæ¥è·è§’/(傳動比*細(xì)分?jÇn)?shù))
å…¶ä¸ç´°(xì)分?jÇn)?shù)是由控制器åŽé¢æ¿æ’¥ç¢¼é–‹é—œ(guÄn)è¨(shè)置的。
æ¥é€²é›»æ©Ÿçš„æ¥è·è§’都為1.8°,縱軸的絲æ å°Ž(dÇŽo)程為1 mm,橫軸為4 mm,旋轉(zhuÇŽn)軸傳動比為180∶1,細(xì)分?jÇn)?shù)為2ï¼Œå‰‡æ ¹æ“š(jù)以上公å¼å¯å¾—出:
縱軸(z)脈沖當(dÄng)é‡=1/100
橫軸(y)脈沖當(dÄng)é‡=1/400
旋轉(zhuÇŽn)軸(x)脈沖當(dÄng)é‡=1/200
4ã€çµ(jié)語
在PC機和單片機之間實ç¾(xià n)ä¸²è¡Œé€šä¿¡æŽ§åˆ¶æ˜¯è¿‘å¹¾å¹´å¾ˆå—æ¡è¿Žã€è¼ƒç‚ºæµè¡Œçš„æ–¹æ³•。本文介紹的é‹ç”¨MSComm控件來編制的由PCæ©Ÿå°æ¥é€²é›»æ©Ÿç›´æŽ¥æŽ§åˆ¶çš„æ‡‰(yÄ«ng)用軟件具有å‹å¥½çš„人機交互界é¢ï¼Œä¸”編程簡便ã€å·¥ä½œå¯é ï¼Œæ˜¯ä¸€ç¨®åˆ‡å¯¦æœ‰æ•ˆçš„æ–¹æ³•ã€‚åŒæ™‚,這種串行控制方法和技術(shù)é‚„å¯é‹ç”¨äºŽç›¸æ‡‰(yÄ«ng)的工æ¥(yè)æŽ§åˆ¶å ´åˆã€‚