劉 鑫,王學(xué)華*,白志城,申楷赟,王 剛
(1.武漢工程大學(xué) 材料科學(xué)與工程學(xué)院,湖北 武漢 430205; 2.縱橫皆景(武漢)信息技術(shù)有限公司,湖北 武漢 430204)
智能泊車系統(tǒng)是將先進的圖像識別技術(shù)與工業(yè)自動化技術(shù)相結(jié)合[1-2],通過計算機的數(shù)據(jù)計算與圖像處理,對進出智能車庫車輛的存放、測量、收費、引導(dǎo)為一體的全方位管理系統(tǒng)[3]。該系統(tǒng)以用戶個人信息作為車輛出入車庫的憑證,用先進的激光雷達測距技術(shù)和高清號牌機獲取車輛信息[4],再通過控制裝置控制機械手將車輛抓取到托盤小車后引導(dǎo)至指定停車位,實現(xiàn)用戶的停取車需求。智能泊車庫因其穩(wěn)定的通訊和強大的數(shù)據(jù)庫管理每一個用戶及其車輛的信息,解決了現(xiàn)有停車場存在的安全隱患[5]。
PLC因具有靈活性好、通用性強和性價比高等優(yōu)點使其在工業(yè)自動化工程中應(yīng)用廣泛[6]。在智能泊車庫中選用PLC為核心建立運動控制系統(tǒng)可以有效提高系統(tǒng)的自動化程度和安全性,但由于PLC單獨處理數(shù)據(jù)能力較差[7],所以需要與上位機結(jié)合彌補這些缺陷[8]。如PLC在操控激光雷達對目標物體與周邊信息進行感知與采集的過程中,PLC無法對相關(guān)數(shù)據(jù)進行處理,所以通過與上位機結(jié)合,建立可以實現(xiàn)數(shù)據(jù)交互的通訊模塊將數(shù)據(jù)傳輸?shù)缴衔粰C進行處理。
PLC常用的通信協(xié)議有MPI、PROFIBUS、工業(yè)以太網(wǎng)以及串口通信等[9],其中基于工業(yè)以太網(wǎng)的Modbus通訊協(xié)議具有診斷能力強、數(shù)據(jù)傳輸量大、成本低等特點[10],主要用于對PLC寄存器中數(shù)據(jù)讀寫等操作,現(xiàn)已被眾多機械設(shè)備產(chǎn)品支持并使用[11],所以選用Modbus協(xié)議作為系統(tǒng)的通訊協(xié)議。而在PLC與終端機數(shù)據(jù)交互過程中,傳統(tǒng)的XML技術(shù)在Modbus數(shù)據(jù)解析上效率較低,因此在數(shù)據(jù)傳輸應(yīng)用開發(fā)中引用Json技術(shù)將Modbus數(shù)據(jù)封裝成為Json對象,通過以太網(wǎng)傳輸可以有效提高傳輸效率。該文通過對Modbus協(xié)議和Json技術(shù)的解析,設(shè)計了一種以Modbus通信協(xié)議與Json技術(shù)為紐帶,利用上位機(終端機)與PLC進行數(shù)據(jù)傳輸實現(xiàn)車庫停取車功能的系統(tǒng)。
智能終端系統(tǒng)主要分為數(shù)據(jù)處理模塊、數(shù)據(jù)傳輸模塊和數(shù)據(jù)采集模塊。數(shù)據(jù)處理模塊主要是終端機,它的主要功能是發(fā)送和接收指令以及對系統(tǒng)信息進行處理。數(shù)據(jù)采集層主要有號牌機、激光雷達、地感線圈、光電傳感器等,它的主要功能是采集外部信息如車輛位置坐標、號牌等。數(shù)據(jù)傳輸模塊是數(shù)據(jù)采集模塊與數(shù)據(jù)處理模塊進行數(shù)據(jù)交互的重要媒介。在實際應(yīng)用中由于用戶可以操作多臺終端機,所以PLC需要通過以太網(wǎng)接入交換機,通過交換機可同時與多臺終端機進行數(shù)據(jù)傳輸且互不干擾。通訊流程為用戶在終端機上輸入指令,指令通過數(shù)據(jù)交互模塊發(fā)送至PLC,PLC對指令進行分析處理后,操控數(shù)據(jù)采集層開始數(shù)據(jù)采集并將數(shù)據(jù)傳送至終端機,實現(xiàn)了終端機與PLC之間的數(shù)據(jù)傳輸。系統(tǒng)數(shù)據(jù)傳輸?shù)募軜?gòu)如圖1所示。
自助終端機是用戶在智能泊車庫中完成車輛停取的主要操作設(shè)備。作為無人值守的自動泊車終端系統(tǒng)需具備以下主要功能:停車功能、取車功能和支付功能。
停車功能主要包括用戶信息認證、車輛信息讀取與數(shù)據(jù)庫數(shù)據(jù)同步等。用戶將車輛駛進停車場后,在終端機上選擇停車操作,輸入賬戶信息,終端機系統(tǒng)進行用戶和車輛信息驗證,驗證通過后打印停車憑條,發(fā)出停車動作指令,泊車系統(tǒng)自動完成停車操作。
圖1 智能終端數(shù)據(jù)傳輸系統(tǒng)架構(gòu)
取車功能主要是驗證用戶信息以取出車輛。用戶只需將停車憑條放在終端機上的掃描設(shè)備進行識別[12],終端系統(tǒng)根據(jù)掃碼信息進行身份認證,認證通過則可以取出車輛,并顯示停車時長和費用。
支付功能主要用于完成取車費用的支付和發(fā)送道閘動作指令。取車信息驗證通過后,終端顯示支付界面,用戶完成支付后,終端發(fā)送支付完成信息和道閘動作指令,泊車系統(tǒng)隨即會將車輛取至待取區(qū)域,用戶即可將車輛駛出車庫,完成取車過程。
Modbus通訊協(xié)議是一種應(yīng)用層協(xié)議,連接在不同網(wǎng)絡(luò)設(shè)備之間提供服務(wù)器與客戶端通信,其具有支持串口(主要是RS-485總線)和以太網(wǎng)的功能,協(xié)議包括Modbus RTU,Modbus ASCII和Modbus TCP三種[13]。該系統(tǒng)采用基于以太網(wǎng)的Modbus TCP協(xié)議,屬于客戶端/服務(wù)器模式進行通信,客戶端發(fā)出數(shù)據(jù)請求消息,服務(wù)端收到消息后就發(fā)送數(shù)據(jù)到客戶端以響應(yīng)請求,客戶端確定了服務(wù)端響應(yīng)后表示連接已建立。
Modbus TCP數(shù)據(jù)結(jié)構(gòu)如圖2所示,基于TCP/IP協(xié)議的Modbus數(shù)據(jù)格式包含通信報頭和協(xié)議數(shù)據(jù)單元。通信報頭包含事務(wù)標識符(2字節(jié))、協(xié)議標識符(2字節(jié))、長度(2字節(jié))和單元標識(1字節(jié)),事務(wù)標識符在每次通信完成會進行累加以區(qū)別不同的通信報文;由于該文采用的是Modbus TCP協(xié)議,所以協(xié)議標識為0×0000;長度表示數(shù)據(jù)長度,單位為字節(jié);單元標識符代表設(shè)備地址,該文擬用0×02作為終端標識。而協(xié)議數(shù)據(jù)單元包括功能碼(1字節(jié))和數(shù)據(jù)集(n字節(jié)),功能碼用于指出要求進行的操作,該文主要運用功能碼0×03和0×04,0×03代表讀取寄存器數(shù)據(jù),0×04代表在指定地址寄存器中寫入數(shù)據(jù);數(shù)據(jù)集即傳輸數(shù)據(jù)是一個可變字段,每個字節(jié)8 bit,字段長短根據(jù)數(shù)據(jù)大小決定。
圖2 Modbus TCP消息幀的數(shù)據(jù)結(jié)構(gòu)
Json對象的數(shù)據(jù)結(jié)構(gòu)為鍵值對結(jié)構(gòu),即“key/value”集合。key為對象的屬性,可以是數(shù)據(jù)類型,也可以是一個數(shù)組,而value表示其對應(yīng)的值,該文采用的Json格式表示為:
{"terminal”:“0001”,
“status”:“0001” ,
“Parking allowed”:“ 0002”,
“Voucher number”:“1423”,
“Parking fee”:“0034"}
從以上結(jié)構(gòu)可以看出,Json格式適用于本系統(tǒng)Modbus協(xié)議指令的數(shù)據(jù)格式,合理地使用Json處理終端機與PLC之間傳輸?shù)臄?shù)據(jù),可以有效提高Modbus協(xié)議的通訊效率,并且可以簡化應(yīng)用程序的開發(fā)。
終端機上的通訊程序主要完成以下任務(wù):初始化通訊程序、發(fā)送通訊請求、檢驗數(shù)據(jù)幀是否正確、執(zhí)行讀寫指令、接收返回結(jié)果。程序流程為:終端機主動聯(lián)絡(luò)PLC,首先初始化通信模塊,然后發(fā)送握手信號,其中包括IP地址、端口號等,PLC接收到地址后會先與本身IP比較,如果地址無誤則回應(yīng)終端機確認連接,當(dāng)終端機接收到PLC確認信息后,則表示通信已經(jīng)建立,同時可以讀寫PLC寄存器中的數(shù)據(jù),通訊流程如圖3所示。
3.1.1 連接PLC
因為泊車庫設(shè)備采用以太網(wǎng)互聯(lián),所以需要根據(jù)PLC配置設(shè)置參數(shù)。在連接程序中,網(wǎng)關(guān)的IP參數(shù)設(shè)為127.0.0.1,端口號為502,同時回調(diào)函數(shù)返回連接狀態(tài)值,程序如下:
IPAddress[]IpAdd=Dns.GetHostAddresses ("127.0.0.1");// IP地址
IPEndPoint joint=new IPEndPoint(Ip Add[1],502) ;//端口號
AsyncCallback Value=new AsyncCal lback (ConnectCallback1);//回調(diào)函數(shù)
AsyncResult connResult =s1.Begin Co nnect(joint,callback,s1);
connResult.AsyncWaitHandle.WaitOne(50,true);
該網(wǎng)關(guān)可以自動診斷與PLC的連接,終端程序會定時發(fā)送報文至PLC,PLC則會發(fā)送返回值以確定連接正常。設(shè)定時間為50 ms,如果終端程序沒有接收到檢測數(shù)據(jù),則表示通信連接異常。如果連接正常,便可以進行讀寫操作。
圖3 通訊流程
3.1.2 讀取寄存器
對PLC寄存器中指定地址的DB塊進行數(shù)據(jù)讀寫需要指定地址和讀取數(shù)據(jù)長度,根據(jù)通信協(xié)議發(fā)送和讀取指定格式數(shù)據(jù),并轉(zhuǎn)成文本格式保存在本地。
OperateResult
if (read.IsSuccess)
{
Value_List.Text = "";
String returned_value=ByteToHexString (re ad.Content);
}
else
{
toolStripStatusLabel1.Text="讀取失?。?+read.ToMessageShowString();}
3.1.3 寫入寄存器
PLC_Write_value Retured_value_write=DeserializeJsonToObject
writeResultRender(busTcpClient.WriteRegister(ushort.Parse(Retured_value_write.Adress),short.Parse(Retured_value_write.Value));
Retured_value_write.Adress);寫入數(shù)據(jù)
3.1.4 轉(zhuǎn)Json格式
ArrayList array=GetSeparateSubString(str, 4);
int Read_adress=Convert.ToInt32(addr ss);
Retured_v.Clear();
foreach (string arr in array)
{
PLC_Retured_value Retured_value=new PLC_Retured_value();
Value_List.Text +="DB地址" + Read_adress + ": "+ arr + " ";
Retured_value.Adress=Read_adress. ToStri ng();
Retured_value.Value=arr;//實體集合序列化和反序列化
Retured_v.Add(Retured_value);
Read_adress++;
}
該系統(tǒng)PLC選用西門子S7-1200系列,S7-1200系列PLC采用模塊化結(jié)構(gòu),各模塊都具有很好的可擴展性,可搭載中央處理器(CPU)、電源、I/O模塊以及通訊模塊[14]。博途(TIA)是西門子工業(yè)常用的集成自動化軟件,可對PLC進行組態(tài)、編程和調(diào)試。以太網(wǎng)連接設(shè)備后,使用TIA V14軟件找尋到PLC設(shè)備,選中PLC點擊下載硬件和軟件信息,PG/PC接口類型選擇PN/IE[15]。初始化PLC,在通信模塊中選擇MODBUS_SERVER功能塊,并添加至PLC程序集,并按圖4所示的方式設(shè)置通訊參數(shù)和數(shù)據(jù)塊。
圖4 Modbus通信模塊
在PLC程序中添加DB塊,定義了終端機與PLC需要傳輸?shù)臄?shù)據(jù),其中數(shù)據(jù)名稱、數(shù)據(jù)類型和偏移量等如表1所示,終端機程序可以通過地址和偏移量讀寫這些數(shù)據(jù)值。
表1 PLC中DB塊的數(shù)據(jù)結(jié)構(gòu)
在搭載Windows 64位操作系統(tǒng)的計算機上進行開發(fā)與通訊測試,系統(tǒng)測試在無干擾的環(huán)境下進行。在測試過程中,使用Modbus Slave軟件模擬現(xiàn)場PLC情況,在Modbus Slave上添加數(shù)據(jù)內(nèi)容,根據(jù)表1定義的數(shù)據(jù)名稱及大小如圖5所示,同時選擇連接方式為Modbus TCP/IP,設(shè)定IP地址為127.0.0.1,端口號為502。終端程序通過與Modbus Slave軟件連接,通過讀寫表中數(shù)據(jù)測試通訊程序性能。
圖5 Modbus Slave數(shù)據(jù)界面
在通訊程序上輸入IP地址和端口號,運行程序后與Modbus Slave建立連接,由于有18個模擬數(shù)據(jù),所以在程序上設(shè)定DB塊地址為0~17位,設(shè)定讀取時間間隔為100 ms,得出讀寫數(shù)據(jù)結(jié)果。通訊程序中,利用Stopwatch函數(shù)計算出讀寫數(shù)據(jù)時間,通過多次反復(fù)測試,測試結(jié)果如表2所示。
表2 單組數(shù)據(jù)通訊測試結(jié)果
多組數(shù)據(jù)通訊測試是在單組數(shù)據(jù)通訊測試基礎(chǔ)上,在Modbus Slave上更改數(shù)據(jù)類型與數(shù)據(jù)值,同時更改通訊數(shù)據(jù)量,在相同的環(huán)境下進行測試。設(shè)定五組數(shù)據(jù),每組測試數(shù)據(jù)取50次測試的平均值,測試結(jié)果如表3所示。從統(tǒng)計結(jié)果可以看出,在通訊數(shù)據(jù)不同的情況下,通訊程序的讀寫操作誤差為0,單次讀寫時間誤差不超過1 ms,并且程序運行過程中占用計算機內(nèi)存不超過40 MB。
表3 多組數(shù)據(jù)通訊測試統(tǒng)計
通過對ModbusTCP協(xié)議的解析,采用C#編程語言開發(fā)了基于ModbusTCP通信協(xié)議的終端通訊系統(tǒng),并對ModbusTCP通訊數(shù)據(jù)封裝成Json格式傳輸,實現(xiàn)了終端機與PLC之間的實時通訊和數(shù)據(jù)傳輸。該系統(tǒng)在與Modbus Slave軟件測試結(jié)果表明,數(shù)據(jù)量在150個以內(nèi)終端通訊系統(tǒng)通信正常、運行穩(wěn)定,驗證了系統(tǒng)的可行性,達到了技術(shù)指標。