史先傳,殷 帥,許議元
(常州大學(xué) 機(jī)械與軌道交通學(xué)院,常州 213164)
工廠經(jīng)常需要對(duì)繼電器、電磁閥等設(shè)備或者電壓、電流和溫度等信號(hào)進(jìn)行遠(yuǎn)程控制或監(jiān)測(cè),目前許多工廠都構(gòu)建了設(shè)備的遠(yuǎn)程控制和監(jiān)測(cè)系統(tǒng)。隨著科技的進(jìn)步,工廠的終端設(shè)備分布越來(lái)越分散,需要測(cè)控的參數(shù)越來(lái)越多,對(duì)通信的實(shí)時(shí)性要求也越來(lái)越高。傳統(tǒng)的現(xiàn)場(chǎng)總線通訊方式在數(shù)據(jù)傳輸時(shí)有許多限制,已經(jīng)逐漸無(wú)法滿足工廠的要求。由于以太網(wǎng)傳輸具有傳輸速度快、傳輸距離長(zhǎng)和抗干擾能力強(qiáng)等優(yōu)點(diǎn),已經(jīng)被廣泛使用在對(duì)通信實(shí)時(shí)性和抗干擾能力要求高的工廠環(huán)境中。目前的以太網(wǎng)遠(yuǎn)程監(jiān)控系統(tǒng)大多都依賴μC/OS-Ⅱ?qū)崟r(shí)操作系統(tǒng),而且大多數(shù)系統(tǒng)都使用單網(wǎng)口通訊方式[1-2],當(dāng)工廠需要對(duì)不同地點(diǎn)的多路設(shè)備進(jìn)行監(jiān)測(cè)和控制時(shí),需要使用多臺(tái)上位機(jī),成本高且布線復(fù)雜。針對(duì)以上問(wèn)題,使用STM32F107RCT6 單片機(jī)和LAN9303 芯片作為硬件平臺(tái),使用無(wú)操作系統(tǒng)的方式移植LwIP協(xié)議并結(jié)合Modbus TCP 協(xié)議,設(shè)計(jì)了一款網(wǎng)絡(luò)控制器。同時(shí),通過(guò)LAN9303 芯片拓展2 路網(wǎng)口,需要對(duì)不同地點(diǎn)的設(shè)備進(jìn)行監(jiān)測(cè)和控制時(shí),用網(wǎng)線將多個(gè)網(wǎng)絡(luò)控制器串聯(lián)使用,如圖1所示。
圖1 雙網(wǎng)口工作方式Fig.1 Dual network port working mode
網(wǎng)絡(luò)控制器由電源電路、網(wǎng)絡(luò)通信電路、A/D 采樣電路、網(wǎng)口電路、光耦隔離電路和IO 口電路等電路構(gòu)成。使用STM32F107RCT6 作為主控芯片,網(wǎng)絡(luò)芯片使用LAN9303 芯片。由電源電路將輸入電源轉(zhuǎn)換為網(wǎng)絡(luò)控制器所需的各種直流電源,分別提供給STM32F107RCT6 和LAN9303 及其外圍電路使用。STM32F107RCT6 通過(guò)其內(nèi)部的MAC(媒體訪問(wèn)控制器)與LAN9303 芯片進(jìn)行通信。使用LAN9303 芯片拓展2 個(gè)網(wǎng)口,形成雙網(wǎng)口工作方式。使用網(wǎng)絡(luò)隔離變壓器將網(wǎng)口和LAN9303 芯片隔離,避免外界電磁干擾,提高數(shù)據(jù)傳輸?shù)姆€(wěn)定性。STM32 單片機(jī)通過(guò)IO 口對(duì)終端設(shè)備進(jìn)行控制和監(jiān)測(cè),同時(shí)使用SPI 通信讀取A/D 采樣的值。采用光耦隔離電路將STM32 單片機(jī)與外部電路隔離,提高控制系統(tǒng)運(yùn)行的穩(wěn)定性。系統(tǒng)總體結(jié)構(gòu)如圖2所示。
圖2 系統(tǒng)總體結(jié)構(gòu)Fig.2 System overall structure
STM32F107RCT6 和LAN9303 的網(wǎng)絡(luò)通信需要連接SMI(站管理接口)和MII(介質(zhì)無(wú)關(guān)接口)或RMII (精簡(jiǎn)MII 接口)。根據(jù)IEEE 802.3 標(biāo)準(zhǔn),MII接口需要連接16 個(gè)引腳,RMII 接口需要連接7 個(gè)引腳。RMII 接口方式在滿足網(wǎng)絡(luò)通信需求的同時(shí),使用的引腳數(shù)目更少,在設(shè)計(jì)電路時(shí)更加簡(jiǎn)單方便。因此,采用RMII 接口方式實(shí)現(xiàn)STM32F107RCT6 與LAN9303 的網(wǎng)絡(luò)通信。
LAN9303 芯片由STM32F107RCT6 的PA8 引腳輸出的25 MHz 時(shí)鐘驅(qū)動(dòng),時(shí)鐘信號(hào)從LAN9303的XI 端口輸入,XO 端口保持懸空。LAN9303 內(nèi)部將25 MHz 時(shí)鐘倍頻到50 MHz,并由P0_OUTCLK 引腳輸出,驅(qū)動(dòng)STM32F107RCT6 的MAC。MDC 引腳和MDIO 引腳分別是站管理接口的時(shí)鐘線和數(shù)據(jù)線,STM32F107RCT6 通過(guò)此接口訪問(wèn)LAN9303 的內(nèi)部寄存器發(fā)送控制數(shù)據(jù)或接收狀態(tài)信息。LAN9303 的RMII 接口與STM32F107RCT6 內(nèi)部集成的MAC 的RMII 接口相連,實(shí)現(xiàn)網(wǎng)絡(luò)通信的數(shù)據(jù)傳輸。通過(guò)配置P0_MODE0、P0_MODE1 和P0_MODE2 選擇LAN-9303 的工作模式。LAN9303 采用RMII PHY 模式,對(duì)應(yīng)P0_MODE2=1,P0_MODE1=0,P0_MODE0=0。TXN1,TXP1,RXN1 和RXP1 為網(wǎng)口1 的數(shù)據(jù)傳輸引腳。TXN2,TXP2,RXN2 和RXP2 為網(wǎng)口2 的數(shù)據(jù)傳輸引腳。STM32F107RCT6 與LAN9303 的網(wǎng)絡(luò)通信電路如圖3所示。
圖3 網(wǎng)絡(luò)通信電路Fig.3 Network communication circuit diagram
A/D 采樣電路使用模數(shù)轉(zhuǎn)換器AD7895 芯片。AD7895 具有12 位ADC、雙極性輸入和高速串行SPI 接口等特點(diǎn),能采樣±10 V 電壓。采用AD780 提供+2.5 V 基準(zhǔn)電壓作為參考。轉(zhuǎn)換電路與STM32 單片機(jī)之間的通信在硬件上添加了數(shù)字隔離芯片AD uM1402,避免外界電磁對(duì)主控芯片STM32 單片機(jī)造成干擾。使用STM32 單片機(jī)的GPIO 口模擬SPI通信讀取A/D 采樣的數(shù)值。通過(guò)撥動(dòng)撥碼開(kāi)關(guān)S1選擇采集對(duì)象是電壓信號(hào)還是電流信號(hào)。采集電壓信號(hào)時(shí),撥動(dòng)開(kāi)關(guān)至2、3 閉合,1、4 斷開(kāi),采集端并聯(lián)阻值為100 kΩ 的電阻R24。采集電流信號(hào)時(shí),撥動(dòng)開(kāi)關(guān)至1、4 閉合,2、3 斷開(kāi),采集端串聯(lián)阻值為500 Ω的電阻R23,采集電阻R23兩端的電壓,將電流信號(hào)變換為電壓信號(hào)。采樣電路如圖4所示。
圖4 A/D 采樣電路Fig.4 A/D sampling circuit
軟件架構(gòu)分層模型中的網(wǎng)絡(luò)接口層、網(wǎng)絡(luò)層、傳輸層由LwIP 協(xié)議實(shí)現(xiàn)[3]。在應(yīng)用層上使用Modbus TCP 協(xié)議規(guī)定數(shù)據(jù)格式,利用網(wǎng)絡(luò)傳輸Modbus TCP 協(xié)議報(bào)文,實(shí)現(xiàn)網(wǎng)絡(luò)通信[4-5]。軟件架構(gòu)分層模型如圖5所示。
圖5 軟件架構(gòu)分層模型Fig.5 Software architecture hierarchical model
STM32F107RCT6 自帶的MAC 的接口和LAN9303的接口構(gòu)成了網(wǎng)絡(luò)傳輸?shù)木W(wǎng)絡(luò)接口層,使用LwIP協(xié)議棧構(gòu)成網(wǎng)絡(luò)傳輸?shù)木W(wǎng)絡(luò)層和傳輸層。ST 公司為STM32F107 芯片提供了專門的LwIP 源碼,開(kāi)發(fā)人員根據(jù)項(xiàng)目需求編寫(xiě)和修改相應(yīng)的函數(shù)。網(wǎng)絡(luò)接口驅(qū)動(dòng)程序的實(shí)現(xiàn)是移植LwIP 協(xié)議棧的關(guān)鍵[6],在ethernetif.c 文件中已經(jīng)為此提供了框架,對(duì)此文件進(jìn)行相應(yīng)修改以實(shí)現(xiàn)網(wǎng)絡(luò)的初始化、中斷處理以及數(shù)據(jù)的收、發(fā)等操作。ethernetif.c 文件中主要函數(shù)有:low_level_init()函數(shù)——用來(lái)初始化并使能MAC和DMA;low_level_input()函數(shù)——用于接收數(shù)據(jù),在內(nèi)存池中分配一個(gè)pbuf 數(shù)據(jù)結(jié)構(gòu)體,將從接口進(jìn)入的數(shù)據(jù)包的字節(jié)傳輸?shù)絧buf 中,將pbuf 返回;low_level_output()函數(shù)——用來(lái)發(fā)送pbuf 緩沖區(qū)中的數(shù)據(jù)包。
創(chuàng)建虛擬網(wǎng)絡(luò)接口是實(shí)現(xiàn)雙網(wǎng)口通訊的基礎(chǔ)。網(wǎng)絡(luò)控制器有2 個(gè)網(wǎng)口,給每個(gè)網(wǎng)口都分配一個(gè)結(jié)構(gòu)體netif,用來(lái)描述網(wǎng)口的IP 地址、MAC 地址和接口狀態(tài)等特性,通過(guò)netif_add()函數(shù)將網(wǎng)口的各個(gè)參數(shù)添加到netif_list 鏈表中,傳輸數(shù)據(jù)時(shí)根據(jù)數(shù)據(jù)包的信息從netif_list 鏈表中選擇合適的網(wǎng)口進(jìn)行傳輸。網(wǎng)絡(luò)控制器只用于工廠控制和監(jiān)測(cè)設(shè)備的局域網(wǎng)中,使用MAC 地址來(lái)標(biāo)識(shí)具體用戶,根據(jù)數(shù)據(jù)包中的MAC 地址,選擇合適的網(wǎng)口發(fā)送和接收數(shù)據(jù)。當(dāng)2 個(gè)網(wǎng)口一起使用時(shí),將數(shù)據(jù)轉(zhuǎn)發(fā)到數(shù)據(jù)包的目標(biāo)MAC 地址所連接到的單個(gè)網(wǎng)口。
完成以上相關(guān)函數(shù)的移植后,在程序的主函數(shù)中調(diào)用LwIP_Init()函數(shù)初始化LwIP 協(xié)議的各項(xiàng)設(shè)置。
根據(jù)IANA(互聯(lián)網(wǎng)編號(hào)分配管理機(jī)構(gòu))規(guī)定,Modbus TCP 服務(wù)端的端口號(hào)是502。Modbus TCP報(bào)文由報(bào)文頭和報(bào)文體組成。因?yàn)長(zhǎng)wIP 協(xié)議在傳遞數(shù)據(jù)包時(shí)已經(jīng)對(duì)數(shù)據(jù)進(jìn)行了校驗(yàn),所以在報(bào)文中不再進(jìn)行校驗(yàn)。Modbus TCP 報(bào)文結(jié)構(gòu)如圖6所示。
圖6 Modbus TCP 報(bào)文結(jié)構(gòu)Fig.6 Modbus TCP message structure
Modbus TCP 協(xié)議使用主從關(guān)系實(shí)現(xiàn)請(qǐng)求和響應(yīng)。通信采用一問(wèn)一答的形式,由客戶端發(fā)起請(qǐng)求,然后等待服務(wù)端響應(yīng)。上位機(jī)為客戶端,網(wǎng)絡(luò)控制器作為服務(wù)端等待上位機(jī)發(fā)送報(bào)文并做出相關(guān)回應(yīng)。如圖7所示。
圖7 Modbus TCP 主從關(guān)系Fig.7 Modbus TCP master-slave relationship
A/D 采樣電路測(cè)量的電壓范圍為0~10 V,電流范圍為4~20 mA。采樣得到的數(shù)字量取值范圍為0~2047。
若被測(cè)信號(hào)為電壓信號(hào),則電壓轉(zhuǎn)換公式為
式中:Xu為A/D 采樣得到的數(shù)字量;U 為轉(zhuǎn)換后的電壓模擬量,單位為伏特(V)。
若被測(cè)信號(hào)為電流信號(hào),則電流轉(zhuǎn)換公式為
式中:Xi為A/D 采樣得到的數(shù)字量;I 為轉(zhuǎn)換后的電流模擬量,單位為毫安(mA)。
為了消除A/D 采樣時(shí)遇到的脈沖干擾和隨機(jī)誤差,提高測(cè)量數(shù)據(jù)的準(zhǔn)確性,連續(xù)對(duì)A/D 轉(zhuǎn)換值進(jìn)行20 次采樣,然后去掉一個(gè)最大值和一個(gè)最小值,求出剩下的18 個(gè)值的平均值作為最終采樣讀數(shù)。
編寫(xiě)程序時(shí)直接調(diào)用LwIP 協(xié)議內(nèi)部的函數(shù)。網(wǎng)絡(luò)控制器作為網(wǎng)絡(luò)通信的服務(wù)端,遠(yuǎn)程上位機(jī)作為客戶端。
服務(wù)端收發(fā)數(shù)據(jù)流程如下:服務(wù)端始終監(jiān)聽(tīng)502 端口狀態(tài),一旦接收到連接請(qǐng)求,建立連接并接收客戶端發(fā)送的數(shù)據(jù)。然后對(duì)數(shù)據(jù)進(jìn)行處理,按照Modbus TCP 協(xié)議的功能碼進(jìn)行相應(yīng)的控制和監(jiān)測(cè)操作,并向客戶端返回相應(yīng)的應(yīng)答報(bào)文。其中modbus_accept()和modbus_recv()函數(shù)分別是連接到客戶端和接收到數(shù)據(jù)后的程序處理。上述流程如圖8所示。
圖8 服務(wù)端收發(fā)數(shù)據(jù)流程Fig.8 Server sending and receiving data flow chart
在完成客戶端的連接后調(diào)用modbus_accept()函數(shù)為接收客戶端數(shù)據(jù)做準(zhǔn)備,主要工作是分配空閑內(nèi)存和傳遞參數(shù)。modbus_accept()函數(shù)主要流程如圖9所示,圖中hs 是數(shù)據(jù)指針。
圖9 Modbus_accept()函數(shù)流程Fig.9 Modbus_accept() function flow chart
當(dāng)服務(wù)端接收到數(shù)據(jù)后調(diào)用modbus_recv()函數(shù)對(duì)數(shù)據(jù)進(jìn)行相應(yīng)的處理,modbus_recv()函數(shù)的主要工作為判斷接收到的數(shù)據(jù)前7 個(gè)字節(jié)是不是Modbus TCP 報(bào)文頭。若是報(bào)文頭,則讀取功能碼,根據(jù)功能碼對(duì)線圈和寄存器進(jìn)行相應(yīng)操作,完成輸入狀態(tài)讀取、輸出狀態(tài)控制和A/D 采樣數(shù)據(jù)讀取等功能,并發(fā)送應(yīng)答報(bào)文,完成一次數(shù)據(jù)的接收與發(fā)送。modbus_recv()函數(shù)主要流程如圖10所示。
圖10 Modbus_recv()函數(shù)流程Fig.10 Modbus_recv() function flow chart
上位機(jī)為客戶端,網(wǎng)絡(luò)控制器為服務(wù)端。設(shè)置客戶端IP 地址為192.168.0.1,服務(wù)端IP 地址為192.168.0.10,服務(wù)端端口號(hào)為502。進(jìn)行網(wǎng)絡(luò)通信測(cè)試。
網(wǎng)絡(luò)控制器支持Modbus TCP 協(xié)議中常用的8個(gè)功能碼(0x01、0x02、0x03、0x04、0x05、0x06、0x0F和0x10),以功能碼05(寫(xiě)單個(gè)線圈)、功能碼02(讀輸入狀態(tài))和功能碼03(讀輸入寄存器)為例進(jìn)行測(cè)試。網(wǎng)絡(luò)通信測(cè)試中上位機(jī)發(fā)送與接收的報(bào)文內(nèi)容如圖11所示。
圖11 網(wǎng)絡(luò)通信測(cè)試Fig.11 Network communication test
05(寫(xiě)單個(gè)線圈):上位機(jī)發(fā)送報(bào)文00 01 00 00 00 06 01 05 00 02 FF 00,上位機(jī)接收到的報(bào)文是00 01 00 00 00 06 01 05 00 02 FF 00。地址為2 的輸出端口上連接的繼電器線圈通電。
02(讀輸入狀態(tài)):將地址為0 的輸入端口上所接的開(kāi)關(guān)閉合,此時(shí)從地址0 開(kāi)始讀5 個(gè)輸入點(diǎn)狀態(tài)。上位機(jī)發(fā)送報(bào)文00 01 00 00 00 06 01 02 00 00 00 05,上位機(jī)接收到的報(bào)文是00 01 00 00 00 04 01 02 01 01,接收的報(bào)文與開(kāi)關(guān)的狀態(tài)一致。
03(讀輸入寄存器):向A/D 輸入引腳施加5 V電壓,網(wǎng)絡(luò)控制器通過(guò)A/D 轉(zhuǎn)換電路將5 V 電壓轉(zhuǎn)換為數(shù)字量,這個(gè)數(shù)字量被存儲(chǔ)在地址為0x20 的寄存器。上位機(jī)發(fā)送報(bào)文00 01 00 00 00 06 01 03 00 20 00 01,上位機(jī)接收到的報(bào)文是00 01 00 00 00 05 01 03 02 04 00。報(bào)文的最后2 個(gè)字節(jié)為讀取的A/D 值,將16 進(jìn)制數(shù)0x0400 轉(zhuǎn)化為10 進(jìn)制數(shù)1024,通過(guò)轉(zhuǎn)換公式(1)計(jì)算可知測(cè)到的電壓為5 V,與施加的電壓一致。
網(wǎng)絡(luò)控制器接收上位機(jī)發(fā)送的報(bào)文,控制電磁閥、繼電器等設(shè)備的通斷,并且對(duì)電流和電壓信號(hào)進(jìn)行監(jiān)測(cè)。當(dāng)工廠需要對(duì)多路設(shè)備進(jìn)行監(jiān)控時(shí)只需將多塊網(wǎng)絡(luò)控制器用網(wǎng)線串接,避免復(fù)雜的布線。通過(guò)實(shí)驗(yàn)測(cè)試,網(wǎng)絡(luò)控制器成功地寫(xiě)入了輸出端口的通斷狀態(tài)、讀取了輸入端口狀態(tài)和A/D 采樣的值,可以通過(guò)網(wǎng)絡(luò)穩(wěn)定地對(duì)終端設(shè)備進(jìn)行控制和監(jiān)測(cè)。