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

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

表1 cp243,cp343,1200,200smart的握手數據包

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

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

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

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

圖2 測試程序流程
(1)建立連接。
connect(sockClient,(SOCKADDR*)& addrSrv,sizeof(SOCKADDR));
//tcp 連接與初始化連接與端口號
(2)協議握手。
ConnectPLC();
//通過協議握手數據的發送與接收情況啟動相關校驗程序,從而判斷是否握手成功
(3)數據交換。
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);
//通過讀寫數據部分,啟動數據幀的發送與接收工作,主要完成上位機與PLC的數據交換與處理。
(4)斷開連接
closesocket(sockClient);
//關閉套接字
測試程序截圖如圖3所示。

圖3 測試程序截圖
通過研究西門子開源設備Libnodave驅動庫,解析西門子系列PLC通信原理以及該開源庫的編程結構,使得根據不同硬件或者平臺需求借用源代碼實現同西門子系列PLC通信成為可能。鑒于Libnodave驅動庫的免費、開源、穩定、靈活等特點,取代PRODAVE來開發基于西門子S7-300與S7-200SMART的監控系統軟件,從而降低成本,提高西門子相關產品的局限性。Libnodave庫是C語言編寫的開源跨平臺的庫,但是仍然不方便在跨語言方面的移植,比如在VB、C#等中調用它,需要把Libnodave封裝成二進制文件,并提供接口函數。文中通過研究西門子開源設備Libnodave庫,直接給出send,recv的字節碼,非常方便跨語言、跨平臺的移植,對于嵌入式應用環境中有限的運算資源是一個有利的支撐,其研究成果可以為工控行業各生產企業現場設備的升級改造與建設提供一定的借鑒,具有一定的參考價值。
[1] 任思成,王書鶴,亓克貴.新一代工業過程控制軟件接口標準-OPC技術[J].儀器儀表學報,2002,23:265-267.
[2] 沈世斌.基于PLC自由口通信的應用[J].儀表技術與傳感器,2004(12):26-28.
[3] 周廣穎,張金金,閆 ?。贚IBNODAVE的上位機與西門子PLC的通信[J].微計算機信息,2010,26(11-1):28-30.
[4] 趙 軍,時良平,黃春陽.基于Prodave技術的西門子PLC監控調試軟件開發[J].自動化應用,2011(10):26-28.
[5] 張曉麗,馬 俊,劉軼斐.煉鋼廠實時數據通信系統的研究與開發[J].儀器儀表學報,2005,26:553-556.
[6] 魏立新,馮 曦,王洪慶,等.LIBNODAVE在PLC上位機監控軟件中的運用[J].儀表技術與傳感器,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] 桂 芳,全書海.網絡控制系統傳輸時延分析與測試[J].計算機應用,2005,25(10):2264-2266.
[11] 張曉倩,宋曉茹,曹建建.基于CAN總線的網絡控制系統的仿真研究[J].計算機技術與發展,2016,26(7):192-195.
[12] 黨安喜,裴少婧,尚耀東,等.以太網時延仿真與性能分析[J].計算機工程與應用,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設備開源驅動庫Libnodave的研究與改進[J].核電子學與探測技術,2013,33(7):847-851.