文中設(shè)計(jì)的現(xiàn)場(chǎng)總線通信網(wǎng)關(guān)提供了對(duì)CANBUS和MODBUS的支持,實(shí)現(xiàn)了CANBUS與MODBUS數(shù)據(jù)的透明傳輸,為2種總線的兼容提供了可行方案。
1 網(wǎng)關(guān)模型分析
本文設(shè)計(jì)的現(xiàn)場(chǎng)總線通信網(wǎng)關(guān)具備MODBUS主站及MODBUS從站的功能,以下以兩種典型的應(yīng)用場(chǎng)景為例分析網(wǎng)關(guān)的工作方式。圖1所示的應(yīng)用場(chǎng)景網(wǎng)關(guān)工作在MODBUS主站模式,圖2所示的應(yīng)用場(chǎng)景網(wǎng)關(guān)工作在MODBUS從站模式。
1.1 網(wǎng)關(guān)的MODBUS主站模式
網(wǎng)關(guān)工作于MODBUS主站模式時(shí),當(dāng)CANBUS上的監(jiān)控主機(jī)發(fā)出一幀數(shù)據(jù)時(shí),網(wǎng)關(guān)作為CANBUS上的設(shè)備接收到該數(shù)據(jù),根據(jù)驗(yàn)收碼和屏蔽碼判斷是否處理該數(shù)據(jù)。若驗(yàn)證成功,則解析收到的CAN數(shù)據(jù)幀,得到CAN數(shù)據(jù)幀中的數(shù)據(jù);將數(shù)據(jù)按照MODBUS協(xié)議逐層打包生成MODBUS幀,網(wǎng)關(guān)作為MODBUS主站向MODBUS上的從站發(fā)送這一幀數(shù)據(jù),完成了一次CANBUS到MODBUS的單向數(shù)據(jù)傳輸。協(xié)議轉(zhuǎn)換示意圖如圖3所示。
1.2 網(wǎng)關(guān)的MODBUS從站模式
網(wǎng)關(guān)工作于MODBUS從站模式時(shí),當(dāng)由MODBUS上的監(jiān)控主機(jī)發(fā)出一幀信息時(shí),網(wǎng)關(guān)收到該MODBUS幀,檢查地址碼與功能碼,若與自身地址相符且功能碼為發(fā)送,按MODBUS協(xié)議逐層解析,得到其數(shù)據(jù);網(wǎng)關(guān)將數(shù)據(jù)按照CANBUS協(xié)議打包形成CAN的數(shù)據(jù)幀,向CANBUS發(fā)送該幀,并向MODBUS主站發(fā)送回應(yīng)幀,完成了一次MODBUS到CANBUS的單向數(shù)據(jù)傳輸。
2 硬件設(shè)計(jì)
本文設(shè)計(jì)的嵌入式現(xiàn)場(chǎng)總線通信網(wǎng)關(guān)包括主控制器(STM32F207),CANBUS接口單元,MODBUS接口單元用于接入MODBUS,以及3.2英寸LCD觸摸屏模塊。硬件系統(tǒng)框圖如圖4所示。
2.1 STM32F207微控制器
本文選用STM32F207構(gòu)建整個(gè)系統(tǒng),STM32F207是一款基于ARM Correx-M3內(nèi)核的32位微處理器,工作頻率120 MHz.STM32F207提供了豐富的接口,支持2路CAN 2.0協(xié)議的CANBUS接口,3路USART接口,2路UART接口,6路定時(shí)器,F(xiàn)SMC+SPI接口(16BITFSMc+SPI)用于接入LCD觸摸屏模塊,支持2種調(diào)試接口:串行接口和JTAG調(diào)試接口。
2.2 CANBUS接口單元
由于STM32F207內(nèi)置有bxCAN控制器,該控制器是一種在標(biāo)準(zhǔn)CAN總線基礎(chǔ)上擴(kuò)展的總線接口,支持CAN總線協(xié)議2.0 A和2.0 B.能以最小的CPU負(fù)荷來高效處理收到的大量報(bào)文。它也支持報(bào)文發(fā)送的優(yōu)先級(jí)要求(優(yōu)先級(jí)特性可軟件配置)。為了滿足CAN總線協(xié)議中的標(biāo)識(shí)符硬件過濾需求,bxCAN控制器提供了位寬可變的、可配置的過濾器組,用來完成只接收軟件需要的報(bào)文功能。CAN接口電路選擇SN65HVD230CANBUS收發(fā)器。SN65HVD230是一種專用于帶CAN控制器設(shè)備的CANBUS收發(fā)器,可應(yīng)用于ISO 11898標(biāo)準(zhǔn)的CANBUS串行通信的物理層中。SN65HVD230CAN BUS收發(fā)器可以向總線和CAN控制器提供不同的數(shù)據(jù)傳輸速度,最高速度為1 Mb/S.
2.3 MODBUS接口單元
MODBUS接口單元使用RS 485串行接口,接口芯片為MAX485.MAX485是用于RS 485與RS 422通信的低功耗收發(fā)器,每個(gè)器件中都具有一個(gè)驅(qū)動(dòng)器和一個(gè)接收器。驅(qū)動(dòng)器具有短路電流限制,并可以通過熱關(guān)斷電路將驅(qū)動(dòng)器輸出置為高阻狀態(tài),防止過度的功率損耗。接收器輸入具有失效保護(hù)特性,當(dāng)輸入開路時(shí),可以確保邏輯高電平輸出。MAX485的驅(qū)動(dòng)器擺率不受限制,可以實(shí)現(xiàn)最高2.5 Mb/s的傳輸速率。
3 軟件設(shè)計(jì)
3.1 CANBUS的應(yīng)用層定義
本文設(shè)計(jì)的現(xiàn)場(chǎng)總線通信網(wǎng)關(guān)定義了CANBUS的應(yīng)用層協(xié)議。
(1)規(guī)定網(wǎng)關(guān)收到的CAN數(shù)據(jù)幀中的第1個(gè)字節(jié)為CANBUS的功能碼,該功能碼為0x0F時(shí),與MODBUS進(jìn)行通信。
(2)規(guī)定CAN數(shù)據(jù)幀中的第2個(gè)字節(jié)的高4位為該幀的標(biāo)號(hào)位,低4位為該幀中包含的數(shù)據(jù)字節(jié)數(shù),該字節(jié)數(shù)為MODBUS協(xié)議中數(shù)據(jù)域的字節(jié)數(shù)。
(3)規(guī)定CAN數(shù)據(jù)幀中的第3,第4個(gè)字節(jié)分別為MODBUS的地址碼和功能碼。
(4)規(guī)定從CAN數(shù)據(jù)幀的第5個(gè)字節(jié)開始為MODBUS的數(shù)據(jù)域,由于MODBUS的數(shù)據(jù)域一般為4個(gè)字節(jié),此時(shí)CAN數(shù)據(jù)幀的數(shù)據(jù)段恰好為8個(gè)字節(jié)。
(5)當(dāng)MODBUS數(shù)據(jù)長度大于4字節(jié)時(shí),需要從2個(gè)或者多個(gè)連續(xù)發(fā)送的標(biāo)號(hào)相同的CAN數(shù)據(jù)幀中獲得完整的MODBUS數(shù)據(jù)。當(dāng)獲得的數(shù)據(jù)位數(shù)與幀中給出的位數(shù)不同時(shí)丟棄該幀。
定義一個(gè)數(shù)據(jù)緩沖區(qū)A,一個(gè)數(shù)據(jù)緩沖區(qū)B,分別用于臨時(shí)存放CANBUS到MODBUS的數(shù)據(jù)和MODBUS到CANBUS的數(shù)據(jù)。
3.2 CANBUS的收發(fā)程序設(shè)計(jì)
該部分包括CAN初始化,CAN發(fā)送程序,CAN接收程序。CAN的初始化包括以下內(nèi)容:配置嵌套向量中斷控制器(NVIC),設(shè)置CAN的Rx0和TX中斷的響應(yīng)優(yōu)先級(jí)和搶占優(yōu)先級(jí),RX0和TX中斷使能。根據(jù)硬件連接配置GPIO,本文中RX使用GPIOD0,TX使用GPIOD2.設(shè)置波特率及過濾器配置。
CANBUS數(shù)據(jù)的接收是通過接收郵箱(FIFO)中斷進(jìn)行處理的,當(dāng)FIFO接收到一個(gè)新的報(bào)文時(shí),過濾器根據(jù)預(yù)設(shè)的值判斷報(bào)文的標(biāo)示符是否匹配,若不匹配,直接丟棄該報(bào)文;若該報(bào)文的標(biāo)示符與預(yù)設(shè)值匹配則中斷處理程序?qū)⒔邮锗]箱中的數(shù)據(jù)拷貝到數(shù)據(jù)緩沖區(qū)A,該數(shù)據(jù)將作為MODBUS主站發(fā)往MODBUS從站的數(shù)據(jù)。CANBUS數(shù)據(jù)接收程序流程如圖5所示。
CANBUS的數(shù)據(jù)發(fā)送同樣使用郵箱機(jī)制,網(wǎng)關(guān)從數(shù)據(jù)緩沖區(qū)B中獲得從MODBUS接收的數(shù)據(jù),設(shè)置標(biāo)示符和數(shù)據(jù)長度,選擇一個(gè)發(fā)送郵箱,使能發(fā)送郵箱空中斷。因此當(dāng)該郵箱為空時(shí)產(chǎn)生一個(gè)中斷,中斷處理程序?qū)?shù)據(jù)從緩沖區(qū)拷貝到發(fā)送郵箱,該郵箱狀態(tài)變?yōu)轭A(yù)定發(fā)送狀態(tài)。
當(dāng)CAN總線進(jìn)入空閑狀態(tài),預(yù)定發(fā)送郵箱中的報(bào)文就馬上被發(fā)送,進(jìn)入發(fā)送狀態(tài)。郵箱中的報(bào)文被成功發(fā)送后,它馬上變?yōu)榭锗]箱。CAN BUS數(shù)據(jù)發(fā)送程序如圖6所示。
3.3 MODBUS主站、從站的收發(fā)程序設(shè)計(jì)
網(wǎng)關(guān)作為MODBUS從站時(shí)的主要工作是初始化串口,初始化定時(shí)器,配置嵌套向量中斷控制器(NVIC),分別對(duì)串口接收數(shù)據(jù)中斷和定時(shí)器中斷設(shè)置響應(yīng)優(yōu)先級(jí)和搶占優(yōu)先級(jí)。從數(shù)據(jù)緩沖區(qū)A中獲得數(shù)據(jù),對(duì)獲得的數(shù)據(jù)生成CRC校驗(yàn)碼,組成MODBUS幀從串口按照時(shí)序發(fā)送這一幀數(shù)據(jù)。
串口初始化如下:
MODBUS協(xié)議規(guī)定了2種傳輸模式:ASCII模式和RTU模式。本文設(shè)計(jì)的網(wǎng)關(guān)使用RTU模式傳輸,在此模式下報(bào)文中每個(gè)8位字節(jié)含有2個(gè)4位16進(jìn)制字符它的優(yōu)點(diǎn)是較高的數(shù)據(jù)密度,在相同的波特率下比ASCII模式有更高的吞吐率。命令幀由地址碼、功能碼、數(shù)據(jù)語和CRC校驗(yàn)碼構(gòu)成。在RTU模式下,幀與幀之間必須由時(shí)長至少為3.5個(gè)字符時(shí)間的空閑間隔區(qū)分。整個(gè)幀必須以連續(xù)的字符流發(fā)送,如果兩個(gè)字符之間的空閑間隔大于1.5個(gè)字符時(shí)間,則該幀被認(rèn)為不完整的幀而被丟棄,接收設(shè)備假定下一字節(jié)是一個(gè)新消息的地址域。
MODBUS主站程序需要使用3個(gè)定時(shí)器,其中TIM2用于控制發(fā)送的3.5個(gè)字符的幀間隔。TIM3用于控制接收MODBUS從站的回應(yīng)幀的3.5個(gè)字符的幀間隔。TIM4用于接收時(shí)確保字符間的間隔小于1.5個(gè)字符時(shí)間。初始化TIM2與TIM3,定時(shí)時(shí)間為定時(shí)3.645 8 ms(波特率為9 600 b/s時(shí)的3.5字符時(shí)間):
網(wǎng)關(guān)作MODBUS主站的工作流程如圖7所示。
網(wǎng)關(guān)工作在MODBUS主站模式時(shí)對(duì)從站響應(yīng)幀的接收使用中斷處理的方式。在第一個(gè)字節(jié)傳輸結(jié)束后啟動(dòng)TIM4定時(shí)器,定時(shí)時(shí)間為1.5個(gè)字符時(shí)間,在后續(xù)的字節(jié)傳輸結(jié)束時(shí)清零計(jì)數(shù)器,保證一個(gè)幀中的字符間隔不超過1.5個(gè)字符時(shí)間。接收完成后啟動(dòng)定時(shí)器TIM3,定時(shí)3.5個(gè)字符時(shí)間,在此時(shí)間內(nèi)的接收的任何數(shù)據(jù)都將丟棄。
網(wǎng)關(guān)作為MODBUS從站時(shí)對(duì)化串口和定時(shí)器的初始化與MODBUS主站相同,將數(shù)據(jù)組成CAN的幀,發(fā)送該幀,并向MODBUS主站發(fā)送響應(yīng)幀。網(wǎng)關(guān)作為MODBUS從站的工作流程如圖8所示。
3.4 主程序
主程序中初始化FSMC,初始化LCD,初始化觸摸屏,校正觸摸屏,顯示工作模式選擇界面、參數(shù)配置界面及當(dāng)前工作模式界面。根據(jù)選擇進(jìn)入相應(yīng)工作模式。
4 測(cè)試結(jié)果
在PC機(jī)上使用串口助手和USB-CAN軟件模擬CANBUS與MODBUS的收發(fā)。MODBUS到CANBUS的通信模擬:由PC機(jī)向網(wǎng)關(guān)發(fā)送一幀數(shù)據(jù)00 01 02 03 0405 06 07,網(wǎng)關(guān)設(shè)置幀ID為0x321并發(fā)出數(shù)據(jù),通過CANUSB軟件接收該數(shù)據(jù)為00 01 02 03 04 05 06 07.如圖9所示。CANBUS到MODBUS的通信模擬:使用CAN-USB軟件發(fā)送一幀0f 14 0f 05 00 01 02 03,網(wǎng)關(guān)解析其中數(shù)據(jù)00 01 02 03,并作為MODBUS主站發(fā)送數(shù)據(jù),將數(shù)據(jù)輸出到串口助手為00 01 02 03.如圖10所示。
5 結(jié)語
本文設(shè)計(jì)實(shí)現(xiàn)了一種在CANBUS和MODBUS間進(jìn)行透明的數(shù)據(jù)傳輸?shù)那度胧浆F(xiàn)場(chǎng)總線通信網(wǎng)關(guān),軟硬件設(shè)計(jì)簡(jiǎn)單,通信參數(shù)可現(xiàn)場(chǎng)配置,能夠很好地實(shí)現(xiàn)CANBUS與MODBUS間的通信。該網(wǎng)關(guān)解決了異類現(xiàn)場(chǎng)總線間通信的問題,使系統(tǒng)的兼容性、互聯(lián)性、可擴(kuò)充性都得到了極大的提高,具有良好的應(yīng)用前景。
評(píng)論
查看更多