摘è¦ï¼šæœ¬æ–‡åˆ†æžäº†Windows環境下串行通信的編程技術,介紹了在Windows環境下用VB6.0語言編寫串行通信程åºï¼Œå¯¦ç¾äº†PCæ©Ÿèˆ‡ä¸‰è± Q00PLC 之間的串行通信,并æå‡ºäº†åœ¨å¯¦é𛿇‰ç”¨ä¸æé«˜ä¸²è¡Œé€šä¿¡æ€§èƒ½çš„æ–¹æ³•。
é—œéµè©žï¼šVBï¼›Win32API函數;串行通信;Q00PLC
一 概述
åœ¨å·¥æ¥æŽ§åˆ¶ä¸,䏲壿˜¯å¸¸ç”¨çš„計算機與外部串行è¨å‚™ä¹‹é–“的數據傳輸通é“ã€‚ç”±äºŽä¸²è¡Œé€šä¿¡çµæ§‹ç°¡å–®ã€å¯é 性強ã€å¯¦ç¾åŠä½¿ç”¨æˆæœ¬ä½Žã€é€šè¨Šæ¨™æº–çµ±ä¸€ï¼Œå› æ¤åœ¨æ¸¬æŽ§ç³»çµ±å’Œå·¥ç¨‹ä¸æ‡‰ç”¨å分廣泛。目å‰Windows在工æ¥ç”Ÿç”¢ç›£æŽ§ç®¡ç†ç³»çµ±ä¸å·²æˆç‚ºä¸»æµå¹³è‡º ,Windows環境下的上ã€ä¸‹ä½æ©Ÿä¹‹é–“的串行通信是è¨è¨ˆèˆ‡é–‹ç™¼ç›£æŽ§ç®¡ç†ç³»çµ±å’Œé›†æ•£æŽ§åˆ¶ç³»çµ±çš„é‡è¦çµ„æˆéƒ¨åˆ†ã€‚
Microsoftå…¬å¸çš„VB++6.0是一種高級編程語言,它æä¾›çš„串列通信控件å°è£äº†å°è£äº†Win32APIä¸çš„æ¨™æº–通信函數,å¯ä»¥è®“é–‹ç™¼è€…æ–¹ä¾¿é–‹ç™¼ä¸²åˆ—é€šä¿¡ä¸Šä½æ©Ÿç¨‹åºã€‚
PLC是ç¾åœ¨æŽ§åˆ¶é ˜åŸŸä¸å¯ç¼ºå°‘的部分,已經éžå¸¸æ™®åŠï¼Œå¦‚何簡便的與PLC交互已經æˆç‚ºçœ¾å¤šå» å•†æ–°çš„ç«¶çˆæˆ°å ´ã€‚ç”±æ¤ç”¢ç”Ÿäº†äººæ©Ÿç•Œé¢ã€çµ„態軟件ç‰ç”¢å“。這些產å“的產生大大簡化了å°PLC的控制,æ“作,使用更方便。但也有共åŒçš„ç¼ºé»žï¼šåƒ¹æ ¼éŽé«˜å’Œé–‹æ”¾æ€§è¼ƒå·®ã€‚VB作為“原始"的編程語言在這兩方é¢ç„¡ç–‘有著明顯的優勢。
二 串行通信
串行通信是指計算機主機與外è¨ä¹‹é–“以åŠä¸»æ©Ÿç³»çµ±èˆ‡ä¸»æ©Ÿç³»çµ±ä¹‹é–“數據的串行傳é€ã€‚使用串å£é€šä¿¡æ™‚,發é€å’ŒæŽ¥æ”¶åˆ°çš„æ¯ä¸€å€‹å—符實際上都是一次一ä½çš„傳é€çš„,æ¯ä¸€ä½ç‚º1或者為0。
2.1 串行通信的分類
串行通信å¯ä»¥åˆ†ç‚ºåŒæ¥é€šä¿¡å’Œç•°æ¥é€šä¿¡å…©é¡žã€‚åŒæ¥é€šä¿¡æ˜¯æŒ‰ç…§è»Ÿä»¶è˜åˆ¥åŒæ¥å—ç¬¦ä¾†å¯¦ç¾æ•¸æ“šçš„發é€å’ŒæŽ¥æ”¶ï¼Œç•°æ¥é€šä¿¡æ˜¯ä¸€ç¨®åˆ©ç”¨å—符的å†åŒæ¥æŠ€è¡“的通信方å¼ã€‚
2.1.1 åŒæ¥é€šä¿¡
åŒæ¥é€šä¿¡æ˜¯ä¸€ç¨®é€£çºŒä¸²è¡Œå‚³é€æ•¸æ“šçš„通信方å¼ï¼Œä¸€æ¬¡é€šä¿¡åªå‚³é€ä¸€å¹€ä¿¡æ¯ã€‚這里的信æ¯å¹€èˆ‡ç•°æ¥é€šä¿¡ä¸çš„å—符幀ä¸åŒï¼Œé€šå¸¸å«æœ‰è‹¥å¹²å€‹æ•¸æ“šå—符。
它們å‡ç”±åŒæ¥å—ç¬¦ã€æ•¸æ“šå—ç¬¦å’Œæ ¡é©—å—符(CRC)組æˆã€‚å…¶ä¸åŒæ¥å—符ä½äºŽå¹€é–‹é ï¼Œç”¨äºŽç¢ºèªæ•¸æ“šå—符的開始。數據å—ç¬¦åœ¨åŒæ¥å—符之åŽï¼Œå€‹æ•¸æ²’有é™åˆ¶ï¼Œç”±æ‰€éœ€å‚³è¼¸çš„æ•¸æ“šå¡Šé•·åº¦ä¾†æ±ºå®šï¼›æ ¡é©—å—符有1到2å€‹ï¼Œç”¨äºŽæŽ¥æ”¶ç«¯å°æŽ¥æ”¶åˆ°çš„å—符åºåˆ—進行æ£ç¢ºæ€§çš„æ ¡é©—ã€‚åŒæ¥é€šä¿¡çš„ç¼ºé»žæ˜¯è¦æ±‚ç™¼é€æ™‚é˜å’ŒæŽ¥æ”¶æ™‚é˜ä¿æŒåš´æ ¼çš„åŒæ¥ã€‚
2.1.2 ç•°æ¥é€šä¿¡
ç•°æ¥é€šä¿¡ä¸ï¼Œåœ¨ç•°æ¥é€šè¡Œä¸æœ‰å…©å€‹æ¯”較é‡è¦çš„æŒ‡æ¨™ï¼šå—ç¬¦å¹€æ ¼å¼å’Œæ³¢ç‰¹çŽ‡ã€‚æ•¸æ“šé€šå¸¸ä»¥å—符或者å—節為單ä½çµ„æˆå—符幀傳é€ã€‚å—符幀由發é€ç«¯é€å¹€ç™¼é€ï¼Œé€šéŽå‚³è¼¸ç·šè¢«æŽ¥æ”¶è¨å‚™é€å¹€æŽ¥æ”¶ã€‚發é€ç«¯å’ŒæŽ¥æ”¶ç«¯å¯ä»¥ç”±å„自的時é˜ä¾†æŽ§åˆ¶æ•¸æ“šçš„發é€å’ŒæŽ¥æ”¶ï¼Œé€™å…©å€‹æ™‚é˜æºå½¼æ¤ç¨ç«‹ï¼Œäº’ä¸åŒæ¥ã€‚
接收端檢測到傳輸線上發é€éŽä¾†çš„低電平é‚輯"0"(å³å—符幀起始ä½ï¼‰æ™‚,確定發é€ç«¯å·²é–‹å§‹ç™¼é€æ•¸æ“šï¼Œæ¯ç•¶æŽ¥æ”¶ç«¯æ”¶åˆ°å—符幀ä¸çš„åœæ¢ä½æ™‚,就知é“一幀å—符已經發é€å®Œç•¢ã€‚
2.2 幾種æµè¡Œçš„串行通信å”è°
RSï¼232ã€RS-422å’ŒRSï¼485éƒ½æ˜¯ä¸²è¡Œæ•¸æ“šæŽ¥å£æ¨™æº–,最åˆéƒ½æ˜¯ç”±é›»åå·¥æ¥å”會(EIA)制訂并發布的,RS-232在1962年發布,åŽä¾†é™¸çºŒæœ‰ä¸å°‘æ”¹é€²ç‰ˆæœ¬ï¼Œå…¶ä¸æœ€å¸¸ç”¨çš„æ˜¯RS-232-C版。
ç›®å‰RS-232是PC機與通信工æ¥ä¸æ‡‰ç”¨æœ€å»£æ³›çš„一種串行接å£ã€‚RS-232被定義為一種在低速率串行通信ä¸å¢žåŠ é€šä¿¡è·é›¢çš„單端標準。RS-232采å–ä¸å¹³è¡¡å‚³è¼¸æ–¹å¼ï¼Œå³æ‰€è¬‚單端通信。標準è¦å®šï¼ŒRSï¼232的傳é€è·é›¢è¦æ±‚å¯é”50英尺(約15米),最高速率為20kbps。
[align=center]

圖1 RS232端å£çš„ç¡¬ä»¶æ¡æ‰‹å’Œé€£æŽ¥æ–¹å¼[/align]
RS232的通訊信號電平為æ£è² 5~15V,這ä¸åŒäºŽæ•¸å—電路的0~3V或0~5V,所以è¦ä»¥RS232的方å¼é€²è¡Œé€šè¨Šï¼Œæºä¿¡è™Ÿä¸åŒ¹é…時需è¦é€²è¡Œé›»å£“轉æ›ã€‚
ç•¶é€²è¡Œæ•¸æ“šå‚³é€æ™‚,åªç”¨ä¸€æ ¹æ•¸æ“šç·šä¸”åªèƒ½é€²è¡Œå–®å‘傳輸的方å¼ï¼Œç¨±ç‚ºå–®å·¥æ–¹å¼ï¼› ç•¶é€²è¡Œæ•¸æ“šå‚³é€æ™‚,åªç”¨ä¸€æ ¹æ•¸æ“šç·šåˆ©ç”¨ä¸åŒæ™‚段進行雙å‘傳輸的方å¼ï¼Œç¨±ç‚ºåŠé›™å·¥æ–¹å¼ï¼›ç•¶é€²è¡Œæ•¸æ“šå‚³é€æ™‚ï¼Œåˆ©ç”¨å…©æ ¹æ•¸æ“šç·šåŒæ™‚進行發é€å’ŒæŽ¥æ”¶çš„æ–¹å¼ï¼Œç¨±ç‚ºå…¨é›™å·¥æ–¹å¼ã€‚
由于RS-232å˜åœ¨å‚³è¼¸è·é›¢æœ‰é™ç‰ä¸è¶³ï¼ŒäºŽæ˜¯RS-422誕生了。RS-422æ¨™æº–å…¨ç¨±æ˜¯â€œå¹³è¡¡é›»å£“æ•¸å—æŽ¥å£é›»è·¯çš„電氣特性â€ï¼Œå®ƒå®šç¾©äº†ä¸€ç¨®å¹³è¡¡é€šä¿¡æŽ¥å£ï¼Œå°‡å‚³è¼¸é€Ÿçއæé«˜åˆ°10Mbps,傳輸è·é›¢å»¶é•·åˆ°4000英尺(約1219米),并å…許在一æ¢å¹³è¡¡ç¸½ç·šä¸Šé€£æŽ¥æœ€å¤š10個接收器。當然,RSï¼422也有缺陷: å› ç‚ºå…¶å¹³è¡¡é›™çµžç·šçš„é•·åº¦èˆ‡å‚³è¼¸é€ŸçŽ‡æˆå比,所以在100kbps速率以內,傳輸è·é›¢æ‰å¯èƒ½é”åˆ°æœ€å¤§å€¼ï¼Œä¹Ÿå°±æ˜¯èªªï¼Œåªæœ‰åœ¨å¾ˆçŸçš„è·é›¢ä¸‹æ‰èƒ½ç²å¾—最高傳輸速率。一般在100米長的雙絞線上所能ç²å¾—的最大傳輸速率僅為1Mbps。å¦å¤–æœ‰ä¸€é»žå¿…é ˆæŒ‡å‡ºï¼Œåœ¨RS-422通信ä¸ï¼Œåªæœ‰ä¸€å€‹ä¸»è¨å‚™ï¼ˆMaster),其余為從è¨å‚™ï¼ˆSalve),從è¨å‚™ä¹‹é–“ä¸èƒ½é€²è¡Œé€šä¿¡ï¼Œæ‰€ä»¥RS-422支æŒçš„æ˜¯é»žå°å¤šé»žçš„é›™å‘通信。
為擴展應用范åœï¼ŒRS于1983年在RS-422基礎上制定了RS-485æ¨™æº–ï¼Œå¢žåŠ äº†å¤šé»žã€é›™å‘通信能力,å³å…許多個發é€å™¨é€£æŽ¥åˆ°åŒä¸€æ¢ç¸½ç·šä¸Šï¼ŒåŒæ™‚å¢žåŠ äº†ç™¼é€å™¨çš„驅動能力和沖çªä¿è·ç‰¹æ€§ï¼Œæ“´å±•了總線共模范åœï¼ŒåŽå‘½å為TIA/RS-485-A標準。
由于RS-485是從RS-422基礎上發展而來的,所以RS-485許多電氣è¦å®šèˆ‡RS-422相仿,如都采用平衡傳輸方å¼ã€éƒ½éœ€è¦åœ¨å‚³è¼¸ç·šä¸ŠæŽ¥çµ‚æŽ¥é›»é˜»ã€æœ€å¤§å‚³è¼¸è·é›¢ç´„為1219ç±³ã€æœ€å¤§å‚³è¼¸é€ŸçŽ‡ç‚º10Mbpsç‰ã€‚但是,RS-485å¯ä»¥é‡‡ç”¨äºŒç·šèˆ‡å››ç·šæ–¹å¼ï¼Œé‡‡ç”¨äºŒç·šåˆ¶æ™‚å¯å¯¦ç¾çœŸæ£çš„多點雙å‘通信,而采用四線連接時,與RS-422一樣åªèƒ½å¯¦ç¾é»žå°å¤šé»žé€šä¿¡ï¼Œä½†å®ƒæ¯”RS-422有改進, 無論四線還是二線連接方å¼ç¸½ç·šä¸Šå¯æŽ¥å¤šé”32個è¨å‚™ã€‚
三è±çš„ Q00PLC 的通訊接å£ç‚ºRS232。
三 ä¸‰è± Q00PLC 的通訊方å¼
3.1 通訊å”è°
三è±çš„ Q00PLC 采用列 MELSEC 通訊å”è°ï¼Œå³ MC å”è°ã€‚MCå”è°é‡‡ç”¨å¹€çš„å½¢å¼é€²è¡Œé€šè¨Šï¼Œå®ƒåŒ…括以下幾種形å¼ï¼š
(1)ã€QnA 兼容3C 幀。æ¤ç¨®å¹€åŒ…括1-4ç¨®æ ¼å¼ã€‚
(2)ã€QnA 兼容4C 幀。æ¤ç¨®å¹€åŒ…括1-5ç¨®æ ¼å¼ã€‚
(3)ã€QnA 兼容2C 幀。æ¤ç¨®å¹€åŒ…括1-4ç¨®æ ¼å¼ã€‚
(4)ã€QnA 兼容3E 幀。æ¤ç¨®å¹€åŒ…括1-4ç¨®æ ¼å¼ã€‚
(5)ã€A 兼容1E 幀。
3.2 å¯¦ç¾æ–¹å¼
(1) 命令文件的發é€
采用MC å”è°é€²è¡Œçš„æ•¸æ“šé€šè¨Šé‡‡ç”¨åŠé›™å·¥é€šè¨Šæ–¹å¼é€²è¡Œã€‚訪å•PLC CPU 時å°äºŽå‰›å‰›é€²è¡Œçš„命令文件發é€è«‹åœ¨æŽ¥æ”¶PLC CPU å´ç™¼é€çš„響應文件åŽç™¼é€ä¸‹ä¸€å€‹å‘½ä»¤æ–‡ä»¶ï¼ˆåœ¨éŸ¿æ‡‰æ–‡ä»¶çš„æŽ¥å—尚未完æˆä¹‹å‰ä¸èƒ½é€²è¡Œä¸‹ä¸€å€‹å‘½ä»¤æ–‡ä»¶çš„發é€ï¼‰
[align=center]

圖2 å‘½ä»¤æ–‡ä»¶å’ŒéŸ¿æ‡‰çš„é †åº[/align]
(2) å°äºŽå‘½ä»¤æ–‡ä»¶ä¸èƒ½æŽ¥æ”¶æ£å¸¸çµæŸçš„響應文件時
接å—ç•°å¸¸çµæŸçš„éŸ¿æ‡‰æ–‡ä»¶æ™‚ï¼Œå¯æ ¹æ“šéŸ¿æ‡‰æ–‡ä»¶ä¸çš„出錯代碼進行處ç†
3.3 Q00PLC çš„å¹€æ ¼å¼
Q00PLC內置了MC通訊å”è°çš„QnA 兼容3C 幀和 RS232 通訊接å£ï¼Œæ‰€ä»¥ä¸ç”¨å¤–åŠ é€šè¨Šæ¨¡å¡Šå°±å¯ä»¥å¯¦ç¾èˆ‡ä¸Šä½æ©Ÿçš„通訊。本例擬采用QnA 兼容3C 幀的第4ç¨®æ ¼å¼é€²è¡Œé€šè¨Šã€‚
3.3.1 å°æ–¹è¨å‚™è®€å‡ºä¸Šä½ç«™PLC CPU 的數據時
a ä¸Šä½æ©Ÿå‘ PLC CPU å´å‚³è¼¸å‘½ä»¤å‚³è¼¸æ–‡ä»¶ï¼Œä¸‹åœ–ä¸ç®é 所指的å€åŸŸç‚ºè«‹æ±‚數據å€ã€‚
[align=center]

圖3 è®€å–æ™‚的發é€å¹€æ ¼å¼[/align]
b PLC CPU å´éŸ¿æ‡‰ä¸Šä½æ©Ÿçš„æ‡‰ç”傳輸文件,下圖ä¸ç®é 所指的å€åŸŸç‚ºå¾žPLCä¸è®€å‡ºå¹¶è¿”回的數據
[align=center]

圖4 è¿”å›žçš„å¹€æ ¼å¼[/align]
3.3.2 å°æ–¹è¨å‚™å‘上ä½ç«™PLC CPU 寫入數據時
a å¹€æ ¼å¼èˆ‡åœ–3ä¸çš„æ ¼å¼é¡žä¼¼ï¼Œåªæ˜¯å¹€ä¸çš„命令和åå‘½ä»¤ç‚ºè®€å–æ™‚的命令,請求數據å€ä¸å¢žåŠ äº†å¯«å…¥çš„æ•¸æ“šã€‚
b å¹€æ ¼å¼èˆ‡åœ–34ä¸çš„æ ¼å¼é¡žä¼¼ï¼Œåªæ˜¯æ²’有返回的數據。
å›› Windows環境下 VB 與 Q00PLC 通信的實ç¾
4.1 系統分æžèˆ‡èªªæ˜Ž
Windows系統為æ¯å€‹é€šä¿¡è¨å‚™é–‹è¾Ÿäº†ç”¨æˆ¶å®šç¾©çš„輸入/輸出緩沖å€ï¼Œæ•¸æ“šé€²å‡ºé€šä¿¡å£å‡ç”±ç³»çµ±åŽè‡ºä¾†å®Œæˆï¼Œæ‡‰ç”¨ç¨‹åºåªéœ€å®Œæˆå°è¼¸å…¥/è¼¸å‡ºç·©æ²–å€æ“作就å¯ä»¥äº†ã€‚實際éŽç¨‹æ˜¯æ¯æŽ¥æ”¶ä¸€å€‹å—ç¬¦å°±ç”¢ç”Ÿä¸€å€‹ä½Žç´šç¡¬ä»¶ä¸æ–·ï¼ŒWindows系統ä¸çš„串行驅動程åºå°±å–得了控制權,并將接收到的å—符放入緩沖å€ï¼Œç„¶åŽå°‡æŽ§åˆ¶æ¬Šè¿”還給æ£åœ¨é‹è¡Œçš„æ‡‰ç”¨ç¨‹åºã€‚å¦‚æžœè¼¸å…¥ç·©æ²–å€æ•¸æ“šå·²æ»¿ï¼Œä¸²è¡Œé©…動程åºç”¨ç•¶å‰å®šç¾©çš„æµæŽ§åˆ¶æ©Ÿåˆ¶é€šçŸ¥ç™¼é€æ–¹åœæ¢ç™¼é€æ•¸æ“šï¼Œè€ŒéšŠåˆ—ä¸çš„æ•¸æ“šæŒ‰å…ˆé€²å…ˆå‡º (FIFO)的次åºè™•ç†ã€‚
  在Windowsä¸ï¼Œä¸²è¡Œé€šä¿¡æœ‰å…©ç¨®å·¥ä½œæ–¹å¼ï¼šæŸ¥è©¢æ–¹å¼å’Œäº‹ä»¶é©…å‹•æ–¹å¼ã€‚查詢方å¼å 用大é‡çš„CPUæ™‚é–“ï¼Œæ•ˆçŽ‡è¼ƒä½Žï¼Œä½†æ˜¯æ•¸æ“šä¸æ˜“丟失;而Win32æ“作系統基于事件驅動 (也稱為消æ¯é©…å‹•ï¼‰æ©Ÿåˆ¶çš„å…§æ ¸ï¼Œæ”¯æŒåŸºäºŽé€²ç¨‹çš„å”åŒå¼å¤šä»»å‹™å’ŒåŸºäºŽå¤šç·šç¨‹çš„æ¶å…ˆå¼å¤šä»»å‹™ã€‚基于事件驅動的多線程應用程åºå¯¦éš›ä¸Šåœ¨å…¶å…§éƒ¨å¯¦ç¾äº†å¤šä»»å‹™æ“´å±•,為代碼賦予了并行執行的特性,å¯ä»¥ä½¿æ‡‰ç”¨ç¨‹åºå°CPU的利用率大大æé«˜ï¼Œå¾žè€Œæé«˜ç³»çµ±çš„éŸ¿æ‡‰èƒ½åŠ›ï¼ŒåŠ å¿«ä¿¡æ¯è™•ç†é€Ÿåº¦ï¼Œæé«˜é€šä¿¡ç¨‹åºçš„實時性和增大數據åžåé‡ã€‚
  基于以上分æžï¼Œä»¥äº‹ä»¶é©…å‹•æ–¹å¼å¯¦ç¾Windows下的串行通信更具優勢,它能完æˆè¼ƒå¤§æ•¸æ“šé‡çš„實時通信,大大æé«˜äº†é€šä¿¡çš„æ•ˆçŽ‡ï¼Œæ•…æœ¬ç¨‹åºé‡‡ç”¨æ¤ç¨®æ–¹å¼é€²è¡Œä¸²è¡Œé€šä¿¡ï¼Œè‡³äºŽé€šä¿¡çš„å¯é 性å¯ä»¥é€šéŽè»Ÿä»¶è¨è¨ˆä¾†ä¿è‰ã€‚
Windows平臺下利用VB實ç¾ä¸²å£é€šä¿¡ä¸»è¦æœ‰ä»¥ä¸‹å…©ç¨®æ–¹æ³•:
1)使用Windows API(Application Program Interface)函數。這種方法å¯ç·¨å¯«ç§»æ¤æ€§å¼·çš„通信程åºï¼Œä½†å¿…é ˆé¦–å…ˆç”¨Declareè²æ˜ŽVB䏿‰€è¦ç”¨çš„å‹•æ…‹éˆæŽ¥åº«DLL,這需è¦å°Windows API函數有深入的了解,編程較復雜。
2)使用Microsoftå…¬å¸æä¾›çš„Active X控件MSCommã€‚è©²é€šä¿¡æŽ§ä»¶é€šéŽæ”¹è®Šå°è±¡å±¬æ€§ï¼Œå‘å°è±¡ç™¼é€æ¶ˆæ¯åŠç‚ºå°è±¡äº‹ä»¶ç·¨å¯«éŸ¿æ‡‰ä»£ç¢¼ï¼Œå¯ä»¥æ–¹ä¾¿åœ°å®Œæˆç”¨æˆ¶æ‡‰ç”¨ç¨‹åºé–“的串行通信,既å¯å¯¦ç¾API函數的所有功能,åˆä½¿å¾—編程效率æé«˜ï¼Œæ‡‰ç”¨åŠŸèƒ½å¢žå¼·ï¼Œå¹¶ä¸”ç¨‹åºç°¡å–®æ˜Žäº†ã€‚
å°äºŽMSComm控件實ç¾ä¸²å£é€šä¿¡çš„æ“ä½œå¾ˆå¤šæ–‡ç»éƒ½æœ‰è«–述,該控件的主è¦å±¬æ€§å¯åƒè€ƒç›¸é—œæ–‡ç»ï¼Œåœ¨æ¤åƒ…列出常用的屬性和方法。需è¦å¼·èª¿çš„æ˜¯ï¼šåœ¨æ•¸æ“šç™¼é€èˆ‡æŽ¥æ”¶éŽç¨‹ä¸ï¼Œéƒ½è¦é€šéŽä¸€å€‹Variant類型變é‡ä½œç‚ºä¸ä»‹ã€‚ç™¼é€æ•¸æ“šæ™‚ï¼Œå¿…é ˆå…ˆå°‡è¦ç™¼é€çš„æ•¸æ“šè³¦çµ¦ä¸€å€‹Variant類型變é‡ï¼Œå†æŠŠè©²Variant變é‡è³¦å€¼çµ¦MSCommçš„Outputå±¬æ€§ï¼›åŒæ¨£æŽ¥å—數據時,也應先將MSCommçš„Input屬性賦值給Variant變é‡ï¼Œå¾…接收端收到åŽå¿…é ˆè½‰æ›æˆå…¶å®ƒé¡žåž‹ï¼ˆå¦‚å—符型ã€äºŒé€²åˆ¶åž‹ï¼‰çš„æ•¸æ“šæ‰èƒ½é€²è¡Œè™•ç†ã€‚本例采用MSComm控件來實ç¾ã€‚
下é¢ä»‹ç´¹MSCOMM控件的屬性:
CommPort:è¨å®šé€šä¿¡é€£æŽ¥ç«¯å£ä»£è™Ÿï¼Œç¨‹åºå¿…é ˆæŒ‡å®šæ‰€è¦ä½¿ç”¨çš„串行端å£è™Ÿï¼ŒWindows系統使用所è¨å®šçš„端å£èˆ‡å¤–界通信。
PortOpen:è¨å®šé€šä¿¡å£ç‹€æ…‹ï¼Œè‹¥ç‚ºçœŸï¼Œé€šä¿¡ç«¯å£æ‰“開,å¦å‰‡é—œé–‰ã€‚
Settings:è¨å®šé€šä¿¡å£åƒæ•¸ï¼Œå…¶æ ¼å¼æ˜¯"bbbb,p,d,s",其ä¸bbbb為通信速率(波特率),p為通信檢查方å¼ï¼ˆå¥‡å¶æ ¡é©—),dç‚ºæ•¸æ“šä½æ•¸ï¼Œsç‚ºåœæ¢ä½æ•¸ï¼Œå…¶è¨å®šæ‡‰èˆ‡PLCçš„è¨å®šä¸€è‡´ã€‚
Input:將尿–¹å‚³é€è‡³è¼¸å…¥ç·©æ²–å€çš„å—符讀入到程åºã€‚
Output:å°‡å—符寫入輸出緩沖å€ã€‚
InBufferCount:傳回接收緩沖å€ä¸çš„å—符數。
OutBufferCount:傳回輸出緩沖å€ä¸çš„å—符數。
InputLen:è¨å®šä¸²è¡Œç«¯å£è®€å…¥å—符串的長度。
InputMode:è¨å®šæŽ¥æ”¶æ•¸æ“šçš„æ–¹å¼ã€‚
Rthreshold:è¨å®šå¼•發接收事件的å—符數。
CommEvent:傳回OnComm事件發生時的數值碼
OnComm事件:無論是錯誤或事件發生,都會觸發æ¤äº‹ä»¶ã€‚
4.2 具體實ç¾
本例程åºç‚ºè®€å–Q00PLC的輸入輸出點的狀態。監控界é¢å¦‚下所示:
[align=center]

圖5 監控界é¢[/align]
4.2.1 æŽ§ä»¶åƒæ•¸çš„åˆå§‹åŒ–
MSComm1.InBufferCount = 0 ‘清空輸入緩沖å€
MSComm1.OutBufferCount = 0 ‘清空輸出緩沖å€
MSComm1.CommPort = 1 ‘è¨å®šä¸²è¡Œé€šä¿¡å£ç‚ºcom1
MSComm1.Settings = "19200,O,8,1" ‘波特率19200ï¼Œå¥‡æ ¡é©—ï¼Œ8使•¸æ“šä½ï¼Œ1ä½åœæ¢ä½
MSComm1.InputLen = 0 ‘一次讀入輸入緩沖å€ä¸çš„å—符串的長度為緩沖å€ä¸çš„æ‰€æœ‰æ•¸æ“š
MSComm1.RThreshold = 62 ‘輸入緩沖å€ä¸æ¯æ¬¡æŽ¥åˆ°62個å—符就產生一次OnComm事件
MSComm1.PortOpen = True ‘打開端å£
Dim STX As String ‘以下為MCå”è°ä¸çš„ASCII碼
Dim ENQ As String
Dim ACK As String
Dim CR As String
Dim LF As String
Dim NAK As String
STX = Chr$(&H2)
ENQ = Chr$(&H5)
ACK = Chr$(&H6)
CR = Chr$(&HD)
LF = Chr$(&HA)
4.2.2 計算機與PLC通信程åº
Private Sub Timer1_Timer()
Dim SD As String
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
If F = 1 Then
SD = ENQ + "F9" + "0000FF00" + "0401" + "0001" + "X*" + "000020"
+ "0030" + CR + LF
Else
SD = ENQ + "F9" + "0000FF00" + "0401" + "0001" + "Y*" + "000050"
+ "0030" + CR + LF
End If
MSComm1.Output = SD
Timer1.Enabled = False
End Sub
‘OnComm事件
Private Sub MSComm1_OnComm()
Dim i, j As Integer
Dim RD, Temp, RDw As String
If MSComm1.CommEvent = comEvReceive Then
RD = MSComm1.Input
If Left(RD, 1) = STX Then
RDw = Mid(RD, 12, 48)
j = 0
Select Case F
Case 1
j = 48
Case -1
j = 96
End Select
For i = 1 To 48
Temp = Mid(RDw, i, 1)
If F = 1 Then
If Temp = "1" Then
Lalel(i - 1).BackColor = &H80FF80
Else
If i <= 3 Then
Lalel(i - 1).BackColor = &HFF
Else
Lalel(i - 1).BackColor = &HFFFF00
End If
End If
Else
If Temp = "1" Then
If i = 42 Then
Lalel(i - 1 + 48).BackColor = &HFF
Else
Lalel(i - 1 + 48).BackColor = &H80FF80
End If
Else
Lalel(i - 1 + 48).BackColor = &HFFFF00
End If
End If
Next i
F = F * (-1)
Timer1.Enabled = True
‘F = F * (-1)
End If
End If
End Sub
五 çµæŸèªž
VB是一種æˆç†Ÿçš„ã€é¢å‘å°è±¡çš„程åºè¨è¨ˆèªžè¨€ï¼Œé‡‡ç”¨å®ƒç·¨å¯«çš„Windows環境下PC機與Q00PLC的串行通訊軟件具有程åºå¯¦ç¾ç°¡ä¾¿ã€é€šç”¨æ€§å¼·çš„特點,減輕了軟件開發者的工作é‡ï¼Œå°äºŽåœ‹å…§çš„ä¸ã€å°åž‹ä¼æ¥å…·æœ‰ç¾å¯¦æ„義。
åƒè€ƒæ–‡ç»
[1] 王棟,Visual Basic6.0程åºè¨è¨ˆå¯¦ç”¨æ•™ç¨‹[M],清è¯å¤§å¸å‡ºç‰ˆç¤¾ï¼Œ2003
[2] å·¥æ¥æŽ¥å£èˆ‡é€šè¨Šï¼Œå‘‚å¿—è—,2003
[3] Q 系列 MELSEC 通訊å”è°åƒè€ƒæ‰‹å†Š
[4] ä¸‰è± Q 系列å¯ç·¨ç¨‹æŽ§åˆ¶å™¨ç·¨ç¨‹æ‰‹å†Š;
作者簡介:
馬磊:1981å¹´10月12日出生;性別:女;ç±è²«ï¼šå±±æ±çœé橋鎮å—鄿‘ï¼›åœ¨è®€ç ”ç©¶ç”Ÿï¼›ç ”ç©¶æ–¹å‘ï¼šé€ ç´™è£å‚™èˆ‡æŽ§åˆ¶ã€‚
呂多勇:1982å¹´6月出生;男;ç±è²«:å±±æ±çœæ¿Ÿå—市æ·åŸŽå€ï¼›æœ¬ç§‘,å¸å£«å¸ä½ï¼›
è¯ç³»æ–¹å¼ï¼šé€šè¨Šåœ°å€ï¼šå±±æ±çœæ¿Ÿå—市 大å¸ç§‘技園 å±±æ±è¼•å·¥æ¥å¸é™¢ 輕化與環境工程å¸é™¢ï¼Œ06ç´šç ”ç©¶ç”Ÿï¼Œé¦¬ç£Šã€‚ 郵編:250353 郵箱:aima2005@126.com