劉 鑫,王學華*,白志城,申楷赟,王 剛
(1.武漢工程大學 材料科學與工程學院,湖北 武漢 430205; 2.縱橫皆景(武漢)信息技術有限公司,湖北 武漢 430204)
智能泊車系統是將先進的圖像識別技術與工業自動化技術相結合[1-2],通過計算機的數據計算與圖像處理,對進出智能車庫車輛的存放、測量、收費、引導為一體的全方位管理系統[3]。該系統以用戶個人信息作為車輛出入車庫的憑證,用先進的激光雷達測距技術和高清號牌機獲取車輛信息[4],再通過控制裝置控制機械手將車輛抓取到托盤小車后引導至指定停車位,實現用戶的停取車需求。智能泊車庫因其穩定的通訊和強大的數據庫管理每一個用戶及其車輛的信息,解決了現有停車場存在的安全隱患[5]。
PLC因具有靈活性好、通用性強和性價比高等優點使其在工業自動化工程中應用廣泛[6]。在智能泊車庫中選用PLC為核心建立運動控制系統可以有效提高系統的自動化程度和安全性,但由于PLC單獨處理數據能力較差[7],所以需要與上位機結合彌補這些缺陷[8]。如PLC在操控激光雷達對目標物體與周邊信息進行感知與采集的過程中,PLC無法對相關數據進行處理,所以通過與上位機結合,建立可以實現數據交互的通訊模塊將數據傳輸到上位機進行處理。
PLC常用的通信協議有MPI、PROFIBUS、工業以太網以及串口通信等[9],其中基于工業以太網的Modbus通訊協議具有診斷能力強、數據傳輸量大、成本低等特點[10],主要用于對PLC寄存器中數據讀寫等操作,現已被眾多機械設備產品支持并使用[11],所以選用Modbus協議作為系統的通訊協議。而在PLC與終端機數據交互過程中,傳統的XML技術在Modbus數據解析上效率較低,因此在數據傳輸應用開發中引用Json技術將Modbus數據封裝成為Json對象,通過以太網傳輸可以有效提高傳輸效率。該文通過對Modbus協議和Json技術的解析,設計了一種以Modbus通信協議與Json技術為紐帶,利用上位機(終端機)與PLC進行數據傳輸實現車庫停取車功能的系統。
智能終端系統主要分為數據處理模塊、數據傳輸模塊和數據采集模塊。數據處理模塊主要是終端機,它的主要功能是發送和接收指令以及對系統信息進行處理。數據采集層主要有號牌機、激光雷達、地感線圈、光電傳感器等,它的主要功能是采集外部信息如車輛位置坐標、號牌等。數據傳輸模塊是數據采集模塊與數據處理模塊進行數據交互的重要媒介。在實際應用中由于用戶可以操作多臺終端機,所以PLC需要通過以太網接入交換機,通過交換機可同時與多臺終端機進行數據傳輸且互不干擾。通訊流程為用戶在終端機上輸入指令,指令通過數據交互模塊發送至PLC,PLC對指令進行分析處理后,操控數據采集層開始數據采集并將數據傳送至終端機,實現了終端機與PLC之間的數據傳輸。系統數據傳輸的架構如圖1所示。
自助終端機是用戶在智能泊車庫中完成車輛停取的主要操作設備。作為無人值守的自動泊車終端系統需具備以下主要功能:停車功能、取車功能和支付功能。
停車功能主要包括用戶信息認證、車輛信息讀取與數據庫數據同步等。用戶將車輛駛進停車場后,在終端機上選擇停車操作,輸入賬戶信息,終端機系統進行用戶和車輛信息驗證,驗證通過后打印停車憑條,發出停車動作指令,泊車系統自動完成停車操作。

圖1 智能終端數據傳輸系統架構
取車功能主要是驗證用戶信息以取出車輛。用戶只需將停車憑條放在終端機上的掃描設備進行識別[12],終端系統根據掃碼信息進行身份認證,認證通過則可以取出車輛,并顯示停車時長和費用。
支付功能主要用于完成取車費用的支付和發送道閘動作指令。取車信息驗證通過后,終端顯示支付界面,用戶完成支付后,終端發送支付完成信息和道閘動作指令,泊車系統隨即會將車輛取至待取區域,用戶即可將車輛駛出車庫,完成取車過程。
Modbus通訊協議是一種應用層協議,連接在不同網絡設備之間提供服務器與客戶端通信,其具有支持串口(主要是RS-485總線)和以太網的功能,協議包括Modbus RTU,Modbus ASCII和Modbus TCP三種[13]。該系統采用基于以太網的Modbus TCP協議,屬于客戶端/服務器模式進行通信,客戶端發出數據請求消息,服務端收到消息后就發送數據到客戶端以響應請求,客戶端確定了服務端響應后表示連接已建立。
Modbus TCP數據結構如圖2所示,基于TCP/IP協議的Modbus數據格式包含通信報頭和協議數據單元。通信報頭包含事務標識符(2字節)、協議標識符(2字節)、長度(2字節)和單元標識(1字節),事務標識符在每次通信完成會進行累加以區別不同的通信報文;由于該文采用的是Modbus TCP協議,所以協議標識為0×0000;長度表示數據長度,單位為字節;單元標識符代表設備地址,該文擬用0×02作為終端標識。而協議數據單元包括功能碼(1字節)和數據集(n字節),功能碼用于指出要求進行的操作,該文主要運用功能碼0×03和0×04,0×03代表讀取寄存器數據,0×04代表在指定地址寄存器中寫入數據;數據集即傳輸數據是一個可變字段,每個字節8 bit,字段長短根據數據大小決定。

圖2 Modbus TCP消息幀的數據結構
Json對象的數據結構為鍵值對結構,即“key/value”集合。key為對象的屬性,可以是數據類型,也可以是一個數組,而value表示其對應的值,該文采用的Json格式表示為:
{"terminal”:“0001”,
“status”:“0001” ,
“Parking allowed”:“ 0002”,
“Voucher number”:“1423”,
“Parking fee”:“0034"}
從以上結構可以看出,Json格式適用于本系統Modbus協議指令的數據格式,合理地使用Json處理終端機與PLC之間傳輸的數據,可以有效提高Modbus協議的通訊效率,并且可以簡化應用程序的開發。
終端機上的通訊程序主要完成以下任務:初始化通訊程序、發送通訊請求、檢驗數據幀是否正確、執行讀寫指令、接收返回結果。程序流程為:終端機主動聯絡PLC,首先初始化通信模塊,然后發送握手信號,其中包括IP地址、端口號等,PLC接收到地址后會先與本身IP比較,如果地址無誤則回應終端機確認連接,當終端機接收到PLC確認信息后,則表示通信已經建立,同時可以讀寫PLC寄存器中的數據,通訊流程如圖3所示。
3.1.1 連接PLC
因為泊車庫設備采用以太網互聯,所以需要根據PLC配置設置參數。在連接程序中,網關的IP參數設為127.0.0.1,端口號為502,同時回調函數返回連接狀態值,程序如下:
IPAddress[]IpAdd=Dns.GetHostAddresses ("127.0.0.1");// IP地址
IPEndPoint joint=new IPEndPoint(Ip Add[1],502) ;//端口號
AsyncCallback Value=new AsyncCal lback (ConnectCallback1);//回調函數
AsyncResult connResult =s1.Begin Co nnect(joint,callback,s1);
connResult.AsyncWaitHandle.WaitOne(50,true);
該網關可以自動診斷與PLC的連接,終端程序會定時發送報文至PLC,PLC則會發送返回值以確定連接正常。設定時間為50 ms,如果終端程序沒有接收到檢測數據,則表示通信連接異常。如果連接正常,便可以進行讀寫操作。

圖3 通訊流程
3.1.2 讀取寄存器
對PLC寄存器中指定地址的DB塊進行數據讀寫需要指定地址和讀取數據長度,根據通信協議發送和讀取指定格式數據,并轉成文本格式保存在本地。
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);寫入數據
3.1.4 轉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++;
}
該系統PLC選用西門子S7-1200系列,S7-1200系列PLC采用模塊化結構,各模塊都具有很好的可擴展性,可搭載中央處理器(CPU)、電源、I/O模塊以及通訊模塊[14]。博途(TIA)是西門子工業常用的集成自動化軟件,可對PLC進行組態、編程和調試。以太網連接設備后,使用TIA V14軟件找尋到PLC設備,選中PLC點擊下載硬件和軟件信息,PG/PC接口類型選擇PN/IE[15]。初始化PLC,在通信模塊中選擇MODBUS_SERVER功能塊,并添加至PLC程序集,并按圖4所示的方式設置通訊參數和數據塊。

圖4 Modbus通信模塊
在PLC程序中添加DB塊,定義了終端機與PLC需要傳輸的數據,其中數據名稱、數據類型和偏移量等如表1所示,終端機程序可以通過地址和偏移量讀寫這些數據值。

表1 PLC中DB塊的數據結構
在搭載Windows 64位操作系統的計算機上進行開發與通訊測試,系統測試在無干擾的環境下進行。在測試過程中,使用Modbus Slave軟件模擬現場PLC情況,在Modbus Slave上添加數據內容,根據表1定義的數據名稱及大小如圖5所示,同時選擇連接方式為Modbus TCP/IP,設定IP地址為127.0.0.1,端口號為502。終端程序通過與Modbus Slave軟件連接,通過讀寫表中數據測試通訊程序性能。

圖5 Modbus Slave數據界面
在通訊程序上輸入IP地址和端口號,運行程序后與Modbus Slave建立連接,由于有18個模擬數據,所以在程序上設定DB塊地址為0~17位,設定讀取時間間隔為100 ms,得出讀寫數據結果。通訊程序中,利用Stopwatch函數計算出讀寫數據時間,通過多次反復測試,測試結果如表2所示。

表2 單組數據通訊測試結果
多組數據通訊測試是在單組數據通訊測試基礎上,在Modbus Slave上更改數據類型與數據值,同時更改通訊數據量,在相同的環境下進行測試。設定五組數據,每組測試數據取50次測試的平均值,測試結果如表3所示。從統計結果可以看出,在通訊數據不同的情況下,通訊程序的讀寫操作誤差為0,單次讀寫時間誤差不超過1 ms,并且程序運行過程中占用計算機內存不超過40 MB。

表3 多組數據通訊測試統計
通過對ModbusTCP協議的解析,采用C#編程語言開發了基于ModbusTCP通信協議的終端通訊系統,并對ModbusTCP通訊數據封裝成Json格式傳輸,實現了終端機與PLC之間的實時通訊和數據傳輸。該系統在與Modbus Slave軟件測試結果表明,數據量在150個以內終端通訊系統通信正常、運行穩定,驗證了系統的可行性,達到了技術指標。