夏富平
摘要:上位PC機(jī)利用從PLC控制器實(shí)時(shí)采集的各項(xiàng)實(shí)時(shí)數(shù)據(jù),自動(dòng)監(jiān)控現(xiàn)場(chǎng)各種機(jī)械設(shè)備和傳感器設(shè)備的運(yùn)行狀態(tài),并根據(jù)設(shè)備的實(shí)時(shí)狀態(tài)進(jìn)行有效合理的統(tǒng)計(jì)分析,從而實(shí)現(xiàn)工業(yè)控制系統(tǒng)的自動(dòng)化和信息化管理,這已成為工業(yè)控制領(lǐng)域的一個(gè)重量的發(fā)展方向。本文以西門子的Prodave 組件為基礎(chǔ),設(shè)計(jì)并實(shí)現(xiàn)了一種上位機(jī)與PLC控制器通訊的通用接口,項(xiàng)目實(shí)踐證明,該通訊接口穩(wěn)定性好、擴(kuò)展性強(qiáng)且實(shí)際操作靈活方便,便于用戶將此通訊接口集成至各類工業(yè)控制系統(tǒng)中。
關(guān)鍵詞: simatic;prodave;PLC;C#;設(shè)計(jì)模式
1 ?概述
自動(dòng)化工業(yè)控制領(lǐng)域中PLC作為一種高效、靈活、穩(wěn)定的控制器,有著廣泛的應(yīng)用。以PLC控制器為核心,上位PC機(jī)為實(shí)時(shí)監(jiān)控體的控制系統(tǒng)已經(jīng)成為工業(yè)自動(dòng)化PLC控制系統(tǒng)的一個(gè)重要發(fā)展方向。實(shí)現(xiàn)PLC與PC的通信可以實(shí)現(xiàn)向上一級(jí)提供諸如工藝流程圖、動(dòng)態(tài)數(shù)據(jù)畫面、報(bào)表顯示等多種窗口技術(shù),使PLC控制系統(tǒng)具有良好的人機(jī)交互界面,通過(guò)上位機(jī)對(duì)PLC數(shù)據(jù)的讀寫監(jiān)控實(shí)現(xiàn)現(xiàn)場(chǎng)數(shù)據(jù)的采集、傳送以及生產(chǎn)過(guò)程調(diào)度的自動(dòng)化和信息化,其應(yīng)用前景十分廣闊。
自動(dòng)化生產(chǎn)線控制系統(tǒng)中通常會(huì)采用工業(yè)組態(tài)軟件開(kāi)發(fā)上位機(jī)系統(tǒng),PLC作為下層控制設(shè)備,目前市場(chǎng)上通信組態(tài)系統(tǒng)結(jié)構(gòu)復(fù)雜,價(jià)格昂貴,應(yīng)用繁瑣,且不具備一定的通用性。隨著工業(yè)以太網(wǎng)的深入發(fā)展,相較于品種繁多的組態(tài)軟件來(lái)說(shuō),高級(jí)編程語(yǔ)言更加適合開(kāi)發(fā)具有實(shí)時(shí)響應(yīng)、功能豐富、擴(kuò)展方便、高靈活性和易于移植等技術(shù)需求的上位機(jī)系統(tǒng)。為此,需要設(shè)計(jì)一種與PLC通信的通用接口,用戶采用高級(jí)編程語(yǔ)言開(kāi)發(fā)的上位機(jī)系統(tǒng)能夠運(yùn)用此通訊接口與PLC進(jìn)行數(shù)據(jù)通信。
本文以造紙行業(yè)中紙卷輸送控制系統(tǒng)的設(shè)計(jì)方法為基礎(chǔ),對(duì)西門子S7系列中的PLC與上位機(jī)通訊的原理作深入細(xì)致的研究,依據(jù)Visual Studio 2005作為開(kāi)發(fā)平臺(tái)用C#語(yǔ)言實(shí)現(xiàn)了PLC與上位PC機(jī)的通用通訊接口,該接口具有穩(wěn)定性好、易于擴(kuò)展維護(hù)且操作方便的特點(diǎn),對(duì)于需要用上位機(jī)與PLC通訊的工程設(shè)計(jì)人員來(lái)說(shuō),具有一定的借鑒作用。
2 ?西門子Prodave組件介紹
Prodave是“Process Data Traffic”(過(guò)程數(shù)據(jù)交換)的縮寫形式,可以用于西門子S7-200、S7-300/400、M7和C7等S7系列PLC的通訊,通過(guò)MPI通信處理器、PC/MPI適配器和以太網(wǎng)絡(luò)可以方便地在PLC與PC之間建立數(shù)據(jù)鏈接。Prodave的動(dòng)態(tài)鏈接庫(kù)(Dynamic Link Library,DLL)提供了大量的基于Windows系統(tǒng)的DLL函數(shù),為用戶提供了解決上位機(jī)與PLC之間的數(shù)據(jù)交換與數(shù)據(jù)處理的詳細(xì)方案。
表1為項(xiàng)目中涉及到的Prodave組件的簡(jiǎn)單介紹。
現(xiàn)階段項(xiàng)目中使用的Prodave組件版本主要有Prodave5.x系列和Prodave6.2系列。其中,Prodave6.2可用于Window 64位操作系統(tǒng),且可以采用MPI-Profibus或者以太網(wǎng)通信,而其他版本的組件只能安裝于Windows 32位操作系統(tǒng)的上位機(jī)中,一般采用MPI-Profibus通信方式。
Prodave組件的函數(shù)分為基本函數(shù)、數(shù)據(jù)處理函數(shù)和電話服務(wù)函數(shù),基本函數(shù)主要包含建立連接、關(guān)閉連接、激活連接、讀取PLC地址數(shù)據(jù)以及寫入PLC地址數(shù)據(jù)的函數(shù)。
3 ?通用接口的詳細(xì)設(shè)計(jì)方案
3.1 現(xiàn)有設(shè)計(jì)問(wèn)題
由于上位機(jī)與PLC通信需要用到的Prodave組件版本過(guò)多,導(dǎo)致上位機(jī)與PLC通信時(shí)接口不盡相同,代碼復(fù)用能力差。當(dāng)上位機(jī)硬件設(shè)備升級(jí)或者更換Prodave通訊組件時(shí),需要修改上位機(jī)控制系統(tǒng)中與PLC通信的模塊代碼。在紙卷輸送控制系統(tǒng)的設(shè)計(jì)過(guò)程中,由于每個(gè)項(xiàng)目的工藝設(shè)計(jì)和功能要求不同,工程設(shè)計(jì)人員在做項(xiàng)目方案設(shè)計(jì)和設(shè)備選型時(shí),選用西門子的CPU型號(hào)也不盡相同,因此網(wǎng)絡(luò)設(shè)計(jì)人員需要根據(jù)不同的工藝需求采用不同版本的Prodave組件來(lái)編寫與PLC通信的代碼。圖1為上位機(jī)與PLC控制器現(xiàn)有通訊結(jié)構(gòu)。
3.2 通信接口設(shè)計(jì)要求
由于與PLC通信的Prodave組件版本多,對(duì)應(yīng)的接口函數(shù)也不盡相同,因此對(duì)上位機(jī)來(lái)說(shuō),新的通用接口需要滿足以下設(shè)計(jì)要求:
①通用性能強(qiáng)。能夠滿足現(xiàn)階段項(xiàng)目中使用的不同Prodave組件的要求,當(dāng)通信組件發(fā)生改變時(shí),原有通信模塊不用發(fā)生變化;
②有較強(qiáng)的靈活性和擴(kuò)展性能。如果未來(lái)出現(xiàn)新的Prodave組件的升級(jí),現(xiàn)有系統(tǒng)中涉及的PLC通信模塊代碼不用發(fā)生變化,僅需要按接口要求增加新的Prodave組件對(duì)象即可;
③封裝性好,利于模塊移植。通用接口對(duì)應(yīng)的PLC通信模塊可以非常方便的遷移至其他項(xiàng)目中,盡可能少的修改原有模塊代碼。
3.3 通信接口設(shè)計(jì)方案
通過(guò)深入分析可以得知:不論是哪一種Prodave組件,上位機(jī)控制系統(tǒng)均希望此組件能完成對(duì)PLC控制器的建立連接、讀取數(shù)據(jù)、寫入數(shù)據(jù)和關(guān)閉連接的功能,而各種版本的Prodave組件均能滿足此種功能,不同的是接口函數(shù)名稱以及輸入?yún)?shù)各不相同。因此,可以按照軟件設(shè)計(jì)模式中的工廠設(shè)計(jì)方法,將涉及到與PLC操作的各個(gè)對(duì)象中操作函數(shù)按一定的規(guī)則抽象出來(lái),形成一個(gè)通用的接口對(duì)象。圖2是改進(jìn)后上位機(jī)系統(tǒng)與PLC的通訊結(jié)構(gòu)。
3.4 通用接口的設(shè)計(jì)實(shí)現(xiàn)
在實(shí)現(xiàn)通用接口對(duì)象前,首先需要分析現(xiàn)有各版本Prodave 組件對(duì)應(yīng)的接口函數(shù),然后再根據(jù)各接口函數(shù)再抽象成對(duì)應(yīng)的接口對(duì)象。
①Prodave5.x組件。
主要包含有加載與激活連接、讀取與寫入PLC數(shù)據(jù)以及卸載連接的接口函數(shù)。
protected extern static int load_tool(byte nr, string device, byte[,] adr_table)
protected extern static int new_ss(byte no)
protected extern static int unload_tool()
protected extern static int d_field_read(int dbno, int dwno, int amount, byte[] buffer)
protected extern static int d_field_write(int dbno, int dwno, int amount, byte[] buffer)
②Prodave6.x組件。
主要包含有加載與激活連接、讀取與寫入PLC數(shù)據(jù)以及卸載連接的接口函數(shù)。
protected extern static int LoadConnection_ex6(int ConNr, string pAccessPoint, int ConTableLen, ref CON_TABLE_TYPE pConTable)
protected extern static int SetActiveConnection_ex6(UInt16 ConNr)
protected extern static int UnloadConnection_ex6(UInt16 ConNr)
protected extern static int field_read_ex6(FieldType FType, UInt16 BlkNr, UInt16 StartNr, UInt32 pAmount, UInt32 BufLen, byte[] pBuffer, ref UInt32 pDatLen)
protected extern static int field_write_ex6(FieldType FType, UInt16 BlkNr, UInt16 StartNr, UInt32 pAmount, UInt32 BufLen, byte[] pBuffer)
從上述各版本Prodave組件對(duì)應(yīng)的接口函數(shù)可知,Prodave5.x系列對(duì)應(yīng)的主要接口函數(shù)的函數(shù)名稱與對(duì)應(yīng)參數(shù)數(shù)量與類型與Prodave6.x系列對(duì)應(yīng)的主要接口函數(shù)函數(shù)名稱與對(duì)應(yīng)參數(shù)數(shù)量與類型基本不相同。因此需要在各個(gè)引用Prodave組件對(duì)應(yīng)的接口對(duì)象之上還需要抽象一個(gè)適配對(duì)象,目的在于將原始接口函數(shù)與加工后的接口函數(shù)分離開(kāi),將各組件使用的接口函數(shù)的函數(shù)名稱與函數(shù)參數(shù)數(shù)量盡量保持一致。
圖3為對(duì)應(yīng)組件的類設(shè)計(jì)示意圖,從圖中可以看出,每一種Prodave組件的接口函數(shù)均有一個(gè)適配對(duì)象與之對(duì)應(yīng),如Prodave5.0的接口對(duì)象PLCProdave5D0與適配對(duì)象PLCOperation5D0對(duì)應(yīng),同理Prodave5.6的接口對(duì)象PLCProdave5D6與適配對(duì)象PLCOperation5D6對(duì)應(yīng), PLCProdave6D0與適配對(duì)象PLCOperation6D0對(duì)應(yīng)。從圖3中還可以看出,每一類適配對(duì)象對(duì)應(yīng)的連接函數(shù)(ConnectPLC)、重新連接函數(shù)(ReConnectPLC)、讀取PLC數(shù)據(jù)函數(shù)(ReadData)、寫入PLC數(shù)據(jù)函數(shù)(WriteData)以及關(guān)閉連接函數(shù)(CloseConnectPLC)對(duì)應(yīng)的函數(shù)名稱、函數(shù)對(duì)應(yīng)參數(shù)數(shù)量和類型均相同,每個(gè)適配類使用的屬性名稱和數(shù)量以及定義的事件名稱和返回的參數(shù)也相同。因此,可以在對(duì)應(yīng)的適配器對(duì)象之上編寫統(tǒng)一的通用接口對(duì)象IPLCOperation。適配對(duì)象PLCOperation5D0、PLCOperation5D6和PLCOperation6D0除了繼承各自對(duì)應(yīng)的接口對(duì)象外,還需要實(shí)現(xiàn)IPLCOperation和IDisposible接口,其中實(shí)現(xiàn)IDisposible接中主要用于在關(guān)閉對(duì)象時(shí)要求系統(tǒng)顯示釋放對(duì)應(yīng)內(nèi)存等重要資源。
從圖3Prodave組件類設(shè)計(jì)圖中,將各適配器對(duì)象相同的部分抽象出來(lái)可以非常容易得到通用的PLC接口對(duì)象如圖4所示。
通用接口中用到的其他相關(guān)對(duì)象如圖5所示
以下代碼為通用接口類的具體實(shí)現(xiàn)方式:
public interface IPLCOperation
{
event PLCMessageEventHandler OnPLCMessageChanged;
bool Connected ?{get;}
PLCType CurrPLCType { get; }
bool ConnectPLC();
bool CloseConnectPLC();
bool ReConnectPLC();
bool ReadData(int dbno, string strAddr, ref string retBoolValue);
bool ReadData(int dbno, int dwno, int amount, ref byte[] buffer);
bool WriteData(int dbno, string strAddr);
bool WriteData(int dbno, string strAddr, bool blnValue);
bool WriteData(int dbno, int dwno, int amount, ulong data);
bool WriteData(int dbno, int dwno, int amount, byte[] buffer);
}
最后建立了一個(gè)PLC操作工廠類,完全將各種具體的PLC接口實(shí)現(xiàn)對(duì)象封裝起來(lái),主要是根據(jù)外部參數(shù)的不同創(chuàng)建不同的具體的PLC操作對(duì)象實(shí)例,以下代碼為工廠類的具體實(shí)現(xiàn)代碼:
public class PLCFactory
{
public static IPLCOperation CreatePLC(PLCType plcType, PLCConnItem plcConnParams)
{
IPLCOperation currPLCOperation;
switch (plcType)
{
case PLCType.PLC_5D0:
currPLCOperation = new PLCOperation5D0(plcConnParams);
break;
case PLCType.PLC_5D6:
currPLCOperation= new PLCOperation5D6(plcConnParams);
break;
case PLCType.PLC_6D0:
currPLCOperation = new PLCOperation6D0(plcConnParams);
break;
default:
currPLCOperation = new PLCOperation6D0(plcConnParams);
break;
}
return currPLCOperation;
}
}
上述代碼將PLC組件類型和PLC連接參數(shù)對(duì)象傳入PLC工廠對(duì)象中,由工廠對(duì)象根據(jù)PLC組件類型來(lái)實(shí)例化不同的PLC操作類。當(dāng)然上述實(shí)現(xiàn)實(shí)例化不同PLC操作類還可以使用反射的方法,在此不再贅述。
4 ?通用接口的具體操作實(shí)現(xiàn)
上位機(jī)控制系統(tǒng)只需要關(guān)注PLC通信通用接口的實(shí)現(xiàn)方式,因此在項(xiàng)目實(shí)際使用過(guò)程中,系統(tǒng)設(shè)計(jì)人員可以按以下方式使用。
4.1 PLC模塊初始化
在實(shí)際項(xiàng)目設(shè)計(jì)過(guò)程中,如某臺(tái)上位機(jī)控制系統(tǒng)需要與一個(gè)以上的PLC通信,此處可以在PLC通信模塊中,可以建立一個(gè)以PLC通用接口對(duì)象為元素的PLC接口集合,將控制系統(tǒng)需要使用的PLC通信接口封裝在此集合體中,方便程序遍歷PLC通用接口和存儲(chǔ)連接PLC需要的各種參數(shù)值,圖6為多個(gè)PLC通信接口對(duì)應(yīng)多個(gè)PLC的應(yīng)用場(chǎng)景:
private void InitialPLCModule()
{
CGlobal.PLCHelpers.Clear();
foreach (DataRow currRow in m_dtPLCConnParams.Rows)
{
//PLC連接參數(shù)初始化
PLCConnItem plcItem = new PLCConnItem();
plcItem.GongweiType = m_GongweiType;
plcItem.MobanNO = m_MobanNO;
plcItem.ByteBuffer = new byte[m_MaxBytesCount];
plcItem.DBUnit = m_DBUnit;
plcItem.Address=m_Address;
//建立一個(gè)PLC通用接口類,并將其放至集合中
IPLCOperation plcHelper = PLCFactory.CreatePLC(m_plcType, plcItem);
plcHelper.OnPLCMessageChanged += new
PLCMessageEventHandler(PLCHelper_OnPLCMessageChanged);
plcHelper.ConnectPLC();
plcItem.PLCHelper = plcHelper;
CGlobal.PLCHelpers.AddPLCConnItem(plcItem);
}
}
4.2 PLC數(shù)據(jù)讀取操作
當(dāng)PLC接口集合不為空時(shí),可以循環(huán)遍歷PLC接口集合中的通用接口類,并讀取對(duì)應(yīng)的PLC對(duì)應(yīng)地址塊中數(shù)據(jù)放置在指定的字節(jié)數(shù)組中。
private void ReadPLCData()
{
if (CGlobal.PLCHelpers == null || CGlobal.PLCHelpers.Count == 0) return;
byte[] bytBuffer;
foreach (PLCConnItem plcItem in CGlobal.PLCHelpers)
{
if (plcItem == null || plcItem.PLCHelper == null)
{ continue; }
if (plcItem.PLCHelper.Connected)
{
bytBuffer = new byte[plcItem.ByteBuffer.Length];
bool blnSucc=plcItem.PLCHelper.ReadData(plcItem.DBUnit, 0, plcItem.ByteBuffer.Length, ref bytBuffer);
if (blnSucc) plcItem.ByteBuffer = bytBuffer;
}
else{
CGlobal.DelayTime(1000);
plcItem.PLCHelper.ReConnectPLC();
}
}
}
4.3 PLC數(shù)據(jù)寫入操作
PLC數(shù)據(jù)寫入的方法比較簡(jiǎn)單,首先按工位類型和模板類型參數(shù)遍歷PLC接口集合中找到指定接口,然后調(diào)用對(duì)應(yīng)的接口函數(shù)WriteData即可。
CGlobal.PLCHelpers[m_GongweiType,m_MobanNO].PLCHelper.WriteData
(dbunit,dwno,amount,value);
4.4 釋放PLC模塊資源
當(dāng)需要釋放PLC接品資源時(shí),需要遍歷PLC接口集合,先關(guān)閉當(dāng)前連接,然后再銷毀對(duì)象即可。
if (CGlobal.PLCHelpers != null) CGlobal.PLCHelpers.Clear();
5 ?結(jié)論
以西門子的Prodave 組件為具體研究對(duì)象,結(jié)合軟件工程中的軟件設(shè)計(jì)模式思想,設(shè)計(jì)并實(shí)現(xiàn)了一種上位機(jī)與PLC通訊的通用接口,該通訊接口已成功應(yīng)用于福建聯(lián)盛紙業(yè)PM5&6,PM7,PM8、山東太陽(yáng)紙業(yè)PM19&20,24、安徽山鷹PM5&6等多套紙卷輸送控制系統(tǒng)中。實(shí)踐證明,該通訊接口可以使通訊模塊的代碼結(jié)構(gòu)清晰,穩(wěn)定性好、擴(kuò)展性和集成性強(qiáng)且實(shí)際操作靈活方便,可適應(yīng)復(fù)雜的項(xiàng)目工藝需求變化,具有一定的參考價(jià)值和應(yīng)用價(jià)值。
參考文獻(xiàn):
[1]程宏.福建聯(lián)盛紙業(yè)PM8輸送控制系統(tǒng)源碼,2012.
[2]程宏.山東太陽(yáng)紙業(yè)PM24輸送控制系統(tǒng)源碼,2014.
[3]王翔.設(shè)計(jì)模式-基于C#的工程化實(shí)現(xiàn)及擴(kuò)展[M].電子工業(yè)出版社,2012.
[4]葛新鋒,晉景濤.基于VB的上位機(jī)與PLC通信系統(tǒng)實(shí)現(xiàn),2009.
[5]趙曉明,徐立,邵威,夏春林.基于VC++的上位機(jī)與西門子系列PLC通信的研究[J].機(jī)電工程,2007.