夏正龍,耿 浩
(1.江蘇師范大學(xué) 電氣工程及其自動(dòng)化學(xué)院,江蘇 徐州 221116;2.徐州上若科技有限公司 自動(dòng)化事業(yè)部,江蘇 徐州 221116)
現(xiàn)代工控領(lǐng)域多采用數(shù)字化智能裝置代替?zhèn)鹘y(tǒng)的模擬儀表作為前端控制器,而數(shù)字智能裝置一般都具備獨(dú)自監(jiān)測(cè)監(jiān)控功能,能實(shí)時(shí)向上位集控后臺(tái)實(shí)時(shí)上傳工作狀態(tài)。當(dāng)前工控領(lǐng)域的集控方式由集中控制向分散控制,由分散管理向集中管理轉(zhuǎn)變。西門(mén)子公司的PLC(programmable logic controller)設(shè)備在工控領(lǐng)域應(yīng)用廣泛,其產(chǎn)品系列的豐富與可靠已經(jīng)得到了廣大用戶(hù)的信賴(lài)。目前工控領(lǐng)域控制的實(shí)時(shí)性要求越來(lái)越高,自然需要一個(gè)高速的通訊網(wǎng)絡(luò)。
隨著以太網(wǎng)通訊在工業(yè)控制領(lǐng)域的普及,其通訊速率高、可靠性高,在實(shí)際應(yīng)用中越來(lái)越廣泛。西門(mén)子系列PLC以太網(wǎng)通訊模塊有cp243,cp343,cp443。200SMART和1200自帶以太網(wǎng)口。西門(mén)子以太網(wǎng)協(xié)議眾多,有ISO,ISO-on-TCP,TCP,UDP等。ISO協(xié)議是西門(mén)子早期的以太網(wǎng)通訊協(xié)議,通訊使用的是MAC地址。TCP、UDP協(xié)議,屬于用戶(hù)自定義協(xié)議,PLC端和上位機(jī)都需要用戶(hù)寫(xiě)程序。ISO-on-TCP協(xié)議是在TCP/IP協(xié)議層,按照ISO協(xié)議重新定義,通訊使用的是IP地址。因?yàn)镻LC本身就支持ISO-on-TCP協(xié)議,所以PLC不用添加任何程序,只需要上位機(jī)按照規(guī)定的協(xié)議格式寫(xiě)程序就可以和PLC進(jìn)行數(shù)據(jù)交換。
西門(mén)子公司開(kāi)源驅(qū)動(dòng)庫(kù)Libnodave是一個(gè)開(kāi)源驅(qū)動(dòng)庫(kù),但該庫(kù)的使用需要硬件匹配,它支持的通訊方式主要由daveProtoMPI(針對(duì)西門(mén)子300/400系列PLC的MPI協(xié)議)、daveProtoMPI2(針對(duì)不帶STX的Andrew版本西門(mén)子300/400系列PLC的MPI協(xié)議)、daveProtoMPI3(針對(duì)step7版本300/400系列PLC的MPI協(xié)議)、daveProtoMPI4(針對(duì)帶STX的Andrew版本西門(mén)子300/400系列PLC的MPI協(xié)議)、daveProtoPPI(針對(duì)西門(mén)子200系列PLC的PPI協(xié)議)、daveProtoAS511(針對(duì)S5編程口協(xié)議)、daveProtoS7online(針對(duì)s70nlinx.dll動(dòng)態(tài)鏈接庫(kù)通信)、daveProtoISOTCP(針對(duì)帶路由功能的ISO on TCP協(xié)議)、daveProtoISOTCP243(針對(duì)西門(mén)子200系列PLC設(shè)備中以太網(wǎng)模塊CP243的ISO on TCP協(xié)議)、daveProtoISOTCPR(針對(duì)具有路由功能的ISO on TCP協(xié)議)、daveProtoMPI_IBH(針對(duì)通過(guò)網(wǎng)關(guān)聯(lián)結(jié)的MPI協(xié)議)、daveProtoPPI_IBH(針對(duì)通過(guò)網(wǎng)關(guān)聯(lián)結(jié)的PPI協(xié)議)、daveProtoNLpro、daveProtoUserTransport組成。上述協(xié)議主要是PPI協(xié)議和ISO on TCP協(xié)議。
上位機(jī)軟件連接西門(mén)子PLC可以通過(guò)四種方法。一是opc server連接PLC,opc server可以選用Simatic Net、Kepserver等[1]。二是組態(tài)軟件連接PLC。例如組態(tài)王驅(qū)動(dòng)庫(kù),Intouch的DAServer等。三是用自由口實(shí)現(xiàn)通訊[2]。四是編程方式連接PLC,如開(kāi)源的Libnodave和西門(mén)子的prodave庫(kù)[3-4],而PRODAVE是用于上位機(jī)與S7系列PLC之間數(shù)據(jù)連接通信的商業(yè)軟件包,它提供了一個(gè)接口函數(shù)庫(kù),DLL和LIB庫(kù),以此完成PLC與上位機(jī)之間的數(shù)據(jù)通信。使用PRODAVE進(jìn)行控制系統(tǒng)開(kāi)發(fā),需要調(diào)用開(kāi)發(fā)包提供的動(dòng)態(tài)鏈接庫(kù)中的函數(shù)即可實(shí)現(xiàn)通信,而最新發(fā)布的6.2版新增加了對(duì)Window 7操作系統(tǒng)的支持。
以上四種方法,除了Libnodave是開(kāi)源免費(fèi)的,其他都需要授權(quán)。Libnodave是跨平臺(tái)的庫(kù),其支持MPI協(xié)議和以太網(wǎng)協(xié)議。以太網(wǎng)具有傳輸速率高、傳輸距離遠(yuǎn)、可靠性以及開(kāi)放性較好等優(yōu)點(diǎn)[5-12]。西門(mén)子公司S7系列PLC的通信可以通過(guò)開(kāi)源驅(qū)動(dòng)庫(kù)Libnodave實(shí)現(xiàn)[13-14]。
文中參考Libnodave庫(kù),去掉MPI等協(xié)議,只保留需要的以太網(wǎng)協(xié)議,直接給出發(fā)包和收包的數(shù)據(jù)格式,代碼結(jié)構(gòu)清晰明了。Libnodave庫(kù)只提供了cp243,cp343的連接方式,文中在其基礎(chǔ)上增加了S7-200smart、西門(mén)子1200系列PLC的連接方式。
設(shè)計(jì)的Libnodave庫(kù)的TCP協(xié)議解析工作,都是在微軟Windows 7環(huán)境下完成。后臺(tái)PC機(jī)的IP地址為192.168.1.18,子網(wǎng)掩碼為255.255.255.0。
操作系統(tǒng):Windows 7;
編程軟件:Visual Studio 2012;
西門(mén)子S7-200smart編程軟件:S7-200 PC Access;
西門(mén)子S7-300編程軟件:Step7 v5.5;
西門(mén)子S7系列PLC:S7-300PLC+cp343,200SMART。
測(cè)試的PLC的IP地址是192.168.0.25,子網(wǎng)掩碼為255.255.255.0。
由于西門(mén)子以太網(wǎng)中的ISO on TCP協(xié)議所采用的數(shù)據(jù)傳輸端口為102,所以port設(shè)置為102。
在軟件編寫(xiě)方面,鑒于通過(guò)工控組態(tài)軟件或者OPC服務(wù)器/客戶(hù)端的PLC遠(yuǎn)程連接上位機(jī)監(jiān)測(cè)監(jiān)控具有實(shí)時(shí)性較低、實(shí)施成本高等缺點(diǎn),根據(jù)西門(mén)子S7-300與S7-200SMART的實(shí)際對(duì)象,采用西門(mén)子Libnodave開(kāi)源免費(fèi)函數(shù)庫(kù)結(jié)合高級(jí)語(yǔ)言可以開(kāi)發(fā)基于以太網(wǎng)通訊的監(jiān)控軟件,一定程度上優(yōu)化遠(yuǎn)程監(jiān)控計(jì)算機(jī)與PLC之間的通信。該方法對(duì)數(shù)據(jù)的采集與存儲(chǔ)、故障分析與處理非常便利,具有實(shí)施難度低、數(shù)據(jù)交換方式靈活多變、實(shí)時(shí)性高等優(yōu)點(diǎn),具有極高的程序獨(dú)立性,獨(dú)立于西門(mén)子其他任何軟件。
圖1給出了Libnodave測(cè)試程序流程。
圖1 Libnodave庫(kù)測(cè)試程序流程
該程序用socket同步通訊,Libnodave庫(kù)協(xié)議握手需要調(diào)用7個(gè)函數(shù)。函數(shù)首先打開(kāi)通信接口句柄后保存到相應(yīng)變量中,該變量在電泳daveNewInterface時(shí)傳遞給新生成的daveNewInterface結(jié)構(gòu)體。調(diào)用daveNewConnection時(shí)需要把已經(jīng)生成的daveInterface結(jié)構(gòu)體指針傳送到新生成的daveConnection結(jié)構(gòu)中保存。在調(diào)用其他功能函數(shù)時(shí),硬件連接方面的信息通過(guò)daveConnection來(lái)傳遞,實(shí)現(xiàn)功能函數(shù)調(diào)用的協(xié)議不相關(guān)性。由上可見(jiàn),發(fā)送的數(shù)據(jù)包分布在多個(gè)結(jié)構(gòu)體中初始化,牽扯到多個(gè)函數(shù)的調(diào)用,代碼結(jié)構(gòu)紛繁復(fù)雜。
文中參考Libnodave庫(kù),改進(jìn)后的庫(kù)只有握手、讀包、寫(xiě)包三個(gè)函數(shù)。數(shù)據(jù)包以u(píng)nsigned char數(shù)組的形式給出,并標(biāo)識(shí)出每一位的含義,代碼清晰明了,方便移植。
由于所有的數(shù)據(jù)都是從PLC的內(nèi)部存儲(chǔ)空間獲取,主要包括數(shù)據(jù)庫(kù)DB、位存儲(chǔ)區(qū)M、輸入映像區(qū)Inputs和輸出映像區(qū)Outputs。針對(duì)上述四個(gè)區(qū)域,開(kāi)發(fā)讀取功能,并通過(guò)位邏輯BOOL、字節(jié)BYTE、整形INT、雙字節(jié)WORD、長(zhǎng)整型DINT、雙字DWORD以及實(shí)數(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ū)號(hào)。
start:讀取的數(shù)據(jù)地址開(kāi)始位置。
len:讀取幾個(gè)字節(jié)。
buffer:讀取到的數(shù)值保存的緩沖區(qū)。
如:讀取“DB1,W10”的數(shù)據(jù),(W表示一個(gè)字,所以是2個(gè)字節(jié)),函數(shù)應(yīng)該寫(xiě)為:ReadBytes(0x84,1,10,2,buffer)。
每種以太網(wǎng)通訊模塊的握手?jǐn)?shù)據(jù)包都不相同。發(fā)送接收串都是unsigned char類(lèi)型的數(shù)據(jù)??蛻?hù)端向PLC發(fā)送握手?jǐn)?shù)據(jù)包,如果數(shù)據(jù)包是不匹配的,PLC是不會(huì)回?cái)?shù)據(jù)的。所以接收到數(shù)據(jù)包并且數(shù)據(jù)包的長(zhǎng)度是22,就說(shuō)明握手成功。握手通過(guò)后,就可以和PLC進(jìn)行數(shù)據(jù)交換了。表1給出cp243,cp343,1200,200smart的握手?jǐn)?shù)據(jù)包。所有發(fā)送的數(shù)據(jù)包前2個(gè)字節(jié)都是0x03、0x00,第3和第4字節(jié)表示數(shù)據(jù)包的長(zhǎng)度,計(jì)算公式為:串[2]*256+串[3]。
表1 cp243,cp343,1200,200smart的握手?jǐn)?shù)據(jù)包
表2為讀數(shù)據(jù)包(“口”占一個(gè)字節(jié));表3為讀數(shù)據(jù)返回包。
表2 讀數(shù)據(jù)包
如果讀取PLC的數(shù)據(jù)包是不正確的,PLC是不會(huì)回?cái)?shù)據(jù)的。所以接收到數(shù)據(jù)包,說(shuō)明讀取成功。返回的數(shù)據(jù)包中包含了要讀取的數(shù)據(jù)。
文中設(shè)計(jì)數(shù)據(jù)可以向數(shù)據(jù)庫(kù)DB、位存儲(chǔ)區(qū)M、輸入映像區(qū)Inputs和輸出映像區(qū)Outputs中寫(xiě)入的功能,并可通過(guò)BOOL、BYTE、INT、WORD、DINT、DWORD以及REAL七種形式寫(xiě)數(shù)據(jù)。以BYTE為基本單元,以一幀數(shù)據(jù)為寫(xiě)入數(shù)據(jù)包為例,如表4所示。
表4 寫(xiě)數(shù)據(jù)包
如果寫(xiě)入PLC的數(shù)據(jù)包是不正確的,PLC是不會(huì)回?cái)?shù)據(jù)的。所以接收到數(shù)據(jù)包并且數(shù)據(jù)包的長(zhǎng)度是22,就說(shuō)明寫(xiě)入成功。
寫(xiě)數(shù)據(jù)包返回包0x03,0x00,0x00,0x16,0x02,0xf0,0x80,0x32,0x03,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x00,0x05,0x01,0xff
測(cè)試程序主要有4個(gè)部分,分別為建立端口連接、設(shè)備聯(lián)絡(luò)握手、讀寫(xiě)數(shù)據(jù)以及句柄釋放,詳細(xì)流程如圖2所示。
圖2 測(cè)試程序流程
(1)建立連接。
connect(sockClient,(SOCKADDR*)& addrSrv,sizeof(SOCKADDR));
//tcp 連接與初始化連接與端口號(hào)
(2)協(xié)議握手。
ConnectPLC();
//通過(guò)協(xié)議握手?jǐn)?shù)據(jù)的發(fā)送與接收情況啟動(dòng)相關(guān)校驗(yà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);
//通過(guò)讀寫(xiě)數(shù)據(jù)部分,啟動(dòng)數(shù)據(jù)幀的發(fā)送與接收工作,主要完成上位機(jī)與PLC的數(shù)據(jù)交換與處理。
(4)斷開(kāi)連接
closesocket(sockClient);
//關(guān)閉套接字
測(cè)試程序截圖如圖3所示。
圖3 測(cè)試程序截圖
通過(guò)研究西門(mén)子開(kāi)源設(shè)備Libnodave驅(qū)動(dòng)庫(kù),解析西門(mén)子系列PLC通信原理以及該開(kāi)源庫(kù)的編程結(jié)構(gòu),使得根據(jù)不同硬件或者平臺(tái)需求借用源代碼實(shí)現(xiàn)同西門(mén)子系列PLC通信成為可能。鑒于Libnodave驅(qū)動(dòng)庫(kù)的免費(fèi)、開(kāi)源、穩(wěn)定、靈活等特點(diǎn),取代PRODAVE來(lái)開(kāi)發(fā)基于西門(mén)子S7-300與S7-200SMART的監(jiān)控系統(tǒng)軟件,從而降低成本,提高西門(mén)子相關(guān)產(chǎn)品的局限性。Libnodave庫(kù)是C語(yǔ)言編寫(xiě)的開(kāi)源跨平臺(tái)的庫(kù),但是仍然不方便在跨語(yǔ)言方面的移植,比如在VB、C#等中調(diào)用它,需要把Libnodave封裝成二進(jìn)制文件,并提供接口函數(shù)。文中通過(guò)研究西門(mén)子開(kāi)源設(shè)備Libnodave庫(kù),直接給出send,recv的字節(jié)碼,非常方便跨語(yǔ)言、跨平臺(tái)的移植,對(duì)于嵌入式應(yīng)用環(huán)境中有限的運(yùn)算資源是一個(gè)有利的支撐,其研究成果可以為工控行業(yè)各生產(chǎn)企業(yè)現(xiàn)場(chǎng)設(shè)備的升級(jí)改造與建設(shè)提供一定的借鑒,具有一定的參考價(jià)值。
[1] 任思成,王書(shū)鶴,亓克貴.新一代工業(yè)過(guò)程控制軟件接口標(biāo)準(zhǔn)-OPC技術(shù)[J].儀器儀表學(xué)報(bào),2002,23:265-267.
[2] 沈世斌.基于PLC自由口通信的應(yīng)用[J].儀表技術(shù)與傳感器,2004(12):26-28.
[3] 周廣穎,張金金,閆 ?。贚IBNODAVE的上位機(jī)與西門(mén)子PLC的通信[J].微計(jì)算機(jī)信息,2010,26(11-1):28-30.
[4] 趙 軍,時(shí)良平,黃春陽(yáng).基于Prodave技術(shù)的西門(mén)子PLC監(jiān)控調(diào)試軟件開(kāi)發(fā)[J].自動(dòng)化應(yīng)用,2011(10):26-28.
[5] 張曉麗,馬 俊,劉軼斐.煉鋼廠實(shí)時(shí)數(shù)據(jù)通信系統(tǒng)的研究與開(kāi)發(fā)[J].儀器儀表學(xué)報(bào),2005,26:553-556.
[6] 魏立新,馮 曦,王洪慶,等.LIBNODAVE在PLC上位機(jī)監(jiān)控軟件中的運(yù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] 桂 芳,全書(shū)海.網(wǎng)絡(luò)控制系統(tǒng)傳輸時(shí)延分析與測(cè)試[J].計(jì)算機(jī)應(yīng)用,2005,25(10):2264-2266.
[11] 張曉倩,宋曉茹,曹建建.基于CAN總線的網(wǎng)絡(luò)控制系統(tǒng)的仿真研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2016,26(7):192-195.
[12] 黨安喜,裴少婧,尚耀東,等.以太網(wǎng)時(shí)延仿真與性能分析[J].計(jì)算機(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] 孫書(shū)歡,孔祥成,吳雪婷.西門(mén)子PLC設(shè)備開(kāi)源驅(qū)動(dòng)庫(kù)Libnodave的研究與改進(jìn)[J].核電子學(xué)與探測(cè)技術(shù),2013,33(7):847-851.