1 引言
可編程控制器PLC是以微處理器為核心,綜合計算機技術、自動控制技術和通信技術發展起來的一種通用工業自動控制裝置,它具有可靠性高、體積小、功能強、程序設計簡單、靈活通用、維護方便以及抗干擾能力強等優點,因而廣泛應用于電力、冶金、能源、化工、交通等領域,但是大多數中小型PLC的顯示功能較差,人機交互操作不便,管理人員不能及時了解現場情況,尤其是在現場調試中,為彌補PLC在這些方面的不足,在實際控制系統中,通常采用PLC作為下位機實現對生產過程的控制,以計算機作為上位機實現工藝流程參數顯示、控制參數設置等功能,使PLC和計算機相互結合,充分發揮PLC在開關量、模擬量控制和計算機在管理、監控等方面的優勢,以實現優勢互補,極大提高控制系統的性價比。
實現計算機和PLC控制系統的關鍵是兩者之間的通信,一般情況下,用戶可以采用現有的組態軟件實現監控,但該方法成本較高,為此本文介紹了在Visual Basic 6.0的環境下,實現計算機與三菱FX系列PLC的串行通信方法。
2 PLC與計算機的通信端口連接
FX系列PLC的編程接口采用RS-422標準,而計算機的串行口采用RS-232C標準,因此采用接口模塊FX-232AW將RS-422標準轉換為RS-232C標準。如圖1所示,計算機、PLC與FX-232AW之間采用反饋與交叉相結合的連接圖。
圖1 FX-232AW接口引線連接圖
?引腳2、3:將引腳2、3交叉互連,使PLC與上位機之間能發送和接收數據。
?引腳4、5:將引腳4、5反饋短接,對計算機發送數據來說,PLC總是處于數據準備就緒狀態,計算機在任何時候都可以將數據送到PLC中。
?引腳6、20:將引腳6、20交叉互連,對計算機來說就必須檢測PLC是否處于準備就緒狀態,即檢測引腳6是否為高電平。當引腳6為高電平時,表示PLC準備就緒,可以接收數據,這時計算機就可以向PLC發送數據了;反之,當引腳6為低電平時,PLC與計算機則不能通信。
3 計算機與PLC之間的通信協議
FX系列PLC與計算機的通信模式有兩種:
? PLC與計算機采用專有協議(dedicated protocol)通信,這種方式無須編寫梯形圖,計算機直接讀寫PLC;
?PLC與計算機無協議通信,這種方式需要編寫梯形圖,并使用串行數據傳送指令RS。這里介紹專有通信協議。
FX系列PLC與計算機專有通信協議提供有數據讀取、控制命令寫入、控制PLC啟/停和網絡測試等功能,該協議有兩種格式:format1和format4。兩種協議的區別在于字符串中是否添加CR/LF碼,采用哪種格式的協議由PLC中的特殊數據寄存器D8120決定,計算機向PLC傳送的字符串格式如圖2所示,在該字符串中,可由D8120來決定是否添加和校驗碼,此外format4需要在字符串末尾添加CR/LF。計算機與FX系列PLC之間采用主從應答通信方式,PLC內部不需要額外的通信程序,只要將所需數據放在數據寄存器中即可。每個數據寄存器都有相應的物理通信地址,通信時計算機直接對物理通信地址進行操作。
圖2 字符串格式
控制代碼(Control Code)主要用來控制每步數據的傳送。以format 1為例,當要對PLC進行讀操作時,計算機發出請求報文,該報文以ENQ碼開頭,并包括了報文中的所有字段,其中有字符域A。PLC對計算機的請求作出響應,以STX碼開頭,以ETX碼結尾,該報文不包括操作指令字段和消息等待時間。當計算機收到PLC發出的響應報文,計算機發出確認報文或未確認報文,該報文只包括有控制代碼、站號、PC號和錯誤碼Error Code,如圖3所示。
圖3 計算機從PLC讀操作報文協議
[NextPage]
計算機與PLC間通過報文來交換信息,這些信息在交換過程中需要遵守一些約定。當要對PLC進行寫操作時,計算機同樣發出請求報文,該報文以ENQ碼開頭,包括了報文中的所有字符字段,其中有字符區域C,PLC對計算機的請求作出響應,返回確認報文或未確認報文,如圖4所示:
圖4 計算機向PLC寫操作報文協議
站號(Station NO.)用來決定計算機訪問哪一臺PLC,在FX系列PLC中,站號范圍從00H到0FH,特殊輔助寄存器D8121可用于設置站號。
PC號(PC NO.)用來識別PLC上的CPU,對于FX系列PLC,該值為FFH。
指令(Command)用來指定要進行的讀寫操作,每個命令字都由兩個ASCII碼表示。
消息等待時間(Message Wait)指從計算機發出指令到成為接收狀態所需的時間,以10ms為一單位,等待時間可達150ms,可通過一個0到F間的ASCII碼來設定。消息等待時間主要用于半雙工通信模式下讀寫操作間的切換。
字符區域(Character)A為計算機要讀取的存儲區的開始位置和字節數。B為PLC返回的要讀取的存儲區的數值。C為計算機要寫入的存儲區的開始位置和數值。
和校驗碼(Sum Check Code)是從站號開始、和校驗之前所有字節按位相加后取和的低兩位數的ASCII碼,和校驗碼主要用于校驗數據傳送過程中是否發生位錯誤。
4 計算機與PLC通信程序設計
在Windows操作系統中實現串行通信主要有三種途徑:
?利用一些編程工具如Delphi提供的通信控件SPComm,Visual Basic或Visual C++提供的特定通信控件MSComm,開發者通過對這些控件編程來實現對串口的操作。
?調用Windows提供的API函數在Win32環境下,硬件設備被當作文件系統來訪問,應用程序調用Create File()函數來讀寫數據。
?通過C/C++語言將自己的程序編譯鏈接為DLL,然后用Visual Basic調用DLL里的函數來通信。這里介紹VB中通過MSComm控件實現串行通信的方法。
由于Visual Basic 6.0是Windows環境下簡單高效的可視化編程語言開發系統,以其所見及所得的可視化界面設計風格和面向對象程序設計等特點,已廣泛應用于各個領域,改編程語言不但提供了良好的界面設計能力,而且在計算機串口通信方面也有很強的功能,VB中的通信控件MSComm具有完善的串行數據收發和接收功能,不但包括有全部Windows API中關于串行通信的函數所具有的功能,還提供了更多的對象屬性來滿足不同用戶的編程需要。
MSComm控件提供了兩種處理通信的方法:
? 事件驅動法:當有數據到達端口,端口狀態發生改變或有通信錯誤發生時,觸發MSComm控件的OnComm事件,事件驅動實時性強,對外界情況可以作出快速響應,因而是處理串行端口交互作用的一種非常有效的方法。
?查詢法:用軟件或在程序中設置定時器實現對端口周期性掃描,通過讀取CommEvent屬性值來查詢通信事件和錯誤,并作出相應處理,查詢法編程簡單,調試方便,如果應用程序較小,并且是自保持的,這種方法是可取的。
由于MSComm控件隱藏了調用過程,屏蔽了通信過程中的底層操作,使用該控件只需定義相應的屬性,調用Send方法發送數據或等待處理相應的事件接收數據,就可以輕松實現串行異步通信。MSComm控件支持如下主要屬性和事件。
CommPort屬性:設置(返回)控件對應的端口號,系統用端口號唯一標識每一個串行端口。
Settings屬性:設置(返回)控件所用的傳輸協議,以字符串的形式定義控件使用的波特率、奇偶校驗、數據位、停止位等參數。此設定應與PLC的設定相一致。
PortOpen屬性:打開或關閉通信端口。
Input屬性:從接收緩沖區接收并保存MSComm控件接收到的數據。
Output屬性:向發送緩沖區發送數據。
InputLen屬性:設置從接收緩沖區讀取的字符數。
InbufferCout屬性:返回接收到數據緩沖區中需要處理的數據長度。在查詢方式中,該屬性可用來判斷輸入緩沖區是否接收到所需的字符。
InputMode屬性:設置(返回)Input屬性傳輸的數據類型。
OnComm事件:MSComm控件產生動作(如接收數據)或錯誤時,觸發該事件。
CommEvent屬性:返回最近的通信事件或錯誤,可在OnComm事件中檢測該屬性的值后處理。
這里給出計算機與PLC采用查詢法通信的部分程序。
[NextPage]
’MSComm控件初始化
Private Sub Form_Load()
STX$=Chr$(2)
ETX$=Chr$(3)
ENQ$=Chr$(5)
NAK$=Chr$(&H15)
ACK$=Chr$(6)
MSComm1.Settings=”9600,e,7,1”
MSComm1.InBufferSize=1024
MSComm1.CommPort=1
MSComm1.OutBufferSize=1024
MSComm1.OutBufferCount=0
MSComm1.PortOpen=True
MSComm1.InputLen=0
End Sub
’計算機與PLC的連結程序
Private Sub Command_Click()
Dim WaitTime As Long
Dim StartTime As Long
MSComm1.Output=Chr(5)
WaitTime=5
StartTime=Timer
Do While Timer<StartTime+WaitTime
DoEvents
Loop
If MSComm1.InBufferCount>0 Then
If Asc(MSComm1.Input)=0 Then
MsgBox(“連結成功,準備發送數據”)
Else
MsgBox(“連結失敗”)
End If
Else
MsgBox(“連結失敗”)
End If
End Sub
’計算機從PLC讀函數程序
Function CmdRead(Rd As String) As String
Dim X As Integer
Dim Y As Integer
Dim Z As Integer
MSComm1.InBufferCount=0
Read$=Chr(5)&Rd&CheckSum(Rd)
’讀數據幀由ENQ、命令串和和校驗碼組成
MSComm1.Output=Read$
Do
DoEvents
Loop Until MSComm1.InBufferCount>=9
Data$=MSComm1.Input
X=Val(Asc(Left(Data$,1)))
Y=CheckSum(Mid(Data$,2,Len(data$)-3))
’計算應答幀的和校驗碼
Z=Mid(Data$,Len(Data$)-1,2)
’計算接收到的應答幀的和校驗碼
If X=2 And Y=Z then
’STX的ASCII碼為02H
CmdRead=Mid(Data$,6,Len(Data$)-8)
MSComm1.Output=ACK$
Else
CmdRead=‘Error’
MSComm1.Output=NAK$
End If
End Function
計算機向PLC寫函數程序與讀函數程序類似。
5 結束語
文中給出了利用VB的MSComm控件實現計算機與PLC實時通信的基本思想和設計方法,該程序簡單、可靠、實用,并可根據實際工礦要求靈活修改程序。現在火電廠輸煤程控系統的電除塵設備中,有些系采用該系列的PLC,可采用上述方法來保證控制系統通信穩定、有效。