余超,謝鵬,曹昌懷,王虎
( 中車戚墅堰機車有限公司,江蘇 常州 213011 )
伴隨芯片技術(shù)、互聯(lián)網(wǎng)技術(shù)的快速發(fā)展,自動化產(chǎn)業(yè)在智能控制及信息技術(shù)方面形成多個分支,如:工業(yè)機器人技術(shù)、工業(yè)互聯(lián)網(wǎng)技術(shù)、人工智能技術(shù)、無人駕駛技術(shù)、碳監(jiān)測等。與此同時,控制總線技術(shù)也取得了相應(yīng)的發(fā)展,由傳統(tǒng)的RS232、RS485、CAN、PROFIBUSDP等總線向工業(yè)以太網(wǎng)發(fā)展,結(jié)合移動網(wǎng)絡(luò)、IT技術(shù)、OPC技術(shù),形成功能復(fù)雜、自動化程度高的物聯(lián)網(wǎng)。
工業(yè)自動化中的傳感器、執(zhí)行器、控制器大量應(yīng)用了Modbus ASCII/RTU總線。Modbus設(shè)備的物理層主要為EIA-485,該物理層允許多個網(wǎng)絡(luò)設(shè)備并聯(lián)通信,單個網(wǎng)絡(luò)最多允許大約240個節(jié)點。本文擬對工作在串行總線上的Modbus RTU/ASCII協(xié)議及以太網(wǎng)上的Modbus TCP進行分析,以國產(chǎn)物聯(lián)網(wǎng)芯片ESP32為基礎(chǔ),開發(fā)一款Modbus無線網(wǎng)關(guān)設(shè)備,實現(xiàn)ESP32通過Modbus RTU讀寫多個支持該協(xié)議的傳感器數(shù)據(jù),并能使S7-1200通過Modbus TCP讀寫ESP32中存儲的數(shù)據(jù),達到向單個IP地址讀寫Modbus協(xié)議數(shù)據(jù)的目的。
Modbus是Modicon公司開發(fā)的一種串行通信協(xié)議,目前已經(jīng)成為工業(yè)領(lǐng)域通訊協(xié)議的業(yè)界標(biāo)準(zhǔn),是現(xiàn)代工業(yè)各類自動化設(shè)備中不同控制部件、檢測部件之間的通訊方式。Modbus協(xié)議規(guī)定其通訊采用主從(Master/Slave)技術(shù):主機發(fā)起通訊請求,向特定地址的從機發(fā)起數(shù)據(jù)傳輸;從機應(yīng)及時返回對查詢做出的響應(yīng)(數(shù)據(jù)),或處理所要求的動作[1]。
Modbus協(xié)議目前存在分別用于串口、以太網(wǎng)及其他支持互聯(lián)網(wǎng)協(xié)議的網(wǎng)絡(luò)版本。大量Modbus裝置僅支持9 600、115 200 bps通訊速率,即最多收發(fā)14.4 KBps數(shù)據(jù),數(shù)據(jù)吞吐量較少。
ESP32是上海樂鑫信息科技公司為移動設(shè)備、可穿戴電子產(chǎn)品和物聯(lián)網(wǎng)(IOT)應(yīng)用而設(shè)計的一款SOC芯片,集成了2個哈佛結(jié)構(gòu)Xtensa LX6 CPU構(gòu)成雙核系統(tǒng)、單時鐘周期可訪問的448 KB內(nèi)部ROM及520 KB內(nèi)部RAM、2.4 GHz Wi-Fi和藍牙雙模,高級外設(shè)接口非常豐富,最大支持16 MB片外SPI Flash及8 MB片外SPI SRAM,是用于設(shè)計Modbus無線網(wǎng)關(guān)的高性價選擇[2]。
Modbus是OSI模型第7層報文傳輸協(xié)議,見表1,可在RS232、RS485、光纖、無線、以太網(wǎng)等介質(zhì)中實現(xiàn)不同器件之間的通信。Modbus協(xié)議可對多種設(shè)備(PLC、觸摸屏、MPI、變頻器、伺服驅(qū)動器、I/O設(shè)備、測量儀表等)進行遠程操作。網(wǎng)關(guān),也可稱作協(xié)議轉(zhuǎn)換器,是不同協(xié)議或不同網(wǎng)絡(luò)之間通信的橋梁。因此,Modbus網(wǎng)關(guān)能完成Modbus RTU/ASCII、Modbus TCP之間的通信。
表1 Modbus通信棧
Modbus協(xié)議運行在串行網(wǎng)絡(luò)、以太網(wǎng)網(wǎng)絡(luò)等物理層,其協(xié)議數(shù)據(jù)單元(PDU)是相同的,均由目標(biāo)通信設(shè)備地址Addr、功能代碼Code、數(shù)據(jù)Data、循環(huán)冗余校驗CRC/LRC組成。在以太網(wǎng)或某些特殊的物理層,Modbus協(xié)議在頭部添加幾個字段,如傳輸標(biāo)志符TID、協(xié)議標(biāo)志符PID、長度Length等,見表2。由于PDU中規(guī)定了Modbus規(guī)定單次傳輸信息長度的數(shù)據(jù)為單個字節(jié),即最大值為256,因此串行鏈路上PDU的最大長度為256字節(jié),從而數(shù)據(jù)Data長度為256-3=252字節(jié)。
表2 Modbus報文幀
Modbus串口通訊通過串口EIA-485物理層進行,可允許大量Modbus設(shè)備在同一個網(wǎng)絡(luò)中通信。由于Modbus總線僅可由主機發(fā)起通訊,因此RS485工作于半雙工模式下,故選用半雙工高速收發(fā)器XD3485擴展ESP32 UART端口。XD3485、MODBUS設(shè)備以菊花鏈拓撲形式進行連接,總線兩端需設(shè)置終端電阻,阻值為120 Ω,信號反射效應(yīng)得到削減。ESP32-WROOM自帶2.4 G印刷天線,連接至無線路由器后可與其他工業(yè)設(shè)備進行通信。MODBUS網(wǎng)關(guān)電路設(shè)計圖如1所示。
圖1 MODBUS網(wǎng)關(guān)電路設(shè)計
ESP32的官方開發(fā)框架為ESP-IDF。核心庫為G0、G1兩部分。
G0包 括hal、xtensa、riscv、esp_rom、esp_common、soc,包含關(guān)于硬件存取的低級指令及信息;esp_common包含硬件接口代碼及工具。G0庫可能相互依賴,但不會依賴其他庫。
G1庫包括esp_hw_support、esp_system、newlib、spi_flash、freertos、log、heap,以G0庫為基礎(chǔ),并可能相互依賴。在G0、G1之上,該框架引入了其他庫支持快速開發(fā),如:asio、ESP-Modbus、freertos、mdns等。用于開發(fā)modbus的庫為ESP-Modbus,對硬件的需求極少,耗用的ROM、RAM分別約為7 KB、0.4KB,支 持MODBUS-RTU、MODBUSASCII、MODBUS-TCP,遵循BSD許可證,用戶可將其應(yīng)用于商業(yè)環(huán)境中[3]。
編寫測試程序發(fā)現(xiàn),F(xiàn)ree-Modbus庫中的MODBUS-TCP默認UID為0,因此只能訪問IP網(wǎng)絡(luò)中目標(biāo)IP對象的一個串行設(shè)備。這對于串行總線為RS232協(xié)議而言較為合適,但對串行總線為RS485稍顯不足,RS485(兩線制)一般可支持32個串行設(shè)備。分析FreeModbus庫,修改相應(yīng)代碼,使MODBUS-TCP正確傳輸UID字段,便于其他設(shè)備通過MODBUSRTU/ASCII協(xié)議完成訪問。FreeModbus庫修改示例如圖2所示。
圖2 FreeModbus庫修改
ESP32 Modbus網(wǎng)關(guān)程序設(shè)計主要分為三部分:數(shù)據(jù)緩存池、通過串行總線存取數(shù)據(jù)、通過以太網(wǎng)絡(luò)連接客戶端并傳輸數(shù)據(jù)。數(shù)據(jù)緩存池用于存儲分時讀取的串行總線設(shè)備中的數(shù)據(jù),以備以太網(wǎng)客戶端訪問,提高ESP32的響應(yīng)速度;串行通訊、以太網(wǎng)通訊均需按照ESPIDF手冊中的API指南,按順序初始化對應(yīng)的硬件建立相應(yīng)通訊。網(wǎng)關(guān)程序結(jié)構(gòu)如圖3所示。
圖3 ESP32 Modbus網(wǎng)關(guān)程序結(jié)構(gòu)
MODBUS-TCP部分代碼如圖4所示。按照BluFi配網(wǎng)流程,依次執(zhí)行:Wi-Fi初始化、啟動/連接Wi-Fi、事件處理、MODBUSTCP接口初始化、MODBUS-TCP參數(shù)設(shè)置和MODBUS-TCP數(shù)據(jù)存取。ESP32 Modbus網(wǎng)關(guān)程序設(shè)計如圖4所示。
圖4 ESP32 Modbus網(wǎng)關(guān)程序設(shè)計
SIMATIC S7-1200是西門子開發(fā)的新型模塊化微型PLC,集成Profinet接口,支持Profinet IO、S7通信以及TCP、UDP、Modubs TCP、OPC UA通信、安全TCP等,網(wǎng)絡(luò)功能強大。該PLC在TIA Portal中進行硬件組態(tài)、編程、程序傳輸、故障診斷、項目升級、更新程序。TIA Portal V17中的Modbus TCP庫指令版本更新至6.0,包括MB_CLIENT、MB_SERVER兩條指令:MB_CLIENT指令通過PROFINET在客戶端和服務(wù)器之間建立連接,發(fā)送Modbus請求,接收響應(yīng)并控制Modbus TCP客戶端的連接終端;MB_SERVER指令處理Modbus TCP客戶端的連接請求,接收并處理請求,發(fā)送響應(yīng)。
MB_CLIENT指令背景數(shù)據(jù)塊可編輯靜態(tài)變量MB_Unit_ID對應(yīng)于Modbus RTU協(xié)議從站地址域。Modbus TCP服務(wù)器用作Modbus RTU協(xié)議網(wǎng)關(guān)時,可使用MB_UNIT_ID標(biāo)識串行網(wǎng)絡(luò)的從站設(shè)備。 S7-1200訪問ESP32網(wǎng)關(guān)如圖5所示。
圖5 S7-1200訪問ESP32網(wǎng)關(guān)
數(shù)控機床、專用設(shè)備、裝配設(shè)備等零部件大量采用了MODBUS RTU/ASCII協(xié)議。了解MODBUS RTU/ASCII、MODBUS TCP協(xié)議內(nèi)容,分析MODBUS報文幀的數(shù)據(jù)結(jié)構(gòu),研究MODBUS串行數(shù)據(jù)傳輸至以太網(wǎng)服務(wù)器/客戶端,可為老舊設(shè)備進行可靠性升級、性能提升改造提供強有力的技術(shù)支持。在ESP32上修改移植的FreeModbus庫,并以S7-1200通過以太網(wǎng)訪問ESP32的無線節(jié)點,實現(xiàn)ESP32 MODBUS-TCP無線網(wǎng)關(guān)所需功能,具有訪問速度快的特點。