陳元凱 蓋超會 谷玉玲
(武漢軟件工程職業(yè)學(xué)院 電子工程學(xué)院 湖北 武漢:430205)
Modbus-TCP通信協(xié)議是一種已廣泛應(yīng)用于當(dāng)今工業(yè)控制領(lǐng)域的通用通信協(xié)議。通過此協(xié)議,控制器經(jīng)由網(wǎng)絡(luò)(如以太網(wǎng))可以和其它設(shè)備之間進(jìn)行數(shù)據(jù)通信。Siemens S7-1200 PLC作為一種高可靠性的控制器,通過與RFID射頻讀寫器進(jìn)行數(shù)據(jù)通信實(shí)現(xiàn)IC卡數(shù)據(jù)的讀寫,不但可以實(shí)現(xiàn)對生產(chǎn)過程的精準(zhǔn)控制,更能實(shí)現(xiàn)對用戶數(shù)據(jù)的實(shí)時(shí)管理。本文從Modbus-TCP通信協(xié)議以及RFID讀寫器的功能入手,詳細(xì)介紹了PLC與RFID讀寫器之間的讀取與寫入數(shù)據(jù)的程序編寫與調(diào)試方法。
Modbus/TCP是簡單的、中立廠商的用于管理和控制自動化設(shè)備的Modbus系列通信協(xié)議的派生產(chǎn)品,它覆蓋了使用TCP/IP協(xié)議的“Intranet”和“Internet”環(huán)境中Modbus報(bào)文的用途。協(xié)議的最通用用途是為諸如PLC、I/O模塊以及連接其它簡單域總線或I/O模塊的網(wǎng)關(guān)服務(wù)的。
Modbus/TCP 使Modbus_RTU協(xié)議運(yùn)行于以太網(wǎng),Modbus TCP使用TCP/IP和以太網(wǎng)在站點(diǎn)間傳送Modbus報(bào)文,Modbus/TCP結(jié)合了以太網(wǎng)物理網(wǎng)絡(luò)和網(wǎng)絡(luò)標(biāo)準(zhǔn)TCP/IP以及以Modbus作為應(yīng)用協(xié)議標(biāo)準(zhǔn)的數(shù)據(jù)表示方法[1]。Modbus/TCP通信報(bào)文被封裝于以太網(wǎng)TCP/IP數(shù)據(jù)包中。與傳統(tǒng)的串口方式,Modbus/TCP插入一個(gè)標(biāo)準(zhǔn)的Modbus報(bào)文到TCP報(bào)文中,不再帶有數(shù)據(jù)校驗(yàn)和地址。
Modbus數(shù)據(jù)在TCP/IP以太網(wǎng)上傳輸,支持Ethernet II和802.3兩種幀格式,Modbus TCP數(shù)據(jù)幀包含報(bào)文頭、功能代碼和數(shù)據(jù)3部分[2]。MBAP報(bào)文頭(MBAP、Modbus Application Protocol、Modbus應(yīng)用協(xié)議)分4個(gè)域,共7個(gè)字節(jié),如圖1所示。
RFID讀寫器(Radio Frequency Identification的縮寫)即無線射頻識別,是一種非接觸式的自動識別技術(shù),其基本原理是利用射頻信號和空間耦合(電感或電磁耦合)或雷達(dá)反射的傳輸特性,實(shí)現(xiàn)對被識別物體的自動識別。通過天線與RFID電子標(biāo)簽進(jìn)行無線通信,可以實(shí)現(xiàn)對標(biāo)簽識別碼和內(nèi)存數(shù)據(jù)的讀出或?qū)懭氩僮鱗3]。典型的RFID讀寫器包含有RFID射頻模塊(發(fā)送器和接收器)、控制單元以及天線,IC-11HMRW型RFID射頻讀寫器如圖2所示。
圖1 Modbus_TCP的數(shù)據(jù)幀
圖2 IC-11HMRW型RFID射頻讀寫器
RFID射頻讀寫器讀寫器在Modbus-TCP通信中作為服務(wù)端監(jiān)聽設(shè)備端口,當(dāng)有客戶端連接請求時(shí)響應(yīng)并創(chuàng)建連接。讀寫器設(shè)備的默認(rèn)端口號為39169,默認(rèn)站號為2,IC-11HMRW型RFID射頻讀寫器的部分寄存器地址功能說明如表1所示。
表1 RFID射頻讀寫器的部分寄存器地址
網(wǎng)絡(luò)結(jié)構(gòu)要求利用工業(yè)以太網(wǎng)線纜,按照圖3所示的網(wǎng)絡(luò)結(jié)構(gòu)邏輯拓?fù)鋱D將交換機(jī)、上位機(jī)、RFID讀寫器與S7-1200連接起來并設(shè)置好相應(yīng)的IP地址。
圖3 網(wǎng)絡(luò)結(jié)構(gòu)圖
在RFID讀寫器上讀IC卡,當(dāng)RFID讀寫器檢測到有卡時(shí)點(diǎn)亮PLC的Q0.1,無卡時(shí)熄滅。同時(shí)利用S7-1200 PLC的讀取操作將IC卡中0010~0013(40011~40014)4個(gè)寄存器中存儲的數(shù)據(jù)讀取到S7-1200 PLC的DB塊數(shù)組中進(jìn)行保存。
在RFID讀寫器上寫IC卡,需將4組16進(jìn)制數(shù)1234、5678、9ABC、DEF0分別寫入到IC卡中0010~0013(40011~40014)4個(gè)寄存器中。寫入完成后再立即用RFID讀卡操作讀取IC卡中的數(shù)據(jù)。
依據(jù)系統(tǒng)要求,PLC與RFID射頻讀寫器的通信程序主要分為IC卡讀操作與IC卡寫操作兩大部分,同時(shí)IC卡讀操作到卡寫操作的過程需要通過手動切換,而IC卡寫操作到IC卡讀操作則需自動切換,故根據(jù)RFID射頻讀寫器功能及寄存器說明設(shè)計(jì)PLC通信程序,PLC程序設(shè)計(jì)流程如圖4所示。
圖4 PLC程序設(shè)計(jì)流程
(1)在TIA博途軟件中創(chuàng)建名為“RFID數(shù)據(jù)讀取及寫入”工程,添加硬件后分別創(chuàng)建名為“IC卡讀取”和“IC卡寫入”的FC功能塊。
(2)向工程中創(chuàng)建一個(gè)名為“connect”的全局DB數(shù)據(jù)塊,用于存儲連接數(shù)據(jù)和通信數(shù)據(jù),并在該數(shù)據(jù)塊的屬性中取消其“優(yōu)化塊訪問”。
(3)向“connect”數(shù)據(jù)塊中添加兩個(gè)4字節(jié)數(shù)組、5個(gè)字節(jié)變量及1個(gè)TCON_IP_v4變量,數(shù)組分別命名為“receive”和“send”,“receive”數(shù)組用于接收RFID讀寫器的數(shù)據(jù),“send”數(shù)組用于向RFID讀寫器發(fā)送數(shù)據(jù),5個(gè)字節(jié)變量分別命名為“Answer1”、“Answer2”、“Answer3”、“Request1”和“Request2”,TCON_IP_v4變量命名為“IP”用于存儲Modbus TCP連接端口及地址,“connect”數(shù)據(jù)塊數(shù)據(jù)添加如圖5所示。
圖5 “connect”數(shù)據(jù)塊數(shù)據(jù)添加
系統(tǒng)要求利用RFID讀寫器向IC卡中寫入16進(jìn)制1234、5678、9ABC、DEF0四個(gè)數(shù)據(jù),故相應(yīng)的設(shè)置“send”數(shù)組的4個(gè)字節(jié)的初值。設(shè)置Request1和Request2的初值分別為16#8和16#4,這兩個(gè)字節(jié)用于向RFID讀寫器提出請求。設(shè)置TCON_IP_v4變量中“InterfaceID”、“ID”、“ADDR[1]”、“ADDR[2]”、“ADDR[3]”、“ADDR[4]”、“RemotePort”、“LocalPort”的初值分別為64、16#01、192、168、0、242、39169和0,其中ADDR[1]~ADDR[4]為遠(yuǎn)程通信對象IP地址的4個(gè)字節(jié),RemotePort為遠(yuǎn)程通信對象即RFID讀寫器的端口號,LocalPort為PLC本地端口號。
在主程序中調(diào)用“IC卡讀取”和“IC卡寫入”FC功能塊,并通過同一觸點(diǎn)連接,實(shí)現(xiàn)IC卡讀取與寫入操作的切換,根據(jù)系統(tǒng)要求,默認(rèn)為IC卡讀取狀態(tài),僅當(dāng)觸發(fā)IC卡寫入時(shí)才切換至寫入狀態(tài),故設(shè)置M6.0作為IC卡讀取操作與IC卡寫入操作的切換開關(guān),Main函數(shù)如圖6所示。
圖6 Main函數(shù)程序
4.4.1 MB_CLIENT指令塊
在本例中RFID讀寫器作為服務(wù)端,S7-1200 PLC作為客戶端。在程序中添加Modbus TCP客戶端通信指令MB_CLIENT,該指令用于通過PROFINET在客戶端和服務(wù)器之間建立連接、發(fā)送Modbus請求、接收響應(yīng)并控制Modbus TCP客戶端的連接終端。需要注意的是Modbus查詢開始后,背景數(shù)據(jù)塊將鎖定,其它客戶端無法使用,因此與Modbus RTU類似,MB_CLIENT需利用輪詢操作實(shí)現(xiàn)同一指令多次調(diào)用的遍歷[4]。
4.4.2 判斷RFID讀寫器上是否有IC卡
根據(jù)前文的介紹,當(dāng)讀取到00007寄存器(地址為40008)的第四位為1時(shí),即表示有IC卡在RFID讀寫器的在感應(yīng)區(qū),故在FC1“IC卡讀取”功能塊中編寫程序判斷是否有卡,IC卡判斷程序如圖7所示。
其中當(dāng)M100.0觸發(fā)后PLC從00007寄存器讀取長度為1個(gè)字節(jié)的數(shù)據(jù)并將其保存在DB2.DBW8中。由于讀取到00007寄存器(地址為40008)的第四位為1時(shí)表示有卡,故可利用讀取到的DB2.DBW8與16#0010進(jìn)行比較,當(dāng)讀寫器上有卡時(shí)點(diǎn)亮指示燈Q0.1。
MB_CLIENT指令需利用輪詢操作實(shí)現(xiàn)同一指令多次調(diào)用的遍歷,故利用MB_CLIENT指令的完成位及錯誤位觸發(fā)TP脈沖定時(shí)器500毫秒的延時(shí)后復(fù)位當(dāng)前讀取操作的REQ請求位并置位下一操作的REQ請求位[5]。
圖7 IC卡判斷程序
4.4.3 請求讀取第一操作空間指定數(shù)據(jù)區(qū)域
根據(jù)程序編寫流程,在讀取IC卡的數(shù)據(jù)前需向00007寄存器(地址40008)寫入16#0008進(jìn)行數(shù)據(jù)讀取請求,待00007寄存器回復(fù)16#0012后方可執(zhí)行IC卡數(shù)據(jù)的讀取操作,故讀取第一操作空間時(shí)需利用MB_CLIENT指令向地址40008執(zhí)行寫操作,然后再對地址40008執(zhí)行讀操作,讀取第一操作空間指定數(shù)據(jù)區(qū)域請求程序如圖8所示。
圖8 讀取第一操作空間指定數(shù)據(jù)區(qū)域請求程序
4.4.4 讀取指定區(qū)域數(shù)據(jù)
在數(shù)據(jù)讀取請求得到回復(fù)后便可讀取4個(gè)寄存器中的數(shù)據(jù),輪詢觸發(fā)M100.3后,PLC讀取從40011開始的4個(gè)寄存器中的數(shù)據(jù)保存到從DB2.DBW0開始的4個(gè)字中。需要的注意的是由于輪詢控制算法是實(shí)現(xiàn)數(shù)據(jù)讀寫操作的輪流循環(huán),故在最后一步讀數(shù)據(jù)操作結(jié)束后再次置位第一步讀卡操作中的請求位,以實(shí)現(xiàn)輪詢控制[6]。
4.5.1 IC卡數(shù)據(jù)寫入
根據(jù)系統(tǒng)要求,需將4組16進(jìn)制數(shù)分別寫入到IC卡中4個(gè)寄存器中,由于這4組16進(jìn)制數(shù)保存在DB2.DBW14開始的4個(gè)字的初值中,故在FC2“IC卡寫入”功能塊中添加寫操作指令,當(dāng)手動觸發(fā)寫操作按鈕M100.4后便可將這4個(gè)字臨時(shí)存儲到40011開始的4個(gè)寄存器中,同時(shí)利用輪詢控制算法觸發(fā)下一步使能數(shù)據(jù)入卡操作。注意此時(shí)的寫入僅是臨時(shí)存儲,只有激活使能后才能使數(shù)據(jù)保存到IC卡中。
要使數(shù)據(jù)存入卡中需向40008寄存器中寫入16#0004,使能數(shù)據(jù)存儲操作。故利用輪詢觸發(fā)寫操作指令將存儲16#0004數(shù)據(jù)的DB2.DBW24寫入到40008中,使能數(shù)據(jù)存入到IC卡,IC卡數(shù)據(jù)寫入程序如圖9所示。
圖9 IC卡數(shù)據(jù)寫入程序
4.5.2 讀取返回值,判斷是否寫入成功
數(shù)據(jù)存儲并使能完成后需繼續(xù)讀取40008寄存器的回復(fù)值,若回復(fù)為16#0011即為數(shù)據(jù)寫入成功。利用讀操作指令,將40008寄存器的值讀取到DB2.DBW12中,若返回值為16#0011則通過比較指令觸發(fā)寫入操作完成,即完成IC卡寫操作。IC卡寫操作完成后需自動切換至IC卡讀取狀態(tài),故輪詢控制的最后一步需復(fù)位IC卡寫切換開關(guān)M6.0,使系統(tǒng)自動切換至IC卡讀取功能塊。
在RFID讀寫器上放置一張有數(shù)據(jù)的IC卡,監(jiān)視DB塊中receive接收數(shù)組及應(yīng)答回復(fù)字Answer1和Answer2,此時(shí)能夠從數(shù)組中讀取到數(shù)據(jù),且應(yīng)答回復(fù)字均為16#0012,即表示此時(shí)RFID讀寫器上有卡,且卡內(nèi)40011到40014寄存器內(nèi)有數(shù)據(jù),IC卡讀取功能測試如圖10所示。
IC卡數(shù)據(jù)讀取完成后啟用IC卡寫入功能,將默認(rèn)send數(shù)組中的4個(gè)16進(jìn)制數(shù)寫入到卡中,寫入完成后系統(tǒng)自動切換回IC讀取功能,再次監(jiān)視DB塊中receive接收數(shù)組及應(yīng)答回復(fù)字Answer1和Answer2,此時(shí)從數(shù)組中讀取到的數(shù)據(jù)即為IC卡寫入的數(shù)據(jù),即IC卡寫入功能測試成功,IC卡寫功能測試如圖11所示。
本文針對IC-11HMRW型RFID射頻讀寫器,詳細(xì)闡述了Siemens S7-1200 PLC與RFID讀寫器進(jìn)行以太網(wǎng)通信實(shí)現(xiàn)IC卡讀操作和寫操作的程序設(shè)計(jì)方法,并在TIA博途軟件中進(jìn)行了仿真調(diào)試。實(shí)踐證明該系統(tǒng)運(yùn)行穩(wěn)定、程序設(shè)計(jì)方案可行。
圖10 IC卡讀取功能測試
圖11 IC卡寫功能測試