線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3851
推到 Plurk!
推到 Facebook!

基於DELPHI實現PC機與PLC的串行通訊

 
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-22 20:54:50 IP:61.64.xxx.xxx 未訂閱
http://www.ca800.com/maga/make/plc/detail.asp?id=640
基於DELPHI實現PC機與PLC的串行通訊
摘 要(Abstract)    本文以KOYO的SU-6系列PLC為例,介紹了用DELPHI實現PC
與PLC串列通訊的全過程,內容包括串列線的製作、通訊模組參數設定、CCM通訊
協定、從PLC讀取資料的程式編寫。
Take the example of the SU-6 type PLC of KOYO, the text introduce 
the whole procedure about serial communication with DELPHI 
programming language, include how to make the serial communication 
connector. positing the parameter of communicating module. The CCM 
communicating protocol and the programmed list how to read data from 
PLC to PC.
關鍵字(Keywords)    監控系統   串列通訊   CCM協定   VB構件   資料讀寫
Monitor control system      Serial communication       The CCM 
communicating protocol      VB structural unit        1  引言
    DELPHI因為它的編程相對較簡單、功能又很強大,應用程式開發週期較短、
運行速度快等特點,目前被廣泛應用於監控系統中,而在監控系統中,上位機與
各控制設備及智慧型儀器表(如:PLC、電力測試儀、溫度巡檢儀、數位電度錶等)
的串列通訊又是一個非常重要的環節。在Windows環境下用Delphi實現串列通信
有3種方法:
(1) 使用VB的通信構件MSComm;
(2) 調用Windows95下的API函數來完成通信;
(3) 熟悉C/C  或其他語言的用戶可以將自己的程式編譯鏈結為DLL(動態連結程式庫),這樣Delphi就可以調用DLL裏的函數來通信。
其中最容易方法是用VB的通信構件MSComm進行編程。    在使用VB構件之前,首先要將VB構件檔MSComm32.OCX安裝到Delphi的動態構件庫中。
打開主功能表Component選擇Import ActiveX Control...項,在彈出的對話方塊
裏選中Microsoft Comm Control6.0(安裝VB6.0後必有此項),再單擊Install按
鈕。此時Delphi載入VB構件檔並重新編譯DCL(Delphi Component Library)。編
譯完成後,MSComm的小按鈕出現在ActiveX 頁中,這時程式就可以使用此構件
了。應該注意的是,安裝前要確保VB通信構件的控制檔MSComm32.OCX在編譯DCL
之前已在\Windows\System下。下面就以KOYO的SU-6系列PLC為例,全面介紹用
DELPHI實現與PLC串列通訊的整個過程。    2  三線制串列通訊線的製作                                   
    上位機(PC機)的通訊一般採用9針串口,SU-6系列PLC選用通訊模組U-01DM,該模組的通訊用串列插座為25針,
內含一個RS-232C介面和一個RS422介面,這裏由於上位機與PLC在同一盤櫃內,
所以直接採用 RS-232C進行通訊(最大傳輸距離
為15m),三線制連接方式如圖1所示。    3  U-01DM通訊模組的參數設定
通訊模組參數的設定方法請參見相應模組的說明書,本次通訊的參數設置如下:
 
圖1      三線制串列通訊接線方式
(1) 自局號碼用十六進位表示為01;
(2) 串列傳輸速率設定為19200bps;
(3) 無奇偶校驗;
(4) 自我診斷方式;
(5) 應答延時時間為0S;
(6) 採用主-子局通訊方式;
(7) 本機為子局(上位機一般默認為主局);
(8) 有通訊超時的通常動作方式;
(9) 採用ASC碼通訊方式。                        
4  程式創建
    如圖2所示,新建一個工程,將Form1的Caption屬性改為“從子局到主局的
資料傳送”,放入兩個Label控制項,將其Caption屬性分別改為:“請輸入讀出
位址”,“資料傳送量”,放入兩個Edit控制項,將Edit1的Text屬性改為
0101,將Edit2的Text屬性改為000C(注意大小寫),意思是從PLC的0101位址開始
讀取12個數,再放入一個Memo控制項用於顯示接收到的資料、一個Timer控制
項、一個Mscomm控制項。Mscomm控制項是一個VB構件,經過引言所述的安裝之後
將顯示在ActiveX中。     
圖2      從子局到主局的資料傳送介面
5  應用CCM通訊協定進行通訊
    CCM通訊協定包括從子局到主局的資料傳送,和從主局到子局的資料傳送兩
大部分。在實際應用中,前者是為了將PLC中資料送到上位機中,實現資料的顯
示功能,後者主要是為了通過上位機向PLC發送命令,實現對PLC及相關設備的控
制。圖3是從子局到主局的資料傳送框圖,(詳細說明參見程式清單或CCM2通訊協
定說明書。從主局到子局的資料傳送框圖略。)在用CCM通訊協定進行通訊時,只
需在上位機上編制程式,PLC的應答是自動完成的,所以對於PLC來說,用戶只需
完成對通訊模組的參數設置並保證與上位機的設置相對應即可。     
圖3     子局到主局的資料傳送框圖    6  程式清單及詳細說明
    (本程式只演示了從子局到主局的資料傳送方法,從主局到子局的資料傳送
方法與之類似)
var                    //總體變數說明
  Form1: TForm1;
  a,b,c,d:string;
  lrc,n:integer;
  x,y,z:array[1..4] of integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);    //串口初始化
begin
MSComm1.CommPort:=1;{使用COM1口為通信口}
MSComm1.InBufferSize:=1024;{設定接收佇列長度為1KB}
MSComm1.OutBufferSize:=1024;{設定發送佇列長度為1KB}
MSComm1.Settings:='19200,n,8,1';{串列傳輸速率19200bps,無校驗,8個資料位元,1個停止位}
MSComm1.InputLen:=0;{讀取整個接收緩衝區內容}
MSComm1.InBufferCount:=0;{清除接收緩衝區}
form1.MSComm1.PortOpen:=true; {打開串口}
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
m:integer;
begin
b:=form1.MSComm1.Input;      //通過讀取緩衝
//區中的內容清空緩衝區
//以下將輸入的字元轉換成ASC碼的序號
for m:=1 to 4 do begin
if copy(form1.Edit1.Text,m,1)='0' then x[m]:=48;
if copy(form1.Edit1.Text,m,1)='1' then x[m]:=49;
……
if copy(form1.Edit1.Text,m,1)='9' then x[m]:=57;
if copy(form1.Edit1.Text,m,1)='A' then x[m]:=65;
if copy(form1.Edit1.Text,m,1)='B' then x[m]:=66;
……
if copy(form1.Edit1.Text,m,1)='F' then x[m]:=70;
end;
for m:=1 to 4 do begin
if copy(form1.Edit2.Text,m,1)='0' then y[m]:=48;
……
if copy(form1.Edit2.Text,m,1)='F' then y[m]:=70;
end;
//以下將用字元表示的十六進位數轉換成相應的十進
//制數值
for m:=1 to 4 do begin
if copy(form1.Edit2.Text,m,1)='0' then z[m]:=0;
if copy(form1.Edit2.Text,m,1)='1' then z[m]:=1;
……
if copy(form1.Edit2.Text,m,1)='9' then z[m]:=9;
if copy(form1.Edit2.Text,m,1)='A' then z[m]:=10;
if copy(form1.Edit2.Text,m,1)='B' then z[m]:=11;
……
if copy(form1.Edit2.Text,m,1)='F' then z[m]:=15;
end;
a:='N' chr(33) chr(5);
//呼叫代碼:設子局號為1,則修正子局號為32 1,
//若子局號為2,則修正子局號為32 2,依此類推
c:=chr(1) chr(48) chr(49) chr(48) chr(50) form1.Edit1.Text form1.Edit2.Text chr(48) chr(49) chr(23);
//首標代碼:chr(1)為SOH、chr(48) chr(49)為子局
//號01、chr(48)為讀出標誌30H、chr(50)輸入寄
//存器的功能碼32H、form1.Edit1.Text為地址
//碼、form1.Edit2.Text為4位元組ASC碼表示的傳
//輸數據量、chr(48) chr(49)為自局號01、chr(23)
//為表示傳送結束ETB
lrc:=48 xor 49 xor 48 xor 50 xor x[1] xor x[2]
 xor x[3] xor x[4] xor y[1] xor y[2] xor y[3] xor y[4] xor 48 xor 49;
//lrc表示各字元的序號的異或和:整數
c:=c chr((lrc div 16) 48) chr((lrc mod 16) 48);
 //chr((lrc div 16) 48) chr((lrc mod 16)表示為校
//驗碼,即首標中的LRC
form1.MSComm1.RThreshold:=4;    
//設緩衝區中的字元數為4時,觸發oncomm事件,
//因為子局的應答是4個字元
form1.MSComm1.Output:=a;     //開始呼叫
end;
procedure TForm1.MSComm1Comm(Sender: TObject);
begin
case Mscomm1.CommEvent of comevreceive:        
//當接收事件發生時進行下列操作
  begin
    b:=form1.MSComm1.Input;  //讀取緩衝區中
//的內容
//以下表示:如果子局的應答正常,則輸出首標,並
//設緩衝區中的字元數為:7 資料傳送量
    if b='N' CHR(33) CHR(6) CHR(13) THEN
      begin
        form1.MSComm1.Output:=c;
        form1.MSComm1.RThreshold:=7 z[1]*4096 z[2]*256 z[3]*16 z[4];
      end;
//如果接收到SOH字元,則讀取有效字元,並顯
//示在form1.Memo1中,發應答信號:ACK
    if copy(b,3,1)=chr(2) then
      begin
        form1.Memo1.Text:=form1.Memo1.Text copy(b,4,(z[1]*4096 z[2]*256 z[3]*16 z[4])) ' ';
        form1.MSComm1.Output:=chr(6);
        form1.MSComm1.RThreshold:=2;
      end;
//若對方發通訊結束信號EOF CR,則我方發結束
//信號EOT
    if b=chr(4) chr(13) then
      begin
        form1.MSComm1.Output:=chr(4);
        form1.MSComm1.RThreshold:=4;
      end;
  end;
end;
end;
end.
//注:本程式假定通訊資料不大於128個字元,若
//大於128個字元則程式應做適當改動。
7  結束語
    本程式在WindowsXP環境下用Delphi7.0調試通過,VB用的是6.0版本,接收
到的是一組用字元表示的十六進位數,這些數與PLC的各模組的狀態有著一一對
應的關係。讀者還需對接收到的資料進行必要的處理和轉換以便直觀的顯示相應
的開關量、類比量等資訊。因本程式的重點在如何通訊上,所以忽略了很多與實
際應用有關的細節,如:對輸入文本的條件限制、對從PLC採集到的資料進行LRC
(縱向校驗)確保資料傳輸的準確性、程式出錯處理等。    參考文獻
[1] 邵 時. 微機介面技術[M]. 北京:清華大學出版社,2000.
[2] 仵 浩,齊燕傑,宋文超等. Visual Basic串列通信工程開發實例導航[M]. 北京:人民郵電出版社,2003.
[3] 鄭啟華. PASCAL程式設計教程[M]. 北京:清華大學出版社,2000.
作者簡介
陳 剛(1971-)  男 工程師  主要從事機電設備的檢修及管理,電腦監控系統程式設計。
 
發表人 - conundrum 於 2004/05/22 21:03:23
系統時間:2024-04-26 12:11:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!