基于VB6.0的S7-200PLC與計算機的通訊設計
1 引言
本文引用地址:http://dyxdggzs.com/article/202424.htm
plc 作為一種穩定可靠的控制器在工業(yè)控制系統得到了廣泛的應用[1]。但是由于中小型plc的人機接口功能不很完善,不能提供給用戶(hù)一個(gè)友好的交互界面,因此妨礙了對現場(chǎng)運行過(guò)程的跟蹤與監控[2~5]。目前一些通用的組態(tài)軟件,以其功能強大、界面友好、開(kāi)發(fā)簡(jiǎn)潔等優(yōu)點(diǎn)在計算機監控領(lǐng)域已經(jīng)得到了廣泛的應用,但是一般價(jià)格比較昂貴[6~7]。
visual basic6.0 在開(kāi)發(fā)可視化環(huán)境下的監控系統時(shí)具有其獨特的優(yōu)勢,它本身提供的mscomm控件就是為應用程序提供串口通訊而設計的,它屏蔽了通訊過(guò)程中的底層操作,只需設置、監視mscomm控件的屬性和事件即可完成對串行口的初始化和數據輸入輸出[8~10]。西門(mén)子s7-200plc由于其體積小,可靠性高,通訊功能強大等特點(diǎn),在工業(yè)控制領(lǐng)域得到廣泛的應用。s7-200系列plc的通訊方式主要有三種:ppi方式、profibus-dp方式、freeport(自由口)方式。其中自由口方式是由用戶(hù)自己定義通訊協(xié)議,具有與外圍設備通訊方便、自由,易于計算機控制軟件的開(kāi)發(fā)等特點(diǎn),因此使用自由口通訊方式實(shí)現plc與上位機通信的控制方案較多[11~14]。
本文采用s7-200plc的自由口通訊協(xié)議,基于vb6.0開(kāi)發(fā)了一種簡(jiǎn)單實(shí)用且易于功能擴展的監控界面,其中計算機作為上位機,通過(guò)mscomm控件建立與下位機plc的通訊,可以實(shí)現數字量和模擬量讀寫(xiě)、存儲及模擬量趨勢曲線(xiàn)繪制。
2 通訊原理
在上位機中,通過(guò)vb6.0中的mscomm控件完成數據的發(fā)送與接收;在下位機中則是通過(guò)plc的指令完成數據的發(fā)送與接收的。
2.1 通訊初始化設置
由于s7-200plc與計算機的自由口通訊是串行通訊,故通訊前需要通訊雙方的串行端口初始化,使雙方通訊參數保持一致。
(1) 上位機初始化設置
上位機使用mscomm控件通過(guò)串行端口發(fā)送和接收數據,因此首先要對mscomm控件進(jìn)行初始化設置,主要始化設置如下:
mscomm1.commport=1 `設定通訊端口號
mscomm1.portopen=true `通訊端口打開(kāi)
mscomm1.settings=9600,n,8,1
mscomm1.inputmode=1
settings:以字符串的形式設置并返回波特率、奇偶校驗位、數據位和停止位。其中以字符n、o、e 分別代表無(wú)校驗、奇校驗和偶校驗。
inputmode:設置從緩沖區讀取數據的格式;0為字符串格式(text),1為二進(jìn)制格式(binary) [15]。
(2) 下位機的初始化設置
為了使下位機與上位機的通訊參數保持一致,可通過(guò)對plc的自由端口控制寄存器smb30(端口0)或smb130(端口1)的設置來(lái)實(shí)現。由于本文中使用的是cpu222是端口0,因此對plc的通訊設置是通過(guò)設置smb30來(lái)完成的。smb30的設置主要包括奇偶校驗位、數據位、波特率、協(xié)議選擇等參數。本文smb30設置內容如下,奇偶校驗為不校驗、字符數據位為8位/字符、波特率為9600bit/s、協(xié)議選擇為自由口協(xié)議,故smb30設置為9。由于本文是通過(guò)接收字符中斷接收數據,通過(guò)定時(shí)中斷發(fā)送數據,因此需要將兩個(gè)中斷初始化。
plc主要初始化設置:
movb 9, smb30 //將自由口控制存儲器設置9
movb 200, smb34 //定時(shí)中斷時(shí)間設置(200ms)
atch int_0, 8 //接收字符中斷
atch int_1, 10 //定時(shí)中斷
eni //中斷允許
2.2 通訊方式
圖1 數據存儲時(shí)的界面
(1) 上位機通訊方式
首先將上位機待發(fā)送的m個(gè)字節依次存儲在數組s中,每次待接收的數據存儲在變量r中。
發(fā)送信息時(shí),數組s中第一個(gè)元素s(0)存儲第一個(gè)待發(fā)送字節……最后一個(gè)元素s(m-1)存儲最后一個(gè)待發(fā)送字節,發(fā)送方式為mscomm1.output=s。
接收方式為 r=mscomm1.input。
由于plc中的信息是以byte的形式傳輸到計算機中,因此上位機需要對接收的數據進(jìn)行數據處理。由于plc中模擬量傳感器數據是以word的形式存儲在aiw中,而plc在發(fā)送該數據時(shí)是按照word對應的兩個(gè)byte發(fā)送,故計算機在后臺計算中要將其對應的兩個(gè)byte轉換為word。為了在人機界面中表達數字量(qb,ib,mb)的各個(gè)狀態(tài),需要在計算機后臺計算中把plc的各數字量的十進(jìn)制轉換為八位二進(jìn)制,通過(guò)對八位二進(jìn)制的每個(gè)位做0、1判斷,利用vb6.0可使用多種方法把判斷結果表達在界面中。
圖2 存儲在excel表格中的部分數據
(2) 下位機通訊方式
為了在計算機中實(shí)時(shí)顯示plc運行狀況及傳感器的實(shí)時(shí)數據,就需要plc主動(dòng)發(fā)送信息。為此,本文通過(guò)“定時(shí)中斷”使plc周期地向計算機發(fā)送數據。具體方法是在定時(shí)中斷事件里,使用plc自帶的發(fā)送指令xmt發(fā)送數據,定時(shí)中斷的時(shí)間設置(1ms~255ms)即為發(fā)送周期。
s7-200系列的plc接收指令有兩種方法:第一種方法是使用plc自帶的rcv指令來(lái)接收計算機數據;第二種方法采用plc提供的“接收字符中斷”方式,將smb2(自由口接收字符緩沖區)定義指針,使用指針接收數據。在這兩種方法中,第二種方法更加靈活,因此在本文中,plc在接收信息時(shí)采用指針接收數據。即在plc接收數據時(shí),每次接收m個(gè)字節,僅在第一個(gè)字節進(jìn)入smb2時(shí)定義指針,并將該字節寫(xiě)入指針所指向的變量存儲字節;第二個(gè)字節進(jìn)入smb2時(shí),指針指向下一個(gè)變量存儲字節,并把第二個(gè)字節寫(xiě)入……最后一個(gè)字節進(jìn)入smb2時(shí),指針指向下一個(gè)變量存儲字節,把第m個(gè)字節寫(xiě)入。若數據接收完成,則清空用于計數的變量存儲字節,等待下次接收數據,至此完成一次數據接收。本文中在接收字符中斷里使用指針接收2個(gè)字節:
ld sm4.5 //變送器閑置時(shí)動(dòng)作
lps
ab= vb99, 0 //vb99為0時(shí)
movd vb100, ac1
//定義指針ac1,存儲于vb100
lrd
movb smb2, *ac1
//指針指向自由口接收字符緩沖區
lrd
incd ac1 //指針遞增
lrd
incb vb99 //接收字節個(gè)數遞增
lpp
ab= vb99, 2 //接收字節個(gè)數為2
movb 0, vb99 //計數清零,完成一次接收
3 數據存儲
vb6.0可將數據存儲在多種數據庫中(如access、excel等)??紤]到excel簡(jiǎn)單實(shí)用且應用廣泛,通過(guò)設置excel的宏屬性,就可將實(shí)時(shí)數據保存在創(chuàng )建的excel文件中,并可方便的查看歷史數據。
本文通過(guò)vb6.0鏈接一個(gè)指定的excel文件,在vb程序里定時(shí)器的觸發(fā)事件將數據存儲至excel文件,存儲方法如下:
k=k+1
xlsheet.cells(k,r) = v`數據v寫(xiě)入excel第r列,隨著(zhù)時(shí)間k的增加依次逐行存儲。
為了建立vb6.0與指定excel文件的鏈接,需要對鏈接的雙方分別進(jìn)行設置。首先建立并指定一個(gè)excel文件,命名為“g”,存儲路徑為“d:g”,通過(guò)設置該文件宏屬性,可建立excel向vb6.0的鏈接。exel中的宏屬性設置設置為:
sub auto_open()
open d:g for output as #1 `寫(xiě)標志文件close #1
end sub
sub auto_close()
kill d:g `刪除標志文件end sub
在vb6.0向excel鏈接時(shí),考慮到數據快速地寫(xiě)入excel,為避免誤操作引起excel運行終止,本文在打開(kāi)exel時(shí)設置excel不可見(jiàn),當數據存儲完畢后,設置excel可見(jiàn)。
(1) 打開(kāi)exel(鏈接到指定的exel文件)
set xlapp=createobject(excel.application) `創(chuàng )建excel應用類(lèi)
xlapp.visible = false
`設置excel不可見(jiàn)
set xlbook=xlapp.workbooks.open(d:g.xls) `打開(kāi)excel工作簿
set xlsheet=xlbook.worksheets(1)
`打開(kāi)excel工作表
xlsheet.activate
(2) 關(guān)閉exel
xlapp.visible = true `設置excel可見(jiàn)
set xlapp = nothing `釋放excel對象
4 運行實(shí)例
為了驗證本設計在實(shí)際應用中的有效性,本文利用實(shí)驗室現有設備,在cpu222的擴展模塊em235中接入2個(gè)位移傳感器,設計了一套簡(jiǎn)單實(shí)用的人機界面。在界面中,計算機實(shí)時(shí)的顯示兩個(gè)位移傳感器的數據及其曲線(xiàn)圖,并能將數據自動(dòng)存儲至指定excel文件中;在界面中可以顯示plc的數字量輸入、輸出狀態(tài)及模擬量的實(shí)時(shí)變化曲線(xiàn);通過(guò)“啟動(dòng)”、“停止”按鈕可以直接控制plc的各輸出點(diǎn)。
設置plc以200ms為周期每次發(fā)送9個(gè)字節,將傳感器1的數據存入vw2(發(fā)送vb2和vb3),傳感器2的數據存入vw4(發(fā)送vb4和vb5),i0.0~i0.7的狀態(tài)字節ib0存入vb6,i1.0~i1.7的狀態(tài)字節ib1存入vb7,q0.0~q0.7的狀態(tài)字節qb0存入vb8,q1.0~q1.7的狀態(tài)字節qb1存入vb9,m0.0~m0.7的狀態(tài)位mb0存入vb10。
計算機每次發(fā)送2個(gè)字節,第一個(gè)字節寫(xiě)入變量存儲字節vb100中,并將vb100的數據賦值給qb0,進(jìn)而實(shí)現點(diǎn)擊“啟動(dòng)”/“停止”按鈕控制q0.0~q0.7;第二個(gè)字節寫(xiě)入變量存儲位vb101,該字節通過(guò)比較指令中的“字節等于”連接發(fā)送指令xmt,實(shí)現界面中點(diǎn)擊“開(kāi)始監控”(字節等于1)時(shí)plc開(kāi)始發(fā)送數據,點(diǎn)擊“停止監控”(字節等于0)時(shí)plc停止發(fā)送數據。
為了實(shí)現計算機直接控制plc的數字量輸出,本設計在界面中使用8對“啟動(dòng)”/“停止”控制按鈕,其中任何一個(gè)控制按鈕的點(diǎn)擊都是一次計算機向plc的數據寫(xiě)入。在qb0中該字節對應的8個(gè)位控制plc的8個(gè)數字量輸出點(diǎn)(q0.0~q0.7),故這里通過(guò)定義一個(gè)數組q(0 to 7),數組中的8個(gè)元素分別對應qb0中的8個(gè)輸出點(diǎn),每次點(diǎn)擊界面中控制按鈕都是向對應元素的賦值,并將8個(gè)元素的賦值求和,求和的結果即為寫(xiě)入qb0的內容。其中每個(gè)“啟動(dòng)”按鈕的賦值為對應元素的十進(jìn)制數值,任何“停止”按鈕的賦值都為0。
下面是人機界面運行中的截圖,界面中的圖表橫坐標單位是“s”,縱坐標單位是“mm”,圖表刷新周期為1秒,數據存儲至excel文件的周期是200ms。開(kāi)始監控后,使用兩個(gè)量程為100mm的位移傳感器,用手動(dòng)方式移動(dòng)傳感器的檢測部位,在數據存儲過(guò)程中,excel文件不可見(jiàn),停止數據存儲后,自動(dòng)彈出excel文件。在圖2、圖3中,a列和b列分別表示位移傳感器1(黑色曲線(xiàn))和位移傳感器2(紅色曲線(xiàn))的歷史數據。
圖3 exel中的數據生成圖表
5 結束語(yǔ)
本文應用s7-200plc的自由口通訊協(xié)議,以計算機為上位機,plc為下位機,基于vb6.0設計了一套簡(jiǎn)單實(shí)用且易于實(shí)現的監控界面。通過(guò)mscomm控件建立與下位機plc的通訊,較好地實(shí)現了數字量和模擬量讀寫(xiě)、存儲及模擬量趨勢曲線(xiàn)繪制。實(shí)驗表明該監控系統能準確地監控各類(lèi)數字量(如q,i,m)信息,自動(dòng)繪制模擬量變化的實(shí)時(shí)曲線(xiàn)并存儲相應的模擬量數據。
本文設計的通訊方法簡(jiǎn)單實(shí)用且易于功能擴展,可以plc在中小場(chǎng)合的應用,為plc控制系統信息化、智能化發(fā)展提供了可行的探索路徑。
西門(mén)子plc相關(guān)文章:西門(mén)子plc視頻教程
通信相關(guān)文章:通信原理
評論