利用Visual Basic和PLC開(kāi)發(fā)小型監控系統
——
關(guān)鍵詞:串行通信、三菱FX、Visual Basic、自控系統
一. 前言
隨著(zhù)生產(chǎn)自動(dòng)化程度的不斷提高,可編程序控制器PLC得到了廣泛的應用,特別是小型PLC具有編程簡(jiǎn)單、性能可靠和價(jià)格低的特點(diǎn),被大量應用于單機控制系統中,如啤酒的稀釋控制、離心機控制等。作為設備維修技術(shù)人員,一般都能掌握PLC和計算機PC的應用知識,但如何利用PLC和PC來(lái)設計小型自控系統,實(shí)現簡(jiǎn)單的數據采集和監控操作,從而滿(mǎn)足生產(chǎn)需要,卻是一個(gè)要深入學(xué)習研究的問(wèn)題。
面向生產(chǎn)操作,設計簡(jiǎn)單有效的控制系統,涉及到三部分的軟件編程:
第一:PC上人機操作界面的設計。PC作為上位機,一般都是運行在Windows 98/2000操作系統下,利用微軟提供的可視化編程軟件Visual Basic 6.0,設備維修技術(shù)人員就可設計出優(yōu)美的人機操作界面,只需進(jìn)行主要操作功能編程和少量界面控制編程。
第二:實(shí)現生產(chǎn)工藝要求的PLC控制程序設計。因為是小型控制系統,其生產(chǎn)控制過(guò)程并不復雜,技術(shù)人員只要充分了解了生產(chǎn)工藝和控制要求,運用PLC編程工具,此部分設計編程并不難。
第三:PC與PLC通訊程序的設計。此部分的開(kāi)發(fā)設計較難,需要掌握PC和PLC的有關(guān)通訊硬件驅動(dòng)和通訊協(xié)議的知識。但對于小型控制系統來(lái)說(shuō),主要通過(guò)PC串口來(lái)通訊,所以通訊程序設計的關(guān)鍵是如何利用Visual Basic 6.0中的串口通信控件——MSComm控件,并根據PLC的串口通信協(xié)議設計出上下位機的數據交換程序。
下面以啤酒稀釋自控系統設計為例,主要講解PC和PLC通訊程序的設計要點(diǎn)。
二. 啤酒稀釋自控系統設計分析
1. 啤酒稀釋控制要求
啤酒稀釋是啤酒生產(chǎn)中一個(gè)重要環(huán)節,通過(guò)把高濃度的酒液與脫氧水按比例混合成稀釋酒,從而提高啤酒產(chǎn)量和增加啤酒品種,稀釋的控制過(guò)程很簡(jiǎn)單,主要步驟有:
1) 輸入高濃度的濃度A和稀釋后要達到的濃度B ;
2) 計算出加水量的百分比 [(B-A) / A]*100% ;
3) 根據此百分比和高濃酒的瞬時(shí)流量,計算出脫氧水要達到的流量;
4) 比較水的瞬時(shí)流量和計算出的流量,來(lái)控制水調節閥的開(kāi)度,使水瞬時(shí)流量等于計算流量。
由于酒和水的瞬時(shí)流量是變化的,所以3)、4)步要反復進(jìn)行。以上所有的計算功能和PID調節功能都由PLC完成。
2. 啤酒稀釋的人機操作界面:
人機操作主要用來(lái)輸入啤酒濃度數據、操作命令,直觀(guān)顯示各種流量數據并記錄偏差曲線(xiàn),界面圖如下:
3. 硬件配置
本例子中上位機PC選用聯(lián)想奔騰Ⅱ品牌機,外加RS232轉RS485通訊轉換卡。下位機PLC選用三菱FX2N-16MR,另加模擬輸入模塊FX2N-2AD 和模擬輸出模塊FX2N-2DA各一塊,外加一個(gè)485串口通訊模塊PC-485BD。
三. PC與PLC通訊程序設計分析
在分析具體的VB通訊程序之前,先要介紹有關(guān)VB串口通信控件MSComm的應用知識和三菱PLC 通訊協(xié)議。
1. MSComm控件簡(jiǎn)介
如圖所示是Mscomm控件的圖標。
它可以用來(lái)提供簡(jiǎn)單的串行端口通信功能,也可以用來(lái)創(chuàng )建功能完備、事件驅動(dòng)的高級通信工具。Mscomm控件提供了一系列標準通信命令的使用界面。使用它可以建立與串行端口的連接,通過(guò)串行端口再連接到其它設備(如調制解調器、PLC),發(fā)出命令,交換數據,以及監視和響應串行連接中發(fā)生的事件和錯誤。
2. MSComm控件的基本屬性
MSComm 控件有很多重要的屬性,基本屬性如下:
屬性 描述
CommPort 設置并返回通訊端口號。
Settings 以字符串的形式設置并返回波特率、奇偶校驗、數據位、停止位。
PortOpen 設置并返回通訊端口的狀態(tài)。也可以打開(kāi)和關(guān)閉端口。
Input 從接收緩沖區返回和刪除字符。
Output 向傳輸緩沖區寫(xiě)一個(gè)字符串。
如下程序打開(kāi)串行端口COM1
MSComm1.CommPort = 1 使用 COM1
MSComm1.Settings = "9600,N,7,1" 9600波特率,無(wú)奇偶校驗,7位數據,一個(gè)停止位。
MSComm1.PortOpen = True ''''''''''''''''打開(kāi)端口,開(kāi)始通信。
3. MSComm控件的通信方式
通信控件有2種不同的方式來(lái)處理和解決各類(lèi)通信軟件的開(kāi)發(fā)和設計問(wèn)題。
(1) 事件驅動(dòng)
事件驅動(dòng)通訊是處理串行端口交互作用的一種非常有效的方法。在許多情況下,在事件發(fā)生時(shí)需要得到通知,例如:當線(xiàn)路數據到達本端或CD線(xiàn)和RTS信號線(xiàn)狀態(tài)發(fā)生變化時(shí),要求我們使用相應的事件來(lái)跟蹤和出理。在這些情況下, Mscomm控件將觸發(fā)OnComm事件,CommEvent屬性值也將被改變。所以在OnComm事件中讀取CommEvent屬性值就可以檢測和處理通信錯誤等方面的問(wèn)題。
(2)查詢(xún)方式
利用定時(shí)器控件Timer,我們可以設計程序每隔一段時(shí)間去讀取CommEvent的值并處理所發(fā)生錯誤和事件。
4. 本實(shí)例中采用的通訊方式
在本例子中,PC與PLC 采用無(wú)握手協(xié)議的串行通信,它們只用兩根數據線(xiàn) TD和RD、一根信號地線(xiàn)連接,數據通信采用查詢(xún)方式。根據系統功能要求,PC需發(fā)送兩種類(lèi)型的命令:
(1) 周期性命令,它由定時(shí)器觸發(fā)引起,每隔0.5秒發(fā)送一次。用它來(lái)向PLC查詢(xún)實(shí)時(shí)顯示的數據。如酒、水的瞬時(shí)流量,調節閥開(kāi)度等。
(2) 非周期性命令,它由操作者按動(dòng)命令按鈕引起,非周期性發(fā)送。用它來(lái)傳送輸入參數、操作命令給PLC 。
在啤酒稀釋的人機操作界面中,有運行時(shí)不可見(jiàn)的通信控件(MSComm1)一個(gè)、定時(shí)器控件一個(gè)Timer1。通信控件(MSComm1)用于初始化串口數據并打開(kāi)串口;定時(shí)器控件(Timer1)用于每隔0.5秒執行通訊命令,把查詢(xún)命令從PC發(fā)送到PLC,同時(shí)接收PLC返回的應答數據。設計通訊數據的發(fā)送和查詢(xún)功能,必須掌握PLC所遵循的通訊協(xié)議。
5. 三菱FX系列PLC通訊協(xié)議
三菱FX系列PLC共有四種通信模式,本實(shí)例采用的是PLC與計算機專(zhuān)用協(xié)議通信方式(無(wú)須PLC編程,電腦直接讀寫(xiě)操縱PLC),其通訊命令字和通訊格式介紹如下:
PC發(fā)送給PLC的通信命令字
命令字 注釋
BR 以1點(diǎn)為單位,讀出位元件的狀態(tài)
WR 以16點(diǎn)為單位,讀出位元件的狀態(tài),或以1字為單位,讀出字元件的值
BW 以1點(diǎn)為單位,寫(xiě)入位元件的狀態(tài)
WW 以16點(diǎn)為單位,寫(xiě)入位元件的狀態(tài),或以1字為單位,寫(xiě)入值到字元件
BT 以1點(diǎn)為單位,設置/復位 位元件
WT 以16點(diǎn)為單位,設置/復位 位元件,或以1字為單位,寫(xiě)入值到字元件
RR 控制PLC運行RUN
RS 控制PLC停止STOP
PC 讀出PLC設備類(lèi)型
TT 連接測試
PC發(fā)送給PLC的通信命令格式
約定說(shuō)明:ENQ為請求標志,ASCII值5,VB中以chr(5)表示;
ACK為正確標志,ASCII值6,VB中以chr(6)表示;
STX為請求標志,ASCII值2,VB中以chr(2)表示;
EXT為請求標志,ASCII值3,VB中以chr(3)表示;
表格中粗體字為需要求和效驗的部分;
和效驗為每一項的ASCII值的總和轉換成十六進(jìn)制后,取其低兩位;
站號、PLC號、元件數量、和效驗都是以十六進(jìn)制表示;
等待延時(shí)為0-150毫秒,以十六進(jìn)制0H-FH表示,如100ms為AH。
1) 批量讀出位元件—BR指令格式
1 2 3 4 5 6 7 8 15 16 17
PC側: ENQ 站號 PLC號 BR 延時(shí) 首地址 數量 和校驗 ACK 站號 PLC號
PLC側: STX 站號 PLC號 數據 EXT 和校驗
9 10 11 12 13 14
例如:要讀出站號為5的PLC的X40到X44共5點(diǎn)的狀態(tài)值,延時(shí)100毫秒,假設PLC中X40與X43為OFF,其余為ON,則指令數據如下:
注釋?zhuān)?nbsp;請求 站號 PLC號 命令 延時(shí) 元件首地址 元件數量 和校驗
代碼: ENQ 0 5 F F B R A X 0 0 4 0 0 5 4 7
ASCII碼: 05H 30H 35H 46H 46H 42H 52H 41H 58 30H 30H 34H 30H 30H 35H 34H 37H
只要將以上代碼以字符串形式(VB中可以表示為chr(5)&”05FFBRAX00400547”)發(fā)送到PLC,就會(huì )有正確的回應信息,如下:
注釋?zhuān)?nbsp;頭 站號 PLC號 位元件狀態(tài)值 尾 和校驗
代碼: STX 0 5 F F 0 1 1 0 1 EXT E 7
ASCII碼: 02H 30H 35H 46H 46H 30H 31H 31H 30H 31H 03H 45H 37H
2) 批量讀出字元件—WR指令格式
1 2 3 4 5 6 7 8 15 16 17
PC側: ENQ 站號 PLC號 WR 延時(shí) 首地址 數量 和校驗 ACK 站號 PLC號
PLC側: STX 站號 PLC號 數據 EXT 和校驗
9 10 11 12 13 14
該命令使用與BR命令相同。
3) 批量寫(xiě)入位元件—BW指令格式
1 2 3 4 5 6 7 8 9
PC側: ENQ 站號 PLC號 BW 延時(shí) 首地址 數量 寫(xiě)入值 和校驗
PLC側: ACK 站號 PLC號
10 11 12
4) 批量寫(xiě)入字元件—WW指令格式
1 2 3 4 5 6 7 8 9
PC側: ENQ 站號 PLC號 WW 延時(shí) 首地址 數量 寫(xiě)入值 和校驗
PLC側: ACK 站號 PLC號
10 11 12
6. VB通訊功能塊設計分析
根據三菱PLC的通訊指令格式,在PC中編寫(xiě)數據查詢(xún)功能塊RevData( )和數據發(fā)送功能塊SendData( ),就可以在定時(shí)中斷處理塊TIMER1( )中調用查詢(xún)功能塊RevData( ),實(shí)現PC界面數據定時(shí)刷新;在每一次操作命令執行時(shí),調用數據發(fā)送功能塊SendData( ),把控制值寫(xiě)入PLC中,從而實(shí)現控制。下面給出這兩個(gè)功能塊的設計程序。
1) 查詢(xún)數據函數RevData( )
(沒(méi)有和校驗)
Sub RevPLC (iNo As String, iType As String, iAdd As String, iNum As String)
'''''''''''''''' iNo為PLC站號,iType為元件類(lèi)型,iAdd為首地址,iNum為元件數量
Dim Stmp As String
Dim cha, j As Integer
Dim ChaCount As Integer
Dim Comm As String
Select Case iType
Case "D" ''''''''''''''''查詢(xún)數據寄存器的值
Comm = "WR" ''''''''''''''''命令類(lèi)型:數據字讀
cha = Val("&H" & iNum) * 4 ''''''''''''''''數據寄存器的值為十六進(jìn)制表示,占4個(gè)字符
Case "M", "X", "Y" ''''''''''''''''查詢(xún)繼電器觸電的值
Comm = "BR" ''''''''''''''''命令類(lèi)型:二進(jìn)制位讀
cha = Val("&H" & iNum)
End Select
iAdd = Right$("000" & iAdd, 4)
iNum = Right$("0" & iNum, 2)
Stmp = Chr$(5) & iNo & "FF" & Comm & "A" & iType & iAdd & iNum ''''''''''''''''輸出命令格式
ChaCount = 6 + cha ''''''''''''''''要返回字符個(gè)數
main.MSComm1.InBufferCount = 0 ''''''''''''''''輸入緩沖區清零
main.MSComm1.Output = Stmp ''''''''''''''''設傳送緩沖區內容為命令格式
Now=Second()
Do
DoEvents ''''''''''''''''轉讓控制權,以便讓操作系統進(jìn)行數據傳輸
If Second()-Now>1 Then Exit Sub
Loop Until main.MSComm1.InBufferCount = ChaCount ''''''''''''''''當接收到規定字符時(shí)停止循環(huán)
RevDataTmp = Mid$(main.MSComm1.Input, 6, cha) ''''''''''''''''返回數據字符串保存在全局變量
''''''''''''''''RevDataTmp中
End Sub
2) 發(fā)送數據函數SendData( )
(沒(méi)有和校驗)
Sub SendPLC(iNo As String, iType As String, iAdd As String, iNum As String, ivalue As String)
'''''''''''''''' iNo為PLC站號,iType為元件類(lèi)型,iAdd為首地址,iNum為元件數量,ivalue為寫(xiě)入值
Dim Stmp As String
Dim Comm As String
Select Case iType
Case "D" ''''''''''''''''寫(xiě)數據寄存器的值
Comm = "WW" ''''''''''''''''命令類(lèi)型:數據字寫(xiě)
ivalue = Right$("0000" + Hex$(Val(ivalue)), 4) ''''''''''''''''寫(xiě)入值轉換成十六進(jìn)制表示
Case "M" ''''''''''''''''寫(xiě)繼電器觸點(diǎn)的值
Comm = "BW" ''''''''''''''''命令類(lèi)型:二進(jìn)制位寫(xiě)
End Select
iAdd = Right$("000" & iAdd, 4)
iNum = Right$("0" & iNum, 2)
Stmp = Chr$(5) & iNo & "FF" & Comm & "A" & iType & iAdd & iNum & ivalue ''''''''''''''''輸出命令格式
MSComm1.Output = Stmp ''''''''''''''''輸出命令到傳送緩沖區
Now= Second()
Do
DoEvents ''''''''''''''''轉讓控制權,以便讓操作系統進(jìn)行數據傳輸
If Second()-Now>1 Then Exit Sub
Loop Until main.MSComm1.OutBufferCount = 0 ''''''''''''''''當命令傳送完時(shí)停止循環(huán)
End Sub
四. 總結:
生產(chǎn)自控系統的設計要解決好三部分的問(wèn)題:PC上人機操作界面的編制,PC與PLC的通信程序編寫(xiě),PLC生產(chǎn)控制程序的編寫(xiě)。對于串行通信的單機自控系統,因為具有操作界面和生產(chǎn)工藝流程簡(jiǎn)單的特點(diǎn),所以利用Visual Basic設計操作界面和利用PLC編程語(yǔ)言設計生產(chǎn)控制程序都比較方便,但對如何編寫(xiě)通信程序就比較陌生,也沒(méi)有許多相關(guān)資料可學(xué)習。本文介紹的方法簡(jiǎn)單、實(shí)用,供各位參考。利用通信控件MSComm的OnComm事件和CommEvent屬性還可以設計出功能更完善的通信程序。
評論