1 引言
隨著計算機通訊技術的日益成熟及企業對工業自動化程度要求的提高,自動控制系統從傳統的集中式控制向多級分布式控制方向發展,構成控制系統的PLC也就必須具備通信聯網功能。在具體應用過程中,若要監視PLC內部的數據與運行狀況,選用市場上的人機界面或組態軟件,雖然功能豐富,但大都價格昂貴,尤其在一些中小規模的生產場合。所以許多企業希望能自己用高級語言開發一個簡易實用的通信程序,通過面向對象的可視化編程語言VB6.0很容易地實現分布式監控。PLC等下位機控制生產過程,本地計算機進行實時監測或參與控制生產現場的參數。本文通過對OMRON的CPM1A小型機與上位計算機通信原理和通信方法的研究,介紹了如何用VB6.0實現上位計算機對PLC的實時監控,并取得了良好的效果。
2 監控原理
2.1 通信方法
上位機作為主站要能夠通過PLC監控下層設備的狀態,首先要實現上位機與PLC間的通信。由于串行通信具有線路簡單、應用靈活、可靠性高等優點,并且普通計算機均帶有串行口,所以PC與PLC間通常采用串行通信方式。串行通信可以通過Windows的API函數實現,也可以串行通信控件實現,但后者較容易,本文采用VB的通信控件。如果只實現對一臺CPM1APLC的監控,需要CPM1-CIFO1(OMRON提供的專用的RS232適配器)形成RS232C口與上位機通信;如果是實現對多臺PLC的監控,則需用RS232—RS422/RS485轉換器ADAM-4520和CPM1-CIF11(OMRON提供的專用RS422適配器)與上位機通信,最多可連接32臺PLC,連接方式如圖1所示。
[align=center]

圖1 系統通信原理[/align]
在通信過程中上位機始終處于主動方,PLC則處于從動方,所有的數據交換只能在主站和從站之間進行,從站之間不能直接交換數據,如果從站之間需要交換數據,必須通過主站中轉1。首先上位機向PLC發送指令幀,PLC接收了上位機的指令后,先進行FCS校驗,看其是否正確,如果正確,則接收并向上位機傳送響應幀(包含首尾校驗字節),否則,PLC拒絕向上位機傳送數據。需要說明的是,整個通信過程中因PLC中配有通信機制,一般不需要對PLC進行編程。上位機接收到PLC傳送的數據,也要判斷正確與否,如果正確,則接收,完成一次正常通信,否則,通信需重新開始。
2.2 通訊協議
(1)通訊條件設計。要使上位機與下位機正確地交換數據,必須確保以下幾點:
● 雙方在初始化時要使波特率、數據位數、停止位數、奇偶校驗均保持一致;
● 要嚴格按照PLC的通信協議的規定及幀格式編寫PC的通信程序。
(2)通訊的命令幀設計。OMRON公司的CPMIA小型PLC的傳輸協議的一般格式為:
(3)通訊的響應幀設計
其中,@為前導字符,表示開始;設備號為00-31(本例限設到10),共可設置32個站號,用來識別所連接的PLC,可通過PLC的DM6653的低8位來設定,默認站號為00;命令碼為CPMIA小型PLC規定的對其操作的命令代碼;正文為需要讀或寫的數據地址以及數據;FCS為幀校驗代碼,用于及時發現通信過程中的錯誤,以備處理;*和CR表示命令結束[2]。
命令幀為PC機傳向PLC的幀格式,響應幀為PLC傳向PC機的幀格式,其命令幀與響應幀中的各個部分除數據區不同外,其他部分的含義是相同的。
2.3 MSComm控件介紹
VB中的MSComm控件具有功能完善的串口數據發送和接收功能。 MSComm控件具有兩種通信方式:事件驅動方式和查詢方式[3]。因為查詢方式占用CPU時間太多,我們采用事件驅動方式。要完成通信,必需正確設置MSComm控件的相關屬性,本設計在窗體中對其進行初始化,主要包括端口設置,波特率設置,奇偶設置等。主要屬性如表1所示。
[align=center]表1 MSComm控件屬性

[/align]
[b]2 通信程序設計
[/b]
本系統以PC對基于PLC的交通燈控制系統的監控為例,在上位機與PLC正常通信的前提下,設計如下界面。窗體的內容主要包括,四大區:端口、站號選擇區,設定時間輸入區,監控顯示區,控制按紐區。從站號選擇區選擇不同站號即不同PLC,實現對多個PLC的實時監控。
3.1 串口初始化程序
If MSComm1.PortOpen <> True Then
MSComm1.PortOpen=True
End If
MSComm1.Settings=“9600,E,7,2”
MSComm1.InputLen=0
MSComm1.InBufferCount=0
MSComm1.InputMode=comInputModeText
MSComm1.Handshaking=comNone
3.2 計算機與PLC通信的VB程序
Public Function ReadData(ByVal InputStr As String, ByVal Num1 As Integer, ByVal Num2 As Integer) As String

Dim OutputStr As String
Dim InString As String
Dim ReturnStr As String
Dim EndString As String
Dim FCSString As String
Dim ReturnFCSString As String
Form1.MSComm1.InBufferCount=0
OutputStr=InputStr+FCS(InputStr)+“*”
If Form1.MSComm1.PortOpen=True Then
Form1.MSComm1.Output=OutputStr+Chr$(13)’按照PLC幀格式輸出
End If
Do
DoEvents
Loop Until Form1.MSComm1.InBufferCount >=Num2’返回幀的長度
InString=Form1.MSComm1.Input
EndString=Mid$(InString,6,2)’取返回幀的響應碼
If EndString <> “00”Then
ReadData=“Error”
Exit Function
End If
EndString=Mid$(InString,1,Len(InString)-4)
ReturnFCSString=Mid$(InString, Len(InString) -3,2)’取返回幀校驗碼
FCSString=FCS(EndString)
If FCSString <> ReturnFCSString Then
ReadData=“Error”
Exit Function
End If
If Len(InString)>=Num2 Then
ReturnStr=Mid$(InString, Len(InString)-Num1-3, Num1)’取返回幀的數據,其度為Num1
ReadData = ReturnStr
End If
End Function
4 結束語
本文給出了利用VB中的MSCOMM控件實現上位機與多個PLC之間的通信方法,實現了上位機對多個PLC的實時監控。對于分布是控制系統大幅度地減小了通訊成本,具有一定的推廣價值。