魏立新,馮 曦,王洪慶,高江曼
(1.燕山大學工業(yè)計算機控制工程河北省重點實驗室,河北秦皇島 066004 2.天津電氣傳動設計研究所,天津 300180)
在實際運用中,上位機與西門子系列PLC之間的通訊方式,主要有以下4種:(1)用WinCC、InTouch等組態(tài)軟件編程實現(xiàn)通信連接;(2)用OPC Server軟件實現(xiàn)通信連接;(3)用自由口實現(xiàn)通信連接;(4)用PRODAVE或LIBNODAVE函數庫實現(xiàn)通信連接。方式1雖然操作簡單、效率高,但是成本投入高[1],并且此類軟件運行時十分占據上位機內存資源,對于僅需簡單實用功能的操作顯得過于復雜。方式2雖然現(xiàn)在被廣泛采用,但OPC在處理實時數據方面具有劣勢,并且由于其基于DCOM的技術使得OPC只能在Windows操作系統(tǒng)下使用[2]。方式3雖然靈活性好,但只適于小規(guī)模控制系統(tǒng),并且PLC中也需要編寫通信程序[3]。方式4通過調用PRODAVE或LIBNODAVE函數庫,運用高級編程語言,可以直接靈活地對PLC進行數據操作,提升了實時性。而LIBNODAVE優(yōu)勢在于其開源免費,并且包含了更多的應用函數,為開發(fā)降低了成本、提供了便捷、完善了功能。因此,文中采用LIBNODAVE函數庫來進行上位機監(jiān)控軟件的設計開發(fā)。
LIBNODAVE是一款可與西門子系列PLC進行通信的開源、免費的函數庫,遵循GNU庫公用許可證版本2及以上,可運行在Windows、Linux 及Unix 操作系統(tǒng)上。LIBNODAVE可以訪問的存儲區(qū)域有:位存儲區(qū)、數據塊、輸入/輸出映像區(qū)、定時器和計數器等。另外,LIBNODAVE 還可以讀取PLC程序中的功能塊[4]。
參考文獻[4]對LIBNODAVE的使用做了比較詳細的例程說明,文中將其作為重要參考,在Windows操作系統(tǒng)下使用Visual Basic語言進行監(jiān)控軟件的設計開發(fā),將LIBNODAVE的使用具體化、實際化。
LIBNODAVE提供了PROFIBUS、MPI、以太網等不同通信方式的接口函數,而由于以太網具有傳輸速率高、傳輸距離遠、可靠性高、開放性好、擴展靈活、方便等優(yōu)點[5],文中選擇使用CP443以太網模塊進行以太網通訊。下面將對程序中關鍵功能的實現(xiàn)函數進行重點講解。
2.1連接建立
上位機與PLC之間連接建立的主要程序如下所示。
ph=openSocket(102,IP_address)’打開102端口
If (ph>0) Then
di=daveNewInterface(ph,ph,“IF1”,0,122,2)
’建立新接口
res=daveInitAdapter(di) ’初始化適配器
If res=0 Then
dc=daveNewConnection(di,2,Rack,Slot)
’建立新連接
res=daveConnectPLC(dc)’連接PLC
End If
End If
openSocket(ByVal port As Long,ByVal peer As String)函數中,由于西門子以太網中的ISO on TCP協(xié)議所使用的數據傳輸端口為102[6],所以port被設置為102,而peer則為PLC的以太網地址。
daveNewInterface(ByVal fd1 As Long,ByVal fd2 As Long,ByVal name As String,ByVal localMPI As Long,ByVal protocol As Long,ByVal speed As Long)函數中,fd1、fd2和name設為默認值;由于是以太網通訊,所以localMPI設置為0;protocol表示協(xié)議類型常數,以太網對應的為122;speed表示速度常數,以太網對應的為2。
daveNewConnection(ByVal di As Long,ByVal mpi As Long,ByVal Rack As Long,ByVal Slot As Long)函數中,當連接單個PLC時,mpi固定為2,而Rack為PLC機架號,Slot為PLC的CPU槽位號。
2.2連接斷開
上位機與PLC之間連接斷開的主要程序如下所示。
If dc<>0 Then
res=daveDisconnetPLC(dc) ’斷開PLC
Call daveFree(dc)’釋放內存
dc=0
End If
If di<>0 Then
res=daveDisconnetAdapter(di) ’斷開適配器
Call daveFree(di)’釋放內存
di=0
End If
If ph<>0 Then
res=closeSocket(ph)’關閉端口
ph=0
End If
daveFree(ByVal item As Long)過程中,調用相應變量,對其釋放內存。
closeSocket(ByVal fh As Long)函數中,調用ph這一返回變量,關閉數據傳輸端口102。
2.3數據讀取
實際情況中,幾乎所有數據都是從PLC的數據塊(DB)、位存儲區(qū)(Markers)、輸入映像區(qū)(Inputs)和輸出映像區(qū)(Outputs)中讀取,因而針對上述4個區(qū)域,開發(fā)讀取功能,并可通過BOOL、BYTE、INT、WORD、DINT、DWORD以及REAL#7種形式讀取。
以DB讀取為例,BOOL、BYTE、WORD、REAL讀取形式的主要程序,如下所示。
Case “BOOL”
If daveReadBits(dc,&H84,DB_read(i),(start _
address_read(i)*8+bit_read(i)),1,0)=0 Then
read_text(i).Text=daveGetS8(dc)
End If
Case “BYTE”
If daveReadBytes(dc,&H84,DB_read(i),(start _
address_read(i),1,0)=0 Then
read_text(i).Text=daveGetS8(dc)
End If
Case “WORD”
If daveReadBytes(dc,&H84,DB_read(i),(start _
address_read(i),2,0)=0 Then
read_text(i).Text=Hex(daveGetS16(dc))
End If
Case “REAL”
If daveReadBytes(dc,&H84,DB_read(i),(start _
address_read(i),4,0)=0 Then
read_text(i).Text=daveGetFloat(dc)
End If
daveReadBits(ByVal dc As Long,ByVal area As Long,ByVal areaNumber As Long,ByVal start As Long,ByVal numBytes As Long,ByVal buffer As Long)函數中,area為區(qū)域常數,DB對應的為&H84(Inputs對應&H81,Outputs對應&H82,Markers對應&H83);areaNumber為DB塊號(若為Inputs、Outputs以及Markers時,設置為0);start為數據起始地址;numBytes為讀取Byte的數目;buffer為數據緩沖區(qū),設置為0。該函數用來進行位的讀取操作。
daveReadBytes(ByVal dc As Long,ByVal area As Long,ByVal areaNumber As Long,ByVal start As Long,ByVal numBytes As Long,ByVal buffer As Long)函數與daveReadBits基本相同,只是該函數是用來進行字節(jié)的讀取操作。
函數daveGetS8獲取一個字節(jié)(BYTE型),daveGetS16獲取2個字節(jié)(INT型與WORD型),daveGetS32獲取4個字節(jié)(DINT型與DWORD型),daveGetFloat獲取實型量(REAL型)。
2.4數據寫入
文中設計數據向DB、Markers、Inputs和Outputs中寫入的功能,并可通過BOOL、BYTE、INT、WORD、DINT、DWORD以及REAL 7種形式寫入。
以Markers寫入為例,BOOL、BYTE、WORD、REAL寫入形式的主要程序,如下所示。
Case “BOOL”
a1=CByte(write_text(i).Text)
res=daveWriteBits(dc,&H83,0,(startaddress_
write(i)*8+bit_write(i)),1,a1)
Case “BYTE”
a=davePut8(writebuffer(1),write_text(i).
Text)
res=daveWriteBytes(dc,&H83,0,(startaddress_
write(i),1,writebuffer(1))
Case “WORD”
a=davePut16(writebuffer(1),HEX_to_DEC(write_text(i).Text))
res=daveWriteBytes(dc,&H83,0,(startaddress_
write(i),2,writebuffer(1))
Case “REAL”
a=davePutFloat(writebuffer(1),write_text(i).Text)
res=daveWriteBytes(dc,&H83,0,(startaddress_
write(i),4,writebuffer(1))
daveWriteBits(ByVal dc As Long,ByVal area As Long,ByVal areaNumber As Long,ByVal start As Long,ByVal numBytes As Long,ByRef buffer As Byte)函數中,area為區(qū)域常數;areaNumber為DB塊號;start為數據起始地址;numBytes為寫入Byte的數目;buffer為數據緩沖區(qū),設置為一個Byte。該函數用來進行位的寫入操作。
daveWriteBytes(ByVal dc As Long,ByVal area As Long,ByVal areaNumber As Long,ByVal start As Long,ByVal numBytes As Long,ByRef buffer As Byte)函數與daveWriteBits基本相同,只是該函數是用來進行字節(jié)的寫入操作。
函數davePutS8放置一個字節(jié)(BYTE型),davePutS16放置2個字節(jié)(INT型與WORD型),davePutS32放置4個字節(jié)(DINT型與DWORD型),davePutFloat放置實型量(REAL型)。
2.5實時曲線監(jiān)控
使用Steema Software公司開發(fā)的圖表圖形組件TeeChart 2010來實現(xiàn)曲線監(jiān)控功能。TeeChart提供上百種2D和3D圖形風格、40余種數學和統(tǒng)計功能,加上無限制的軸和多種調色板組件可以選擇,以及20余種用于圖表操作的工具,將圖表制作與操作功能發(fā)揮得淋漓盡致,為程序設計人員提供了一個高效、直觀、節(jié)省時間的編程接口[7]。以下為該功能的主要程序。
TeeCommander1.Chart=TChart1
’啟用TeeCommander功能
TeeListBox1.Chart=TChart1
’啟用TeeListBox功能
TChart1.Axis.Bottom.SetMinMax Now,DateAdd
(“s”,20,Now) ’設置X軸時間范圍
With TChart1.Axis.Bottom
.Labels.DateTimeFormat=”yy-mm-dd HH:MM:SS”
’X軸格式顯示為年月日 時分秒
.Labels.MultiLine=True ’標簽分行顯示
End With
With TChart1.Series(Index)
.AddXY Now,mainform.read_text(Index+1),””,
clTeeColor’按X軸時間,Y軸數值繪制折線圖
End With
監(jiān)控系統(tǒng)對PLC中以30 ms為周期產生隨機數的地址進行讀取測試,如圖1所示。
圖1 實時曲線界面
通過放大曲線圖,可以更加直觀地觀察每s數據的變化情況,并可以將曲線圖存入相連的數據庫中,供日后查詢歷史曲線使用。
如圖2所示,文中所設計開發(fā)的監(jiān)控系統(tǒng),已在某冷軋廠投入使用,目前運行穩(wěn)定。該系統(tǒng)投入使用之后,工程師在無需打開任何西門子相關軟件的情況下,通過以太網通訊,輸入PLC地址,建立好連接后,雙擊變量名稱進入數據讀取或數據寫入界面,輸入具體地址與變量類型,即可對PLC中指定地址的數據進行讀寫操作。由于系統(tǒng)是與數據庫相連,從而可將PLC設置、變量名稱、變量地址等保存在數據庫中,之后打開軟件時載入所保存的配置,方便直接使用。
通過系統(tǒng)中的曲線監(jiān)控,工作人員還可以實時直觀地觀察數據動態(tài),并載入所保存的歷史數據曲線,進行分析比較,對生產管理起到一定的輔助作用。
圖2 監(jiān)控系統(tǒng)界面
文中將LIBNODAVE以太網通訊技術與S7-400系列PLC兩者有機地結合在一起,開發(fā)了實時高速、擴展性強、操作方便的監(jiān)控系統(tǒng),并在實際中得到了很好地應用。鑒于LIBNODAVE的免費、開源、穩(wěn)定、靈活等特點,LIBNODAVE完全可以取代PRODAVE來開發(fā)基于西門子PLC的監(jiān)控系統(tǒng)軟件,從而降低成本,并擺脫西門子相關產品的局限性。文中選取了國內研究較少的LIBNODAVE作為研究對象,其研究成果可為鋼鐵行業(yè)其他企業(yè)生產現(xiàn)場的升級改造和建設提供有益合理的借鑒,而對其他領域實現(xiàn)監(jiān)控系統(tǒng)的構建也具有一定的參考價值。
參考文獻:
[1]趙軍,時良平,黃春陽.基于Prodave技術的西門子PLC監(jiān)控調試軟件開發(fā).自動化應用,2011(10):26-28.
[2]任思成,王書鶴,亓克貴.新一代工業(yè)過程控制軟件接口標準—OPC技術.儀器儀表學報,2002,23(3):265-267.
[3]沈世斌.基于PLC自由口通信的應用.儀表技術與傳感器,2004(12):26-28.
[4]周廣穎,張金金,閆?。贚IBNODAVE的上位機與西門子PLC的通信.微計算機信息,2010,26(11-1):28-30.
[5]張曉麗,馬俊,劉軼斐.煉鋼廠實時數據通信系統(tǒng)的研究與開發(fā).儀器儀表學報,2005,26(8):553-556.
[6]MARSHALL T ROSE,DWIGHT E.Cass.ISO Transport Service on top of the TCP Version:3.May 1987.
[7]羊昌燕,翟正軍,陸艷洪.總線數據采集系統(tǒng)事后分析處理軟件設計與實現(xiàn).測控技術,2012,31(11):84-87.