夏正龍,耿 浩
(1.江蘇師范大學(xué) 電氣工程及其自動化學(xué)院,江蘇 徐州 221116;2.徐州上若科技有限公司 自動化事業(yè)部,江蘇 徐州 221116)
現(xiàn)代工控領(lǐng)域多采用數(shù)字化智能裝置代替?zhèn)鹘y(tǒng)的模擬儀表作為前端控制器,而數(shù)字智能裝置一般都具備獨自監(jiān)測監(jiān)控功能,能實時向上位集控后臺實時上傳工作狀態(tài)。當(dāng)前工控領(lǐng)域的集控方式由集中控制向分散控制,由分散管理向集中管理轉(zhuǎn)變。西門子公司的PLC(programmable logic controller)設(shè)備在工控領(lǐng)域應(yīng)用廣泛,其產(chǎn)品系列的豐富與可靠已經(jīng)得到了廣大用戶的信賴。目前工控領(lǐng)域控制的實時性要求越來越高,自然需要一個高速的通訊網(wǎng)絡(luò)。
隨著以太網(wǎng)通訊在工業(yè)控制領(lǐng)域的普及,其通訊速率高、可靠性高,在實際應(yīng)用中越來越廣泛。西門子系列PLC以太網(wǎng)通訊模塊有cp243,cp343,cp443。200SMART和1200自帶以太網(wǎng)口。西門子以太網(wǎng)協(xié)議眾多,有ISO,ISO-on-TCP,TCP,UDP等。ISO協(xié)議是西門子早期的以太網(wǎng)通訊協(xié)議,通訊使用的是MAC地址。TCP、UDP協(xié)議,屬于用戶自定義協(xié)議,PLC端和上位機都需要用戶寫程序。ISO-on-TCP協(xié)議是在TCP/IP協(xié)議層,按照ISO協(xié)議重新定義,通訊使用的是IP地址。因為PLC本身就支持ISO-on-TCP協(xié)議,所以PLC不用添加任何程序,只需要上位機按照規(guī)定的協(xié)議格式寫程序就可以和PLC進行數(shù)據(jù)交換。
西門子公司開源驅(qū)動庫Libnodave是一個開源驅(qū)動庫,但該庫的使用需要硬件匹配,它支持的通訊方式主要由daveProtoMPI(針對西門子300/400系列PLC的MPI協(xié)議)、daveProtoMPI2(針對不帶STX的Andrew版本西門子300/400系列PLC的MPI協(xié)議)、daveProtoMPI3(針對step7版本300/400系列PLC的MPI協(xié)議)、daveProtoMPI4(針對帶STX的Andrew版本西門子300/400系列PLC的MPI協(xié)議)、daveProtoPPI(針對西門子200系列PLC的PPI協(xié)議)、daveProtoAS511(針對S5編程口協(xié)議)、daveProtoS7online(針對s70nlinx.dll動態(tài)鏈接庫通信)、daveProtoISOTCP(針對帶路由功能的ISO on TCP協(xié)議)、daveProtoISOTCP243(針對西門子200系列PLC設(shè)備中以太網(wǎng)模塊CP243的ISO on TCP協(xié)議)、daveProtoISOTCPR(針對具有路由功能的ISO on TCP協(xié)議)、daveProtoMPI_IBH(針對通過網(wǎng)關(guān)聯(lián)結(jié)的MPI協(xié)議)、daveProtoPPI_IBH(針對通過網(wǎng)關(guān)聯(lián)結(jié)的PPI協(xié)議)、daveProtoNLpro、daveProtoUserTransport組成。上述協(xié)議主要是PPI協(xié)議和ISO on TCP協(xié)議。
上位機軟件連接西門子PLC可以通過四種方法。一是opc server連接PLC,opc server可以選用Simatic Net、Kepserver等[1]。二是組態(tài)軟件連接PLC。例如組態(tài)王驅(qū)動庫,Intouch的DAServer等。三是用自由口實現(xiàn)通訊[2]。四是編程方式連接PLC,如開源的Libnodave和西門子的prodave庫[3-4],而PRODAVE是用于上位機與S7系列PLC之間數(shù)據(jù)連接通信的商業(yè)軟件包,它提供了一個接口函數(shù)庫,DLL和LIB庫,以此完成PLC與上位機之間的數(shù)據(jù)通信。使用PRODAVE進行控制系統(tǒng)開發(fā),需要調(diào)用開發(fā)包提供的動態(tài)鏈接庫中的函數(shù)即可實現(xiàn)通信,而最新發(fā)布的6.2版新增加了對Window 7操作系統(tǒng)的支持。
以上四種方法,除了Libnodave是開源免費的,其他都需要授權(quán)。Libnodave是跨平臺的庫,其支持MPI協(xié)議和以太網(wǎng)協(xié)議。以太網(wǎng)具有傳輸速率高、傳輸距離遠、可靠性以及開放性較好等優(yōu)點[5-12]。西門子公司S7系列PLC的通信可以通過開源驅(qū)動庫Libnodave實現(xiàn)[13-14]。
文中參考Libnodave庫,去掉MPI等協(xié)議,只保留需要的以太網(wǎng)協(xié)議,直接給出發(fā)包和收包的數(shù)據(jù)格式,代碼結(jié)構(gòu)清晰明了。Libnodave庫只提供了cp243,cp343的連接方式,文中在其基礎(chǔ)上增加了S7-200smart、西門子1200系列PLC的連接方式。
設(shè)計的Libnodave庫的TCP協(xié)議解析工作,都是在微軟Windows 7環(huán)境下完成。后臺PC機的IP地址為192.168.1.18,子網(wǎng)掩碼為255.255.255.0。
操作系統(tǒng):Windows 7;
編程軟件:Visual Studio 2012;
西門子S7-200smart編程軟件:S7-200 PC Access;
西門子S7-300編程軟件:Step7 v5.5;
西門子S7系列PLC:S7-300PLC+cp343,200SMART。
測試的PLC的IP地址是192.168.0.25,子網(wǎng)掩碼為255.255.255.0。
由于西門子以太網(wǎng)中的ISO on TCP協(xié)議所采用的數(shù)據(jù)傳輸端口為102,所以port設(shè)置為102。
在軟件編寫方面,鑒于通過工控組態(tài)軟件或者OPC服務(wù)器/客戶端的PLC遠程連接上位機監(jiān)測監(jiān)控具有實時性較低、實施成本高等缺點,根據(jù)西門子S7-300與S7-200SMART的實際對象,采用西門子Libnodave開源免費函數(shù)庫結(jié)合高級語言可以開發(fā)基于以太網(wǎng)通訊的監(jiān)控軟件,一定程度上優(yōu)化遠程監(jiān)控計算機與PLC之間的通信。該方法對數(shù)據(jù)的采集與存儲、故障分析與處理非常便利,具有實施難度低、數(shù)據(jù)交換方式靈活多變、實時性高等優(yōu)點,具有極高的程序獨立性,獨立于西門子其他任何軟件。
圖1給出了Libnodave測試程序流程。

圖1 Libnodave庫測試程序流程
該程序用socket同步通訊,Libnodave庫協(xié)議握手需要調(diào)用7個函數(shù)。函數(shù)首先打開通信接口句柄后保存到相應(yīng)變量中,該變量在電泳daveNewInterface時傳遞給新生成的daveNewInterface結(jié)構(gòu)體。調(diào)用daveNewConnection時需要把已經(jīng)生成的daveInterface結(jié)構(gòu)體指針傳送到新生成的daveConnection結(jié)構(gòu)中保存。在調(diào)用其他功能函數(shù)時,硬件連接方面的信息通過daveConnection來傳遞,實現(xiàn)功能函數(shù)調(diào)用的協(xié)議不相關(guān)性。由上可見,發(fā)送的數(shù)據(jù)包分布在多個結(jié)構(gòu)體中初始化,牽扯到多個函數(shù)的調(diào)用,代碼結(jié)構(gòu)紛繁復(fù)雜。
文中參考Libnodave庫,改進后的庫只有握手、讀包、寫包三個函數(shù)。數(shù)據(jù)包以unsigned char數(shù)組的形式給出,并標識出每一位的含義,代碼清晰明了,方便移植。
由于所有的數(shù)據(jù)都是從PLC的內(nèi)部存儲空間獲取,主要包括數(shù)據(jù)庫DB、位存儲區(qū)M、輸入映像區(qū)Inputs和輸出映像區(qū)Outputs。針對上述四個區(qū)域,開發(fā)讀取功能,并通過位邏輯BOOL、字節(jié)BYTE、整形INT、雙字節(jié)WORD、長整型DINT、雙字DWORD以及實數(shù)REAL7中形式讀取。
下面是封裝的函數(shù)列表:
BOOL ConnectPLC();
BOOL ReadBytes(int area, int db, int start, int len, unsigned char* buffer);
BOOL WriteBytes(int area, int db, int start, int len, unsigned char* buffer);
area:讀取的數(shù)據(jù)區(qū),m區(qū)是0x83,DB區(qū)0x84。
db:m區(qū),值為0;db區(qū),值為db區(qū)號。
start:讀取的數(shù)據(jù)地址開始位置。
len:讀取幾個字節(jié)。
buffer:讀取到的數(shù)值保存的緩沖區(qū)。
如:讀取“DB1,W10”的數(shù)據(jù),(W表示一個字,所以是2個字節(jié)),函數(shù)應(yīng)該寫為:ReadBytes(0x84,1,10,2,buffer)。
每種以太網(wǎng)通訊模塊的握手數(shù)據(jù)包都不相同。發(fā)送接收串都是unsigned char類型的數(shù)據(jù)。客戶端向PLC發(fā)送握手數(shù)據(jù)包,如果數(shù)據(jù)包是不匹配的,PLC是不會回數(shù)據(jù)的。所以接收到數(shù)據(jù)包并且數(shù)據(jù)包的長度是22,就說明握手成功。握手通過后,就可以和PLC進行數(shù)據(jù)交換了。表1給出cp243,cp343,1200,200smart的握手數(shù)據(jù)包。所有發(fā)送的數(shù)據(jù)包前2個字節(jié)都是0x03、0x00,第3和第4字節(jié)表示數(shù)據(jù)包的長度,計算公式為:串[2]*256+串[3]。

表1 cp243,cp343,1200,200smart的握手數(shù)據(jù)包

表2為讀數(shù)據(jù)包(“口”占一個字節(jié));表3為讀數(shù)據(jù)返回包。

表2 讀數(shù)據(jù)包
如果讀取PLC的數(shù)據(jù)包是不正確的,PLC是不會回數(shù)據(jù)的。所以接收到數(shù)據(jù)包,說明讀取成功。返回的數(shù)據(jù)包中包含了要讀取的數(shù)據(jù)。
文中設(shè)計數(shù)據(jù)可以向數(shù)據(jù)庫DB、位存儲區(qū)M、輸入映像區(qū)Inputs和輸出映像區(qū)Outputs中寫入的功能,并可通過BOOL、BYTE、INT、WORD、DINT、DWORD以及REAL七種形式寫數(shù)據(jù)。以BYTE為基本單元,以一幀數(shù)據(jù)為寫入數(shù)據(jù)包為例,如表4所示。

表4 寫數(shù)據(jù)包
如果寫入PLC的數(shù)據(jù)包是不正確的,PLC是不會回數(shù)據(jù)的。所以接收到數(shù)據(jù)包并且數(shù)據(jù)包的長度是22,就說明寫入成功。

寫數(shù)據(jù)包返回包0x03,0x00,0x00,0x16,0x02,0xf0,0x80,0x32,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x00,0x05,0x01,0xff
測試程序主要有4個部分,分別為建立端口連接、設(shè)備聯(lián)絡(luò)握手、讀寫數(shù)據(jù)以及句柄釋放,詳細流程如圖2所示。

圖2 測試程序流程
(1)建立連接。
connect(sockClient,(SOCKADDR*)& addrSrv,sizeof(SOCKADDR));
//tcp 連接與初始化連接與端口號
(2)協(xié)議握手。
ConnectPLC();
//通過協(xié)議握手數(shù)據(jù)的發(fā)送與接收情況啟動相關(guān)校驗程序,從而判斷是否握手成功
(3)數(shù)據(jù)交換。
unsigned char v2[2]={0};
daveReadBytes(AREA_DB, 1, 10, 2, (void *)v2);
unsigned char v4[2]={0};
Put16(v4,2);
WriteBytes(AREA_M,0,20,2,(void *)v4);
//通過讀寫數(shù)據(jù)部分,啟動數(shù)據(jù)幀的發(fā)送與接收工作,主要完成上位機與PLC的數(shù)據(jù)交換與處理。
(4)斷開連接
closesocket(sockClient);
//關(guān)閉套接字
測試程序截圖如圖3所示。

圖3 測試程序截圖
通過研究西門子開源設(shè)備Libnodave驅(qū)動庫,解析西門子系列PLC通信原理以及該開源庫的編程結(jié)構(gòu),使得根據(jù)不同硬件或者平臺需求借用源代碼實現(xiàn)同西門子系列PLC通信成為可能。鑒于Libnodave驅(qū)動庫的免費、開源、穩(wěn)定、靈活等特點,取代PRODAVE來開發(fā)基于西門子S7-300與S7-200SMART的監(jiān)控系統(tǒng)軟件,從而降低成本,提高西門子相關(guān)產(chǎn)品的局限性。Libnodave庫是C語言編寫的開源跨平臺的庫,但是仍然不方便在跨語言方面的移植,比如在VB、C#等中調(diào)用它,需要把Libnodave封裝成二進制文件,并提供接口函數(shù)。文中通過研究西門子開源設(shè)備Libnodave庫,直接給出send,recv的字節(jié)碼,非常方便跨語言、跨平臺的移植,對于嵌入式應(yīng)用環(huán)境中有限的運算資源是一個有利的支撐,其研究成果可以為工控行業(yè)各生產(chǎn)企業(yè)現(xiàn)場設(shè)備的升級改造與建設(shè)提供一定的借鑒,具有一定的參考價值。
[1] 任思成,王書鶴,亓克貴.新一代工業(yè)過程控制軟件接口標準-OPC技術(shù)[J].儀器儀表學(xué)報,2002,23:265-267.
[2] 沈世斌.基于PLC自由口通信的應(yīng)用[J].儀表技術(shù)與傳感器,2004(12):26-28.
[3] 周廣穎,張金金,閆 隆.基于LIBNODAVE的上位機與西門子PLC的通信[J].微計算機信息,2010,26(11-1):28-30.
[4] 趙 軍,時良平,黃春陽.基于Prodave技術(shù)的西門子PLC監(jiān)控調(diào)試軟件開發(fā)[J].自動化應(yīng)用,2011(10):26-28.
[5] 張曉麗,馬 俊,劉軼斐.煉鋼廠實時數(shù)據(jù)通信系統(tǒng)的研究與開發(fā)[J].儀器儀表學(xué)報,2005,26:553-556.
[6] 魏立新,馮 曦,王洪慶,等.LIBNODAVE在PLC上位機監(jiān)控軟件中的運用[J].儀表技術(shù)與傳感器,2014(7):82-84.
[7] DILIP P S,JAGTAP S R.Remote monitoring & controlling of real time industrial parameters with GSM & Ethernet[J].International Journal of Electronics Communication & Instrumentation Engineering Research & Development,2013,3(2):1-10.
[8] SCHNEIER B.Cryptanalysis of Microsoft’s point-to-point tunneling protocol (PPTP)[C]//Proceedings of the 5th ACM conference on computer and communications security.[s.l.]:ACM,1998:132-141.
[9] HU M,ZHAO Q,KURAMOTO M,et al.Research and implementation of layer two tunneling protocol (L2TP) on carrier network[C]//4th IEEE international conference on broadband network and multimedia technology.[s.l.]:IEEE,2011:80-83.
[10] 桂 芳,全書海.網(wǎng)絡(luò)控制系統(tǒng)傳輸時延分析與測試[J].計算機應(yīng)用,2005,25(10):2264-2266.
[11] 張曉倩,宋曉茹,曹建建.基于CAN總線的網(wǎng)絡(luò)控制系統(tǒng)的仿真研究[J].計算機技術(shù)與發(fā)展,2016,26(7):192-195.
[12] 黨安喜,裴少婧,尚耀東,等.以太網(wǎng)時延仿真與性能分析[J].計算機工程與應(yīng)用,2009,45(2):119-121.
[13] IANNONE F,BERTOCCHI A,BONCAGNI L,et al.Open source solutions in control and data acquisition systems:FTU case studies[J].Fusion Engineering and Design,2010,85(3-4):321-324.
[14] 孫書歡,孔祥成,吳雪婷.西門子PLC設(shè)備開源驅(qū)動庫Libnodave的研究與改進[J].核電子學(xué)與探測技術(shù),2013,33(7):847-851.