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

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

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