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