全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2202
推到 Plurk!
推到 Facebook!

在Windows95下用Delphi開發微機與PLC的串列通信程式

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-02-20 16:16:01 IP:61.221.xxx.xxx 未訂閱
此為轉貼資料 在Windows95下用Delphi開發微機與PLC的串列通信程式 魯昌華 徐 穩 摘 要:在Windows95下利用Delphi實現微機與PLC的串列通信的 幾種方法。 關鍵字:串列通信 Delphi 動態連結程式庫DLL 構件 控制碼 設備控制 塊DCB 可編程控制器 PLC 在自動測量和控制系統中,常常需要在上位機(微機)和PLC(可編程控制器) 之間進行資料交 換和發送控制信號,串列通信是其主要手段,我們在開發一套自動測試系統時就是採用串列 通信的方法,即由上位機向PLC發送命令,控制其進行各種測試線路的切換。 1 通信協定 在本系統中微機和PLC採用一對一通信連接,上位機作主局,PLC作子局。通信開始時由上位 機向PLC發出呼叫,PLC收到上位機的呼叫後應答,並返回應答信號,然後上位機發首標,PL C應答,接著上位機發資料塊,PLC應答,資料全部發完後上位機發一結束標誌,至此上位機 與PLC的通信結束。 上述通信協定可用圖1描述。 該協定使用的傳輸控制字元有: ENQ(查詢):在需要通信時作?發送方的請求。 ACK(認可):接收方給發送方的應答,表示正確接收資訊包。 SOH(首標):表示要傳送的是首標。 ETB(資料結束):標誌資料塊的結束。 STX(文本開始):標誌資料塊的開始。 ETX(文本結束):標誌文本塊的結束。 EOT(結束):表示傳送結束。 LRC:縱向冗餘校驗碼,即對前面所有的傳輸碼進行異或計算。 2 Windows95下用Delphi實現串列通信 在Windows95環境下用Delphi3.0實現串列通信有3種方法:?使用VB的通信構件MSComm ;? 調用Windows95下的API函數來完成通信;?熟悉C/C 或其他語言的用戶可以將自己的程式 編譯鏈結?DLL(動態連結程式庫),這樣Delphi就可以調用DLL裏的函數來通信。下面就這3種方 法分別加以討論。 2.1 使用VB通信構件 在使用VB構件之前,首先要將VB構件文件MSComm32.OCX安裝到Delphi的動態構件庫中。打開 主功能表Component選擇Import ActiveX Control...項,在彈出的對話方塊裏選中Microsoft Co mm Control5.0(安裝VB5.0後必有此項),再單擊Install按鈕。此時Delphi載入VB構件文件並重新編譯DCL(Delphi Component Library)。編譯完成後,MSComm的小按鈕出現在ActiveX 頁中,這時程式就可以使用此 構件了。應該注意的是,安裝前要確保VB通信構件的控制文件MSComm32.OCX(在VB4.0以上版 本中)在編譯DCL之前已在\Windows\System下。接著向表單中 添加1個MSComm構件並進行串列口的初始化,初始化子例程式如下: Procedure TForm1.FormCreate(Sender:TObject); begin MSComm1.CommPort:=2; {使用COM2口?通信口} MSComm1.InBufferSize:=1024; {設定接收佇列長度? 1KB} MSComm1.OutBufferSize:=1024; {設定發送佇列長度? 1KB} MSComm1.Settings:=‘9600,N,8,1';{串列傳輸速率9600b/s,無校驗,8個資料位元,1 個停止位} MSComm1.InputLen:=0; {讀取整個接收緩衝區內容} MSComm1.InputBufferCount:=0; {清除接收緩衝區} MSComm1.PortOpen=:True; {打開串列口} End; 用Input屬性從接收對列讀入字串:ReadBuffer:=MSComm1.Input;用Output屬性發送字 符串:MSComm1.Output:=WriteBuffer;然後根據上述通信協定,即可快速編制出通信軟體 。 2.2 調用Windows95下的API函數 Windows95對通信功能的支援非常強,它增加了一系列用於通信的API函數供用戶調用。同樣 ,要進行串列通信,也需要先對串口進行初始化。Windows95把串列口作?設備文件,對串 口操作就是對文件操作。因此,必須先?串口分配1個文件控制碼,以後對串口操作都將通過 這個文件控制碼來完成。初始化過程如下: (1)調用CreateFile函數?串口分配1個文件控制碼。 Var HComm:THandle; HComm:=CreateFile(‘COM2',GENERICREAD or GENERICWRITE ,0,@NULL,OPENEXISTING,FILEFLAGOVERLAPPED,0); 如果對串列口1操作,用字串COM1代替COM2即可。 (2)調用SetupComm函數設置串列口的輸入和輸出緩存區。 SetupComm(HComm,1024,1024); (3)填充1個DCB(設備控制塊)結構來設置通信參數。通過調用GetCommState函數 獲得當前系統的DCB結構,按需要賦值給DCB的成員,如串列傳輸速率、奇偶校驗、資料位元、停止位元 等,最後將創建後的DCB結構作?參數傳給SetCommState函數就可以初始化串口了。 Var DCB:TDCB; GetCommState(HComm,DCB); BuildCommDCB(‘9600,N,8,1',DCB); SetCommState(HComm,DCB); (4)用PurgeComm函數來清除接收緩存區的內容。 PurgeComm(HComm,PurgeRXCLEAR); (5)串列口的初始化完成後,接下來的工作就是根據通信協定發送和接收串列口上的資料。R eadFile函數用於接收資料,WriteFile函數用於發送資料。 Var OverLapped:TOverLapped; DataIn:Byte; DataOut:Byte; BufferSize:Integer; COMSTAT cs; ReadFile(HComm,DataIn,cs.cbInQue,BufferSize,@OverLapped); {從串列口讀輸入緩存的位元組,存入DataIn變數中} WriteFile(HComm,DataOut,cs.cbOutQue,BufferSize,@OverLapped); {向串列口寫輸出緩存的位元組,要寫的資料存放在DataOut} 按照上述步驟,再根據前面的通信協定,即可完成串列通信。 2.3 調用其他語言編寫的DLL 由於這裏所說的其他語言包含面很廣,可以是開發人員所熟悉的編程語言(只要其支援DLL即 可),如C和C 等,所以如何編寫DLL就不再詳述了。將編寫好的DLL進行編譯,然後把編譯 通過後的DLL放在\Windows\System子目錄下,在Delphi下打開1個單元文件,將DLL裏的所 有函數在單元文件中聲明,格式如下: unit UnitName; interface procedure p1(param1:type1;param2:type2;...);stdcall; external‘DLLName'; … implementation end 其中UnitName?單元檔案名,p1?調用過程名,param1、param2?參數名,type1、type2? 參數類型名,DLLName?DLL名。串列通信時,只要將此單元包含進編程單元就行了。 3 結 論 對使用Delphi開發Windows95下與PLC進行串列通信程式的3種方法進行比較可以得出這樣的 結論: (1)使用VB通信構件不但能夠實現API的所有功能,而且程式簡單明瞭。 (2)調用Windows95的API通信函數,可以設計和開發出各種通信軟體,但編程複雜。 (3)第3種方法適合那些熟悉其他編程語言的開發人員。 以上所有程式均在Windows95中文版下使用Delphi3.0調試通過。 作者單位:合肥工業大學電腦系(230061) 參考文獻 1 李漢濤,楊長春.Windows下三線制串列通信的實現方法.電腦技 術,1998;(7) 2 王仲文譯.精通串列通信.北京:電子工業出版社 ********************************************************* 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together! 希望能大家敞開心胸,將知識寶庫結合一起 發表人 - jackkcg 於 2003/02/20 16:17:21
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-04-20 5:20:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!