祝廣場 余小敏
(華電電力科學研究院中南分院)
基于Prodave的西門子PLC與PC以太網通信研究
祝廣場 余小敏
(華電電力科學研究院中南分院)
提出了基于Prodave工具包的西門子PLC與PC的通信方法,該方法不需要在PLC側進行編程,只需要在PC側采用高級語言調用若干函數即可,成本較低且通信可靠。
以太網通信 西門子PLC Prodave
S7-300 PLC擁有高性能的處理器、豐富的IO和通信模塊,在工業控制中應用廣泛,但它的人機接口功能較弱。如果將PLC與PC通過通信連接起來,用PC作為上位機,通過對PLC的數據存儲器中各區域進行讀取與寫入,實現系統的監控、人機接口通信等功能,就能夠組成功能強、可靠性高、成本低的控制系統[1]。
目前,由于西門子公司沒有公開通信協議,上位機程序設計主要有兩種方式:采用專門的組態軟件(如WinCC、組態王等)開發或是通過編程語言自行開發。第1種方法操作簡單、效率高,對開發人員的要求相對較低,但成本較高;第2種方法相對復雜,要求開發者具有較高的編程水平,開發周期長,但與第1種方法相比具有靈活、成本低的優點[2]。
Prodave(Proces Data Traffic)是西門子公司開發的S7系列PLC和PC通信的工具包,它為PLC和PC通信提供了一種橋梁,既避免了組態軟件的高昂成本,又不要求開發人員有很高的編程水平。筆者通過對Prodave進行研究,以S7315-2PN/DP PLC為下位機,采用VS2008編程工具,開發了一種PLC與PC機之間的以太網通信軟件。
Prodave是用于PC與S7系列PLC間數據通信的工具軟件包[3]。Prodave提供了大量基于Windows操作系統的DLL函數,以解決PLC與PC之間數據交換和處理的問題,可以在高級語言編程環境中調用這些函數來建立或斷開通信連接、讀寫CPU的系統存儲器。它具有以下特點:
a. 支持PC上的標準以太網卡和Simatic S7的以太網口(CPU31XX-PN、CP31X-PN、CP343和CP443);
b. 能讀寫PLC中DB塊和內存的數據;
c. 支持S7-200 PLC、S7-300 PLC和S7-400 PLC;
d. PLC側無需編程,只需在PC中編寫程序,調用Prodave的DLL即可,支持VB、VC及DEPHI等高級語言。
連接PLC函數LoadConnection_ex6()用于初始化適配器,檢查是否裝載了驅動,并將選擇的通信接口激活。可以用來通過MPI或IP地址建立對PLC的連接。函數原型為LoadConnection_ex6(int ConNr, char* pAccessPoint, int ConTableLen, CON_TABLE_TYPE * pConTable)。ConNr是連接PLC的序號(0~63),最多可以連接64個;pAccessPoint為訪問點,“S7ONLINE”表示MPI方式,“1”表示TCP/IP方式,“2”表示MAC方式;ConTableLen為地址表的長度;pConTable為地址表,用于存放PLC的地址。
激活PLC函數SetActiveConnection_ex6()用于激活PLC和PC之間建立的連接。函數原型為int SetActiveConnection_ex6(int ConNr),ConNr是連接序號。
讀取PLC數據函數。函數db_read_ex6()和field_read_ex6()分別用來讀取PLC中的任意存儲區數據和DB數據,可采用字、雙字的方式,讀取的數據放在PC的數據緩沖區。field_read_ex6()的函數原型為int field_read_ex6 (char FieldType, unsigned short BlkNr, unsigned short StartNr, unsigned long Amount, unsigned long BufLen, unsigned char * pBuffer, unsigned long * pDatLen),其參數見表1,db_read_ex6()與它類似。

表1 讀取PLC數據函數參數
寫數據至PLC。函數field_write_ex6()和db_write_ex6()用于向PLC中寫入數據,其參數和讀取PLC數據函數類似。
位狀態讀取和寫入函數。函數mb_bittest_ex6()和mb_setbit_ex6()分別用來讀取和寫入PLC中的某個位變量,mb_bittest_ex6()的函數原型為int mb_bittest_ex6 (unsigned short MbNr, unsigned short BitNr, int * pValue),其中MbNr為字節號,BitNr為位號,pValue為狀態(“1”表示TRUE,“0”表示FALSE)。兩個函數的參數意義相同。
3.1 動態鏈接庫及其特點
動態鏈接庫(Dynamic Link Library, DLL)是微軟公司在微軟視窗操作系統中實現共享函數庫概念的一種方式。這些庫函數的擴展名是.DLL、.OCX(包含ActiveX控制的庫)或者.DRV(舊式的系統驅動程序)。
動態鏈接庫是不能直接執行的,也不能接收消息,它只是一個獨立的文件,它提供了一種方法使進程可以調用不屬于其可執行代碼的函數。函數的可執行代碼位于一個DLL中,該DLL包含一個或多個已被編譯、鏈接并與使用它們的進程分開存儲的函數。DLL還有助于共享數據和資源。多個應用程序可同時訪問內存中單個DLL副本的內容。
動態鏈接庫在電腦中可以更容易地將更新應用于各個模塊,而不會影響該程序的其他部分。例如,一個大型的軟件,如果把整個數百MB甚至數GB的程序代碼都放在一個應用程序里,日后的修改工作將會十分費時,而如果把不同功能的代碼分別放在數個動態鏈接庫中,無需重新生成或安裝整個程序就可以應用更新,更有利于軟件的模塊化設計。
3.2 Visual Studio2008對Prodave6.0 DLL文件的引用
在VS2008中調用DLL時,需要添加如下代碼:
using System.Runtime.InteropServices; //用于調用動態庫的接口;
在調用DLL中的某個函數時,首先必須要有一個聲明,使用的是DllImport關鍵字:[DllImport("Prodave6.dll")],代碼中DllImport關鍵字的作用是告訴編譯器入口點在哪里,并將打包函數捆綁在類Prodave中。
然后對函數進行聲明:
public extern static int LoadConnection_ex6(int ConNr, string pAccessPoint, int ConTableLen, ref CON_TABLE_TYPE pConTable);// 連接PLC操作;
進行以上操作之后,便可以在程序中使用DLL中的函數了。
3.3 西門子STEP7對PLC的設置
在進行通信之前,需要對西門子的PG/PC接口進行設置。在開始菜單中,打開“設置PG/PC接口”(圖1),在選項中選擇TCP/IP所對應的網卡,確定即可。
3.4 PLC和PC之間的通信流程
在PLC和PC進行通信之前,需要對通信參數進行設置,筆者采用以太網通信方式,故在監控界面中輸入PLC的IP地址,之后才能建立連接。建立連接之后,系統啟動定時器和數據庫,定時器以一定間隔執行讀寫函數和數據處理函數,并在畫面中實時顯示;數據庫對需要記錄的數據及時保存。定時器函數的執行周期可以在畫面中設置。

圖1 西門子STEP7中對PLC的設置
在通信過程中,系統每執行一次函數,都會返回一個代碼,軟件通過對代碼進行解析,判斷函數是否被正確執行,如果錯誤,則會觸發報警提示,并中斷此函數的執行。
4.1 PC和PLC通信程序要實現的功能
上位機程序框架如圖2所示。

圖2 PC和PLC通信程序框架
定時器周期執行函數。本系統中,定時器更新周期設定為100ms和500ms,其中,數據讀寫函數周期為100ms,以適應工業控制中快速變化的參數;數據庫記錄函數和狀態信息顯示函數周期為500ms。
畫面設置、操作和顯示。本部分主要實現人機接口功能。參數設置主要是通信方式和通信參數的選擇,分為TCP/IP、MPI和MAC共3種通信方式,筆者選用TCP/IP方式,則需把PLC的IP地址設置到畫面中,在設置過程中,必須使PLC和PC的IP地址在同一網段。實時趨勢顯示系統中主要設備參數的實時數據,采TeeChart控件實現,可以同時顯示8條實時曲線。報警光字牌顯示系統中重要的報警信息,當報警觸發時,以閃爍方式做出提醒。操作記錄顯示模塊記錄軟件運行中,畫面中的主要操作,包括操作人、操作時間及操作事件等信息。模擬鍵盤為軟件的輸入提供了操作接口。
PLC信息。主要包括PLC內部的狀態信息、數據塊信息及診斷緩沖區信息等。
輔助功能。主要包括程序對Prodave動態鏈接庫的調用和數據處理函數。
4.2 PC和PLC通信程序的實現
采用Prodave進行PC和PLC通信的流程如圖3所示。

圖3 PC和PLC的通信流程
由于通信過程中PLC側不需要編寫程序,因此只需在PC側進行編程即可。建立并激活鏈接的程序代碼如下:
short ConNr = 6;//定義鏈接號,0~63可選;
string AccessPoint = "S7ONLINE"; // 默認訪問點為“S7ONLINE”;
ConTable.AdrType = 2; //PC和PLC的通信方式,此處選擇為TCP/IP;
ConTable.SlotNr = 2; //PLC的插槽號;
ConTable.RackNr = 0; //PLC的機架號;
RetValue_ConnectPlc=ProdaveTest.Prodave.LoadConnection_ex6(ConNr, AccessPoint, ConTableLen, ref ConTable);//連接PLC;
以上為PC連接PLC的函數代碼,RetValue_ConnectPlc為函數的返回值,若為“0”表示執行成功。連接成功之后,需要將此鏈接激活,代碼為:
RetValue_ActivePLC=ProdaveTest.Prodave.SetActiveConnection_ex6(UConNr);//激活鏈接;
若激活成功,則可繼續進行數據傳輸。如果函數執行不成功,可以通過GetErrorMsg()函數來確定返回值所表示的意思。
設計中,PLC中的數據存放在DB1數據塊中,以下程序代碼讀取的是DB1中從地址0開始的8個浮點型數據:
UInt16 BlkNr = 1;//PLC中DB數據庫塊的序號;
Prodave.DatType DType = Prodave.DatType.BYTE;//以字節的形式讀取數據;
UInt16 StartNr = 0;//DB數據塊中要讀取數據的起始地址號;
UInt32 pAmount = 32;//讀取數據的數量;
UInt32 BufLen = 32;//定義緩沖區長度;
byte[] pReadBuffer = new byte[32];//開辟存儲空間;
UInt32 pDatLen = 0;//初始化緩沖區;
RetValue_ReadDB=ProdaveTest.Prodave.db_read_ex6(BlkNr, DType, StartNr, ref pAmount, BufLen, pReadBuffer, ref pDatLen);//讀取函數;
讀取PLC中M存儲區數據的代碼為:
RetValue_ReadMzone=ProdaveTest.Prodave.field_read_ex6(FType, BlkNr, StartNr, pAmount, BufLen, pReadBuffer, ref pDatLen);//讀取M存儲區數據;
其參數和讀取DB數據的函數類似。值得注意的是,在PLC系統中,很多設備的狀態變量、報警變量等都是以BOOL型數據存在的,在Prodave工具包中,有專門讀寫PLC中某一位的函數,但是,如果狀態變量較多,需要反復調用函數,效率太低,使用field_read_ex6()函數可以解決這一難題。在PLC中定義變量的時候,可以定義一段連續的存儲空間用來存放系統中的狀態變量,再采用field_read_ex6()函數以字節的形式讀取,進行簡單的邏輯運算之后即可得到一個字節中8個位變量的信息。
通過對西門子Prodave工具包的研究,提出了西門子PLC和PC的以太網通信方法。Visual Studio2008編程方便、性能穩定、可靠性高,通過它對Prodave動態鏈接庫的調用,實現了PC對PLC的讀寫操作。編寫的以太網通信程序界面友好、人機交互方便、數據庫功能較強。筆者提出的通信方法,對西門子S7-200 PLC、S7-300 PLC和S7-400 PLC具有通用性,可以推廣應用。
[1] 馬健,韓曉華,黃旭平,等.PC上位機與S7-300系列PLC進行通訊的研究[J].制造技術與機床,2011,(3):169~172.
[2] 趙軍,時良平,黃春陽.基于Prodave技術的西門子PLC監控調試軟件開發[J].自動化應用,2011,(10):26~28.
[3] 唐東明,聶詩良.PRODAVE在S7-300PLC監控系統中的應用[J].可編程控制器與工廠自動化, 2007,(8):41~42.
TheStudyonEthernetCommunicationbetweenSiemensPLCandPCBasedonProdave
ZHU Guang-chang, YU Xiao-min
(ZhongnanBranch,HuadianElectricPowerResearchInstitute)
The Prodave toolkit-based communication between Siemens PLC and PC was proposed, which asks for no programming at PLC and only adopts high-level language to call some functions at PC. This communication method costs lower and has high reliability.
Ethernet communication, Siemens PLC, Prodave
TH862+.7
B
1000-3932(2017)04-0397-04
2016-10-10,
2016-10-31)
祝廣場(1984-),工程師,從事火電廠熱工自動化控制和保護工作,14815197@qq.com。