史先傳,殷 帥,許議元
(常州大學 機械與軌道交通學院,常州 213164)
工廠經常需要對繼電器、電磁閥等設備或者電壓、電流和溫度等信號進行遠程控制或監測,目前許多工廠都構建了設備的遠程控制和監測系統。隨著科技的進步,工廠的終端設備分布越來越分散,需要測控的參數越來越多,對通信的實時性要求也越來越高。傳統的現場總線通訊方式在數據傳輸時有許多限制,已經逐漸無法滿足工廠的要求。由于以太網傳輸具有傳輸速度快、傳輸距離長和抗干擾能力強等優點,已經被廣泛使用在對通信實時性和抗干擾能力要求高的工廠環境中。目前的以太網遠程監控系統大多都依賴μC/OS-Ⅱ實時操作系統,而且大多數系統都使用單網口通訊方式[1-2],當工廠需要對不同地點的多路設備進行監測和控制時,需要使用多臺上位機,成本高且布線復雜。針對以上問題,使用STM32F107RCT6 單片機和LAN9303 芯片作為硬件平臺,使用無操作系統的方式移植LwIP協議并結合Modbus TCP 協議,設計了一款網絡控制器。同時,通過LAN9303 芯片拓展2 路網口,需要對不同地點的設備進行監測和控制時,用網線將多個網絡控制器串聯使用,如圖1所示。

圖1 雙網口工作方式Fig.1 Dual network port working mode
網絡控制器由電源電路、網絡通信電路、A/D 采樣電路、網口電路、光耦隔離電路和IO 口電路等電路構成。使用STM32F107RCT6 作為主控芯片,網絡芯片使用LAN9303 芯片。由電源電路將輸入電源轉換為網絡控制器所需的各種直流電源,分別提供給STM32F107RCT6 和LAN9303 及其外圍電路使用。STM32F107RCT6 通過其內部的MAC(媒體訪問控制器)與LAN9303 芯片進行通信。使用LAN9303 芯片拓展2 個網口,形成雙網口工作方式。使用網絡隔離變壓器將網口和LAN9303 芯片隔離,避免外界電磁干擾,提高數據傳輸的穩定性。STM32 單片機通過IO 口對終端設備進行控制和監測,同時使用SPI 通信讀取A/D 采樣的值。采用光耦隔離電路將STM32 單片機與外部電路隔離,提高控制系統運行的穩定性。系統總體結構如圖2所示。

圖2 系統總體結構Fig.2 System overall structure
STM32F107RCT6 和LAN9303 的網絡通信需要連接SMI(站管理接口)和MII(介質無關接口)或RMII (精簡MII 接口)。根據IEEE 802.3 標準,MII接口需要連接16 個引腳,RMII 接口需要連接7 個引腳。RMII 接口方式在滿足網絡通信需求的同時,使用的引腳數目更少,在設計電路時更加簡單方便。因此,采用RMII 接口方式實現STM32F107RCT6 與LAN9303 的網絡通信。
LAN9303 芯片由STM32F107RCT6 的PA8 引腳輸出的25 MHz 時鐘驅動,時鐘信號從LAN9303的XI 端口輸入,XO 端口保持懸空。LAN9303 內部將25 MHz 時鐘倍頻到50 MHz,并由P0_OUTCLK 引腳輸出,驅動STM32F107RCT6 的MAC。MDC 引腳和MDIO 引腳分別是站管理接口的時鐘線和數據線,STM32F107RCT6 通過此接口訪問LAN9303 的內部寄存器發送控制數據或接收狀態信息。LAN9303 的RMII 接口與STM32F107RCT6 內部集成的MAC 的RMII 接口相連,實現網絡通信的數據傳輸。通過配置P0_MODE0、P0_MODE1 和P0_MODE2 選擇LAN-9303 的工作模式。LAN9303 采用RMII PHY 模式,對應P0_MODE2=1,P0_MODE1=0,P0_MODE0=0。TXN1,TXP1,RXN1 和RXP1 為網口1 的數據傳輸引腳。TXN2,TXP2,RXN2 和RXP2 為網口2 的數據傳輸引腳。STM32F107RCT6 與LAN9303 的網絡通信電路如圖3所示。

圖3 網絡通信電路Fig.3 Network communication circuit diagram
A/D 采樣電路使用模數轉換器AD7895 芯片。AD7895 具有12 位ADC、雙極性輸入和高速串行SPI 接口等特點,能采樣±10 V 電壓。采用AD780 提供+2.5 V 基準電壓作為參考。轉換電路與STM32 單片機之間的通信在硬件上添加了數字隔離芯片AD uM1402,避免外界電磁對主控芯片STM32 單片機造成干擾。使用STM32 單片機的GPIO 口模擬SPI通信讀取A/D 采樣的數值。通過撥動撥碼開關S1選擇采集對象是電壓信號還是電流信號。采集電壓信號時,撥動開關至2、3 閉合,1、4 斷開,采集端并聯阻值為100 kΩ 的電阻R24。采集電流信號時,撥動開關至1、4 閉合,2、3 斷開,采集端串聯阻值為500 Ω的電阻R23,采集電阻R23兩端的電壓,將電流信號變換為電壓信號。采樣電路如圖4所示。

圖4 A/D 采樣電路Fig.4 A/D sampling circuit
軟件架構分層模型中的網絡接口層、網絡層、傳輸層由LwIP 協議實現[3]。在應用層上使用Modbus TCP 協議規定數據格式,利用網絡傳輸Modbus TCP 協議報文,實現網絡通信[4-5]。軟件架構分層模型如圖5所示。

圖5 軟件架構分層模型Fig.5 Software architecture hierarchical model
STM32F107RCT6 自帶的MAC 的接口和LAN9303的接口構成了網絡傳輸的網絡接口層,使用LwIP協議棧構成網絡傳輸的網絡層和傳輸層。ST 公司為STM32F107 芯片提供了專門的LwIP 源碼,開發人員根據項目需求編寫和修改相應的函數。網絡接口驅動程序的實現是移植LwIP 協議棧的關鍵[6],在ethernetif.c 文件中已經為此提供了框架,對此文件進行相應修改以實現網絡的初始化、中斷處理以及數據的收、發等操作。ethernetif.c 文件中主要函數有:low_level_init()函數——用來初始化并使能MAC和DMA;low_level_input()函數——用于接收數據,在內存池中分配一個pbuf 數據結構體,將從接口進入的數據包的字節傳輸到pbuf 中,將pbuf 返回;low_level_output()函數——用來發送pbuf 緩沖區中的數據包。
創建虛擬網絡接口是實現雙網口通訊的基礎。網絡控制器有2 個網口,給每個網口都分配一個結構體netif,用來描述網口的IP 地址、MAC 地址和接口狀態等特性,通過netif_add()函數將網口的各個參數添加到netif_list 鏈表中,傳輸數據時根據數據包的信息從netif_list 鏈表中選擇合適的網口進行傳輸。網絡控制器只用于工廠控制和監測設備的局域網中,使用MAC 地址來標識具體用戶,根據數據包中的MAC 地址,選擇合適的網口發送和接收數據。當2 個網口一起使用時,將數據轉發到數據包的目標MAC 地址所連接到的單個網口。
完成以上相關函數的移植后,在程序的主函數中調用LwIP_Init()函數初始化LwIP 協議的各項設置。
根據IANA(互聯網編號分配管理機構)規定,Modbus TCP 服務端的端口號是502。Modbus TCP報文由報文頭和報文體組成。因為LwIP 協議在傳遞數據包時已經對數據進行了校驗,所以在報文中不再進行校驗。Modbus TCP 報文結構如圖6所示。

圖6 Modbus TCP 報文結構Fig.6 Modbus TCP message structure
Modbus TCP 協議使用主從關系實現請求和響應。通信采用一問一答的形式,由客戶端發起請求,然后等待服務端響應。上位機為客戶端,網絡控制器作為服務端等待上位機發送報文并做出相關回應。如圖7所示。

圖7 Modbus TCP 主從關系Fig.7 Modbus TCP master-slave relationship
A/D 采樣電路測量的電壓范圍為0~10 V,電流范圍為4~20 mA。采樣得到的數字量取值范圍為0~2047。
若被測信號為電壓信號,則電壓轉換公式為
式中:Xu為A/D 采樣得到的數字量;U 為轉換后的電壓模擬量,單位為伏特(V)。
若被測信號為電流信號,則電流轉換公式為
式中:Xi為A/D 采樣得到的數字量;I 為轉換后的電流模擬量,單位為毫安(mA)。
為了消除A/D 采樣時遇到的脈沖干擾和隨機誤差,提高測量數據的準確性,連續對A/D 轉換值進行20 次采樣,然后去掉一個最大值和一個最小值,求出剩下的18 個值的平均值作為最終采樣讀數。
編寫程序時直接調用LwIP 協議內部的函數。網絡控制器作為網絡通信的服務端,遠程上位機作為客戶端。
服務端收發數據流程如下:服務端始終監聽502 端口狀態,一旦接收到連接請求,建立連接并接收客戶端發送的數據。然后對數據進行處理,按照Modbus TCP 協議的功能碼進行相應的控制和監測操作,并向客戶端返回相應的應答報文。其中modbus_accept()和modbus_recv()函數分別是連接到客戶端和接收到數據后的程序處理。上述流程如圖8所示。

圖8 服務端收發數據流程Fig.8 Server sending and receiving data flow chart
在完成客戶端的連接后調用modbus_accept()函數為接收客戶端數據做準備,主要工作是分配空閑內存和傳遞參數。modbus_accept()函數主要流程如圖9所示,圖中hs 是數據指針。

圖9 Modbus_accept()函數流程Fig.9 Modbus_accept() function flow chart
當服務端接收到數據后調用modbus_recv()函數對數據進行相應的處理,modbus_recv()函數的主要工作為判斷接收到的數據前7 個字節是不是Modbus TCP 報文頭。若是報文頭,則讀取功能碼,根據功能碼對線圈和寄存器進行相應操作,完成輸入狀態讀取、輸出狀態控制和A/D 采樣數據讀取等功能,并發送應答報文,完成一次數據的接收與發送。modbus_recv()函數主要流程如圖10所示。

圖10 Modbus_recv()函數流程Fig.10 Modbus_recv() function flow chart
上位機為客戶端,網絡控制器為服務端。設置客戶端IP 地址為192.168.0.1,服務端IP 地址為192.168.0.10,服務端端口號為502。進行網絡通信測試。
網絡控制器支持Modbus TCP 協議中常用的8個功能碼(0x01、0x02、0x03、0x04、0x05、0x06、0x0F和0x10),以功能碼05(寫單個線圈)、功能碼02(讀輸入狀態)和功能碼03(讀輸入寄存器)為例進行測試。網絡通信測試中上位機發送與接收的報文內容如圖11所示。

圖11 網絡通信測試Fig.11 Network communication test
05(寫單個線圈):上位機發送報文00 01 00 00 00 06 01 05 00 02 FF 00,上位機接收到的報文是00 01 00 00 00 06 01 05 00 02 FF 00。地址為2 的輸出端口上連接的繼電器線圈通電。
02(讀輸入狀態):將地址為0 的輸入端口上所接的開關閉合,此時從地址0 開始讀5 個輸入點狀態。上位機發送報文00 01 00 00 00 06 01 02 00 00 00 05,上位機接收到的報文是00 01 00 00 00 04 01 02 01 01,接收的報文與開關的狀態一致。
03(讀輸入寄存器):向A/D 輸入引腳施加5 V電壓,網絡控制器通過A/D 轉換電路將5 V 電壓轉換為數字量,這個數字量被存儲在地址為0x20 的寄存器。上位機發送報文00 01 00 00 00 06 01 03 00 20 00 01,上位機接收到的報文是00 01 00 00 00 05 01 03 02 04 00。報文的最后2 個字節為讀取的A/D 值,將16 進制數0x0400 轉化為10 進制數1024,通過轉換公式(1)計算可知測到的電壓為5 V,與施加的電壓一致。
網絡控制器接收上位機發送的報文,控制電磁閥、繼電器等設備的通斷,并且對電流和電壓信號進行監測。當工廠需要對多路設備進行監控時只需將多塊網絡控制器用網線串接,避免復雜的布線。通過實驗測試,網絡控制器成功地寫入了輸出端口的通斷狀態、讀取了輸入端口狀態和A/D 采樣的值,可以通過網絡穩定地對終端設備進行控制和監測。