尹大宇
摘 要 介紹了PC與西門子S7-300PLC在.Net平臺(tái)下用TCP/IP協(xié)議實(shí)現(xiàn)通訊的方法。
【關(guān)鍵詞】S7-300 PLC TCP/IP套接字 .Net
隨著Internet/ Intranet的發(fā)展,以太網(wǎng)已滲透到各個(gè)角落,今天的控制系統(tǒng)和工廠自動(dòng)化系統(tǒng),以太網(wǎng)的應(yīng)用幾乎已經(jīng)和PLC一樣普及。以太網(wǎng)相對于其他通訊方式(如Profibus/Mpi)有許多優(yōu)勢:
(1)速度更快。西門子CP 1543-1的通訊帶寬已經(jīng)可達(dá)1000Mbps。
(2)診斷更加方便快捷。簡單的ping操作就可以診斷大部分通訊問題。
(3)成本低。不再需要使用特殊的適配器來連接到PLC,只需普通的網(wǎng)線。
因此,本文的研究將基于以太網(wǎng)的TCP/IP協(xié)議進(jìn)行討論。
1 .NET平臺(tái)簡介
.NET Framework的核心是其運(yùn)行庫的執(zhí)行環(huán)境,稱為公共語言運(yùn)行庫(CLR)或.NET運(yùn)行庫。在CLR執(zhí)行編寫好的源代碼之前,需要編譯它們(在C#中或其他語言中)。在.NET中,編譯分為兩個(gè)階段:
(1)把源代碼編譯為Microsoft中間語言(IL)。
(2)CLR把IL編譯為平臺(tái)專用的代碼。
這個(gè)兩階段的編譯過程非常重要,因?yàn)镸icrosoft中間語言(托管代碼)是提供.NET的許多優(yōu)點(diǎn)的關(guān)鍵。
Microsoft中間語言與Java字節(jié)代碼共享一種理念:它們都是低級語言,語法很簡單(使用數(shù)字代碼,而不是文本代碼),可以快速地轉(zhuǎn)換為內(nèi)部機(jī)器碼。對于代碼來說,這種精心設(shè)計(jì)的通用語法有很重要的優(yōu)點(diǎn):平臺(tái)無關(guān)性、提高性能和語言的互操作性。因此,基于.NET平臺(tái)開發(fā)的應(yīng)用程序具有更好的移植性,也是跨平臺(tái)應(yīng)用程序開發(fā)的很好選擇。
2 PLC與PC的TCP/IP通訊協(xié)議
基于以太網(wǎng)TCP/IP協(xié)議有兩種通訊方式:面向?qū)ο蟮耐ㄓ崊f(xié)議(TCP)和面向無連接的通訊協(xié)議(UDP)。TCP提供的是一種可靠的數(shù)據(jù)流服務(wù),采用“帶重傳的肯定確認(rèn)”技術(shù)來實(shí)現(xiàn)傳輸?shù)目煽啃?。為了提高?shù)據(jù)的有效性,本文使用該通訊方式。
西門子通訊協(xié)議是西門子PLC通訊的基礎(chǔ),它按照確定的方式來進(jìn)行定義,然后將定義完成的報(bào)文依賴于TCP協(xié)議來進(jìn)行傳輸。每一條通訊報(bào)文都包含著一條指令(例如讀取、寫入)或者明確的回復(fù)。協(xié)議的封裝如圖1所示。
西門子通訊協(xié)議被封裝在S7 PDU中,一條標(biāo)準(zhǔn)的通訊報(bào)文由幾個(gè)基本的部分組成(本文以讀取DB存儲(chǔ)區(qū)(DB300.DBW29)變量的請求為例進(jìn)行說明):
2.1 數(shù)據(jù)頭
聲明請求目的為讀?。?x32 0x01)。數(shù)據(jù)流(16進(jìn)制)如表1所示。
2.2 參數(shù)定義
聲明請求為讀取(0x04),變量個(gè)數(shù)(0x01代表只讀取一個(gè)變量),標(biāo)準(zhǔn)頭(0x12 0x0a 0x10),變量的類型(0x02代表Byte),長度(“0x00 0x02”長度為2字節(jié)),對象(0x84代表DB存儲(chǔ)區(qū)),地址(“0x01 0x2c”代表DB300,“0x00 0x00 0xe8”代表地址偏移位29,在這里是DBW29)。數(shù)據(jù)流(16進(jìn)制)如表2所示。
3 PC與PLC通訊方法的實(shí)現(xiàn)
3.1 本文的研究內(nèi)容是基于下圖硬件基礎(chǔ)來實(shí)現(xiàn)的
它包括一個(gè)CPU317-2DP,一個(gè)CP343-1通訊模塊等,已組態(tài)CP343-1的IP地址為172.20.100.10,硬件組態(tài)如圖2所示。用于編程實(shí)現(xiàn)通訊的PC機(jī)為帶以太網(wǎng)口的普通筆記本電腦,IP地址為172.20.100.222,測試讀取的變量為DB300.DBW29。
3.2 通訊的主要過程
整個(gè)通訊程序在Visual Studio 2015開發(fā)平臺(tái)下用C#語言實(shí)現(xiàn),通訊的主要過程包括如下幾個(gè)步驟。
(1)建立一個(gè)套接字連接到PLC。注意程序必須包含System.Net.Sockets名稱空間。部分代碼如下:
int result;/*定義返回值*/bool temp = false; //定義狀態(tài)變量
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//創(chuàng)建一個(gè)套接字
(2)連接套接字:
if (sock.Connected==true)//連接前判斷是否為重復(fù)連接
{result = 1;//是則返回值1,已經(jīng)建立連接 }else{try
{sock.Connect(host, port);//連接套接字
//這里host為CP的IP地址“172.20.100.10”,port為整數(shù)102(默認(rèn))
temp = true;/*代表已經(jīng)連接上*/result = 1;}
catch (SocketException e)//連接錯(cuò)誤則輸出報(bào)警信息{errorStr = e.Message + " . Error code:" + e.ErrorCode;result = 0;temp = false;}
(3)與PLC建立握手連接:
if (temp == true)//如果套接字連接正常,則進(jìn)行握手連接
{try{isSize8 = FControlPDUDC.IniTSAP(rack, slot, ConnectionType);
IniPDU();/*連接請求PDU初始化*/ byte[] byteRecv = new byte[240];
byte[] PDUmsg = StructToBytes(FControlPDUDC);
/*初始化完成后,PDUmsg[]字節(jié)數(shù)組為:
[0x03 0x00 0x00 0x16 0x11 0xe0 0x00 0x00 0x00 0x01 0x00 0xc0 0x01 0x0a 0xc1 0x02 0x01 0x00 0xc2 0x02 0x01 0x02]*/
int bytesSent = sock.Send(PDUmsg);int bytesRec = sock.Receive(byteRecv);byte[] byteRecv = new byte[240];
……//初始化NegMsg
/*初始化完成后用于再次握手的NegMsg[]字節(jié)數(shù)組為:
[0x03 0x00 0x000x190x02 0xf0 0x80 0x32 0x01 0x00 0x00 0x03 0x00 0x00 0x08 0x00 0x00 0xF0 0x00 0x00 0x01 0x00 0x01 0x01 0xe0]*/
int NegSent = sock.Send(NegMsg);int NegbytesRec = sock.Receive(NegbyteRecv);result = 1;}catch (SocketException e)
{result = 0;errorStr = e.Message + ". Error code:" + e.ErrorCode;}}
(4)讀取DB存儲(chǔ)區(qū)變量測試:
int result = 0;if (sock.Connected==true)
{…… /準(zhǔn)備讀取變量PDU,初始化 PDUSend
/*初始化完成后,PDUSend[]字節(jié)數(shù)組為:
[0x03 0x00 0x00 0x1f 0x02 0xf0 0x80 0x32 0x01 0x00 0x00 0x04 0x00 0x00 0xe0 0x00 0x00 0x04 0x01 0x12 0x0a 0x10 0x02 0x00 0x0a 0x01 0x2c 0x84 0x00 0x00 0xe8]*/
try{int i = sock.Send(PDUSend);sock.Receive(DataRecv);
receiveBuffer = new byte[totalNum];
……/*處理PLC返回的字節(jié)*/
result = 1;}catch (SocketException e)//異常處理
{errorStr = e.Message + ". Error code:" + e.ErrorCode;result = 0;}}
else{result = 0;}return result;
4 結(jié)論
隨著微軟宣布將全部.NET服務(wù)器端框架開源,將.NET運(yùn)行平臺(tái)擴(kuò)展至Linux和Mac OS,讓開發(fā)者能夠使用.NET在Windows、Mac和Linux三大平臺(tái)上開發(fā)應(yīng)用?;?NET平臺(tái)的開發(fā)的通訊程序幾乎不需要修改任何代碼就可以很好的移植到任何支持.NET的平臺(tái)之上。因此,本文的研究對于跨平臺(tái)西門子S7_300PLC通訊的開發(fā)也具有指導(dǎo)意義。
參考文獻(xiàn)
[1]Nagel C,Evjen B,Glynn J,et al. Professional C# 4.0 and.NET 4[J]. Wiley John + Sons,2010.
[2]賈濤.西門子S7-200以太網(wǎng)通訊協(xié)議研究[J].電子技術(shù)與軟件工程,2014(24):30-32.