久久久久久久麻豆,中日韩av在线,麻豆av在线免费,中文字幕二区三区,欧美日韩视频一区二区,亚洲欧美日韩在线一区,国产无毒不卡

在Windows下用Delphi開發(fā)微機與PLC的串行通信程序


  摘 要:在Windows95下利用Delphi實現(xiàn)微機與PLC的串行通信的 幾種方法。
  關鍵詞:串行通信 Delphi 動態(tài)鏈接庫DLL 構件 句柄 設備控制 塊DCB 可編程控制器 PLC

  在自動測量和控制系統(tǒng)中,常常需要在上位機(微機)和PLC(可編程控制器) 之間進行數(shù)據(jù)交 換和發(fā)送控制信號,串行通信是其主要手段,我們在開發(fā)一套自動測試系統(tǒng)時就是采用串行 通信的方法,即由上位機向PLC發(fā)送命令,控制其進行各種測試線路的切換。

1 通信協(xié)議
  在本系統(tǒng)中微機和PLC采用一對一通信連接,上位機作主局,PLC作子局。通信開始時由上位 機向PLC發(fā)出呼叫,PLC收到上位機的呼叫后應答,并返回應答信號,然后上位機發(fā)首標,PL C應答,接著上位機發(fā)數(shù)據(jù)塊,PLC應答,數(shù)據(jù)全部發(fā)完后上位機發(fā)一結束標志,至此上位機 與PLC的通信結束。
  上述通信協(xié)議可用圖1描述

按此在新窗口瀏覽圖片


該協(xié)議使用的傳輸控制字符有:
  ENQ(查詢):在需要通信時作為發(fā)送方的請求。
  ACK(認可):接收方給發(fā)送方的應答,表示正確接收信息包。
  SOH(首標):表示要傳送的是首標。
  ETB(數(shù)據(jù)結束):標志數(shù)據(jù)塊的結束。
  STX(文本開始):標志數(shù)據(jù)塊的開始。
  ETX(文本結束):標志文本塊的結束。
  EOT(結束):表示傳送結束。
  LRC:縱向冗余校驗碼,即對前面所有的傳輸碼進行異或計算。

2 Windows95下用Delphi實現(xiàn)串行通信
  在Windows95環(huán)境下用Delphi3.0實現(xiàn)串行通信有3種方法:①使用VB的通信構件MSComm ;② 調用Windows95下的API函數(shù)來完成通信;③熟悉C/C++或其它語言的用戶可以將自己的程序 編譯鏈接為DLL(動態(tài)鏈接庫),這樣Delphi就可以調用DLL里的函數(shù)來通信。下面就這3種方 法分別加以討論。
2.1 使用VB通信構件
  在使用VB構件之前,首先要將VB構件文件MSComm32.OCX安裝到Delphi的動態(tài)構件庫中。打開 主菜單Component選擇Import ActiveX Control...項,在彈出的對話框里選中Microsoft Co mm Control5.0(安裝VB5.0后必有此項),再單擊Install按鈕。此時Delphi載入VB構件文件并重新編譯DCL(Delphi Component Library)。編譯完成后,MSComm的小按鈕出現(xiàn)在ActiveX 頁中,這時程序就可以使用此 構件了。應該注意的是,安裝前要確保VB通信構件的控制文件MSComm32.OCX(在VB4.0以上版 本中)在編譯DCL之前已在\Windows\System下。接著向窗體中 添加1個MSComm構件并進行串行口的初始化,初始化子例程序如下:

Procedure TForm1.FormCreate(Sender:TObject);
begin
MSComm1.CommPort:=2; 
MSComm1.InBufferSize:=1024; 
MSComm1.OutBufferSize:=1024; 
MSComm1.Settings:=‘9600,N,8,1'';{波特率9600b/s,無校驗,8個數(shù)據(jù)位,1 個停止位}
MSComm1.InputLen:=0; 
MSComm1.InputBufferCount:=0; 
MSComm1.PortOpen=:True; 
End;
  用Input屬性從接收對列讀入字符串:ReadBuffer:=MSComm1.Input;用Output屬性發(fā)送字 符串:MSComm1.Output:=WriteBuffer;然后根據(jù)上述通信協(xié)議,即可快速編制出通信軟件
2.2 調用Windows95下的API函數(shù)
  Windows95對通信功能的支持非常強,它增加了一系列用于通信的API函數(shù)供用戶調用。同樣 ,要進行串行通信,也需要先對串口進行初始化。Windows95把串行口作為設備文件,對串 口操作就是對文件操作。因此,必須先為串口分配1個文件句柄,以后對串口操作都將通過 這個文件句柄來完成。初始化過程如下:
  (1)調用CreateFile函數(shù)為串口分配1個文件句柄。
  Var HComm:THandle;
  HComm:=CreateFile(‘COM2'',GENERICREAD or GENERICWRITE ,0,@NULL,OPENEXISTING,F(xiàn)ILEFLAGOVERLAPPED,0);
  如果對串行口1操作,用字符串COM1代替COM2即可。
  (2)調用SetupComm函數(shù)設置串行口的輸入和輸出緩存區(qū)。
  SetupComm(HComm,1024,1024);
  (3)填充1個DCB(設備控制塊)結構來設置通信參數(shù)。通過調用GetCommState函數(shù) 獲得當前系統(tǒng)的DCB結構,按需要賦值給DCB的成員,如波特率、奇偶校驗、數(shù)據(jù)位、停止位 等,最后將創(chuàng)建后的DCB結構作為參數(shù)傳給SetCommState函數(shù)就可以初始化串口了。

  Var DCB:TDCB;
  GetCommState(HComm,DCB);
  BuildCommDCB(‘9600,N,8,1'',DCB);
  SetCommState(HComm,DCB);
  (4)用PurgeComm函數(shù)來清除接收緩存區(qū)的內容。
  PurgeComm(HComm,PurgeRXCLEAR);

  (5)串行口的初始化完成后,接下來的工作就是根據(jù)通信協(xié)議發(fā)送和接收串行口上的數(shù)據(jù)。R eadFile函數(shù)用于接收數(shù)據(jù),WriteFile函數(shù)用于發(fā)送數(shù)據(jù)。

  Var
  OverLapped:TOverLapped;
  DataIn:Byte;
  DataOut:Byte;
  BufferSize:Integer;
  COMSTAT cs;
  ReadFile(HComm,DataIn,cs.cbInQue,BufferSize,@OverLapped);
   
  WriteFile(HComm,DataOut,cs.cbOutQue,BufferSize,@OverLapped);
   
  按照上述步驟,再根據(jù)前面的通信協(xié)議,即可完成串行通信。
2.3 調用其它語言編寫的DLL
  由于這里所說的其它語言包含面很廣,可以是開發(fā)人員所熟悉的編程語言(只要其支持DLL即 可),如C和C++等,所以如何編寫DLL就不再詳述了。將編寫好的DLL進行編譯,然后把編譯 通過后的DLL放在\Windows\System子目錄下,在Delphi下打開1個單元文件,將DLL里的所 有函數(shù)在單元文件中聲明,格式如下:

  unit UnitName;
  interface
  procedure p1(param1:type1;param2:type2;...);stdcall;
  external‘DLLName'';
  …
  implementation
  end

  其中UnitName為單元文件名,p1為調用過程名,param1、param2為參數(shù)名,type1、type2為 參數(shù)類型名,DLLName為DLL名。串行通信時,只要將此單元包含進編程單元就行了。

3 結 論
  對使用Delphi開發(fā)Windows95下與PLC進行串行通信程序的3種方法進行比較可以得出這樣的 結論:
  (1)使用VB通信構件不但能夠實現(xiàn)API的所有功能,而且程序簡單明了。
  (2)調用Windows95的API通信函數(shù),可以設計和開發(fā)出各種通信軟件,但編程復雜。
  (3)第3種方法適合那些熟悉其它編程語言的開發(fā)人員。
  以上所有程序均在Windows95中文版下使用Delphi3.0調試通過。

COPYRIGHT(C) 2011 廈門永宏亞得機電科技有限公司版權所有(閩ICP備05025945號) ALL RIGHTS RESERVED?

電話: 0592-5190891 傳真: 0592-5190720 E-Mail: E-mail:yade8895@163.com
地址: 廈門市海滄區(qū)興港六里17號2607室 郵編:361009 聯(lián)系人:翟先生