張國宇 鄒衛(wèi)軍
摘 要:本文提出了基于μC/OS-II和ModbusRTU協(xié)議的密集架控制軟件在Stm32F103R8T6平臺上的設(shè)計方法。重點闡述了μCOS-II操作系統(tǒng)的移植、ModbusRTU通信協(xié)議的實現(xiàn)方式和主要的應(yīng)用程序開發(fā)。
關(guān)鍵詞:Stm32;ModbusRTU;μCOS-II移植
密集架是自動化倉儲領(lǐng)域具有代表性的一類系統(tǒng)。它由一個固定列和多個移動列組成,通常架體之間緊密排列,不預(yù)留任何通道;工作時通過PC機或固定列的人機交互界面打開指定的存取通道。這種“常態(tài)閉合,用時打開”的特點,使得密集架系統(tǒng)能夠節(jié)省很大的倉儲空間,同時具備較高的安全性。
密集架系統(tǒng)的核心是控制軟件及通信協(xié)議。由于系統(tǒng)中移動列數(shù)目的不確定,使得固定列和移動列之間的通信復(fù)雜度大幅提升,傳統(tǒng)的基于中斷響應(yīng)、前后臺架構(gòu)的控制軟件設(shè)計方式,已經(jīng)很難滿足系統(tǒng)在可靠性、擴展性、開發(fā)效率以及模塊化結(jié)構(gòu)等方面的要求。引入嵌入式實時多任務(wù)操作系統(tǒng)和高效的通訊協(xié)議,就成為提高密集架系統(tǒng)整體性能的關(guān)鍵因素。
本文提出了基于多任務(wù)實時操作系統(tǒng)μCOS-II和ModbusRTU協(xié)議的密集架控制軟件的設(shè)計方法。軟件采用基于ModBusRTU協(xié)議的“主從式”通信架構(gòu),并利用操作系統(tǒng)特性,將功能模塊劃分為多個任務(wù),由系統(tǒng)調(diào)度執(zhí)行。經(jīng)過實驗測試,這種設(shè)計方法大大提升了密集架系統(tǒng)的穩(wěn)定性及程序的開發(fā)效率。
1 密集架系統(tǒng)工作原理
密集架系統(tǒng)通常由一個固定列和若干個移動列組成,固定列和移動列由嵌入式控制器控制,其結(jié)構(gòu)如圖1所示。
在密集架系統(tǒng)中,固定列作為核心,主要完成以下任務(wù):
⑴與PC上位機通信,處理下發(fā)的控制指令并反饋系統(tǒng)運行狀態(tài)和傳感器信息;
⑵與本列的人機交互單元通信,處理下發(fā)的控制指令并反饋系統(tǒng)運行狀態(tài)和傳感器信息;
⑶與所有的移動列通信,實時查詢各個移動列狀態(tài)并下發(fā)控制指令。
移動列作為實際運行的機構(gòu),需要處理以下任務(wù):
⑴與本列的人機交互單元通信,接收控制指令并反饋運行狀態(tài);
⑵處理固定列下發(fā)的查詢指令和控制指令;執(zhí)行相應(yīng)控制動作,反饋運行狀態(tài)和傳感器信息。
由此可以看出,密集架系統(tǒng)控制軟件的核心,在于確保固定列和移動列通信穩(wěn)定的基礎(chǔ)上,協(xié)調(diào)好來自上位機、人機交互單元和各個嵌入式控制器的控制指令和任務(wù),保證系統(tǒng)能夠及時高效的響應(yīng)控制動作。
基于此,在密集架控制軟件的設(shè)計上,論文采用具有很強的實時性、較為完備的任務(wù)調(diào)度功能及穩(wěn)定的通信管理機制的μCOS-II實時操作系統(tǒng);并基于ModbusRTU協(xié)議構(gòu)建了軟件的通信框架。
2 μCOS-II操作系統(tǒng)移植
本文移植μCOS-II實時操作系統(tǒng)針對的是基于STM32F103R8T6 ARM芯片的硬件平臺,需要完成與CPU相關(guān)和硬件相關(guān)的內(nèi)容的修改。
2.1 移植CPU相關(guān)內(nèi)容
和CPU相關(guān)內(nèi)容的移植,主要是利用CPU的定時器給操作系統(tǒng)提供時鐘。
μCOS-II為了處理任務(wù)延時和調(diào)度等一些時間相關(guān)任務(wù),需要由CPU的硬件定時器產(chǎn)生一個毫秒(ms)級的周期性中斷來提供一個系統(tǒng)時鐘。最小時鐘單位就是兩次中斷之間的時間,稱為時鐘節(jié)拍(Time Tick),考慮到CPU的執(zhí)行效率,本系統(tǒng)選擇10ms的時鐘節(jié)拍。
Stm32F103R8T6中,μCOS-II時鐘由“滴答時鐘”的中斷提供:
void SysTick_Handler(void)
{
OSIntEnter();//進入中斷服務(wù)函數(shù)
OSTimeTick();//調(diào)用時鐘節(jié)拍服務(wù)函數(shù)
OSIntExit();//退出中斷服務(wù)函數(shù)
}
2.2 移植硬件相關(guān)內(nèi)容
(1)OS_CPU.C中的OSTaskInit(),它是任務(wù)的堆棧初始化代碼,在創(chuàng)建任務(wù)時必須成功調(diào)用這個函數(shù),否則會導(dǎo)致系統(tǒng)崩潰。
(2)OS_CPU.H中主要包含三個重要的函數(shù)定義,分別是:
·OS_ENTER_CRITICAL():進入臨界區(qū)函數(shù),負責(zé)關(guān)中斷及保存全局中斷標志位;
·OS_EXIT_CRITICAL():退出臨界區(qū)函數(shù),負責(zé)恢復(fù)全局中斷標志位,和OS_ENTER_CRITICAL()函數(shù)成對使用,兩個函數(shù)之間的代碼稱為“臨界段”。進入臨界保護函數(shù)時中斷關(guān)閉,臨界段在運行期間不受中斷干擾,臨界段代碼執(zhí)行完畢,由OS_EXIT_CRITICAL()函數(shù)解除中斷屏蔽;
·OS_TASK_SW():任務(wù)級任務(wù)切換函數(shù),負責(zé)完成任務(wù)的正常切換,由任務(wù)級調(diào)度器OSSched()調(diào)用。
(3)OS_CPU_A.ASM是μCOS-II唯一的匯編文件,這個文件主要涉及到任務(wù)切換、啟動優(yōu)先級最高的任務(wù)、中斷開關(guān)等函數(shù)。
·μCOS-II啟動多任務(wù)的函數(shù)是OSStart(),用戶在調(diào)用該函數(shù)之前至少需要創(chuàng)建一個任務(wù)。在執(zhí)行OSStart()函數(shù)時,將調(diào)用OSStartHighRdy()運行多任啟動前優(yōu)先級最高的任務(wù),使得系統(tǒng)整個得以運轉(zhuǎn)。
·OSCtxSw()是任務(wù)級的上下文切換函數(shù),它被OS_CPU.H中的OS_TASK_SW()所調(diào)用;OSIntCtxSw()是中斷級的任務(wù)切換,它被OSIntExit()調(diào)用,在μCOS-II運行完中斷服務(wù)程序之后完成中斷級任務(wù)調(diào)度。
·OS_CPU_SR_Save()、OS_CPU_SR_Restore()分別被OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()調(diào)用,主要負責(zé)屏蔽中斷和恢復(fù)中斷。
在移植過程中,根據(jù)用戶的實際需要,可以對配置文件OS_CFG.H進行修改,從而實現(xiàn)μCOS-II內(nèi)核的剪裁。
3 基于μCOS-II和Modbus RTU協(xié)議的控制軟件設(shè)計
根據(jù)密集架控制軟件的設(shè)計架構(gòu),固定列控制軟件所面臨的數(shù)據(jù)通信處理的復(fù)雜程度遠超移動列,且固定列ModbusRTU協(xié)議實現(xiàn)機理和移動列完全相同,主要的應(yīng)用程序也涵蓋了移動列應(yīng)用程序的主要設(shè)計思想。因此,本文僅以固定列為樣例,來介紹基于μCOS-II和Modbus RTU協(xié)議的控制軟件設(shè)計。
3.1 Modbus RTU協(xié)議
在密集架系統(tǒng)中,使用“一主多從”的Modbus RTU通信模式,其中固定列作為主設(shè)備,移動列作為擁有唯一地址的從設(shè)備。固定列和移動列之間可以進行通信,而移動列之間則不能通信。通信的具體流程為:
⑴固定列以中斷方式接收本列人機交互界面和上位機發(fā)送的功能碼為06的控制幀;
⑵固定列以固定時間間隔依次向各移動列發(fā)送功能碼為03的查詢幀;
⑶收到查詢幀的移動列向固定列反饋當前狀態(tài)信息,包括:本列運行狀態(tài)、本列人機交互界面下發(fā)的控制指令、本列傳感器信息;
⑷固定列綜合系統(tǒng)當前狀態(tài)和控制指令要求,確定控制邏輯,并向相應(yīng)移動列發(fā)送功能碼為06的控制幀;
⑸收到控制幀的移動列根據(jù)指令要求完成控制動作。
3.2 基于μCOS-II的多任務(wù)機制設(shè)計
⑴用戶任務(wù):完成來自上位機、人機交互界面和移動列各種通信數(shù)據(jù)的綜合解析工作,是控制指令得以正確實現(xiàn)的關(guān)鍵任務(wù)。
⑵RS232通信任務(wù):負責(zé)和本列人機交互界面的通信工作,任務(wù)初始化后始終保持等待信號量狀態(tài)。主芯片的串口中斷實時接收觸摸屏命令,當接收到完整的數(shù)據(jù)幀后,調(diào)用OSSemPost()函數(shù)發(fā)送信號量,通知RS232通信任務(wù)激活ModbusRTU協(xié)議解析任務(wù),并根據(jù)解析出的控制指令反饋響應(yīng)信息或者保存按鍵命令。
⑶RS485通信任務(wù):和RS232通信任務(wù)類似,它由對應(yīng)的RS485接收函數(shù)調(diào)用OSSemPost()函數(shù)激活,負責(zé)和各個移動列之間的信息交互,是密集架網(wǎng)絡(luò)穩(wěn)定運行的核心任務(wù)。移動列數(shù)目較多,通信非常復(fù)雜,為了保證控制指令的實時性,必須將RS485通信任務(wù)的優(yōu)先級設(shè)為所有任務(wù)的最高級。它的主要工作是:解析并保存“輪詢”到的移動列狀態(tài)信息、傳感器信息、按鍵信息,等待用戶任務(wù)的使用。
⑷網(wǎng)絡(luò)通信任務(wù):由對應(yīng)的網(wǎng)絡(luò)接收函數(shù)調(diào)用OSSemPost()函數(shù)激活,主要負責(zé)和PC上位機之間的信息交互,使得用戶可以借助網(wǎng)絡(luò)實現(xiàn)遠程控制密集架系統(tǒng)。
⑸ModbusRTU協(xié)議解析任務(wù):該任務(wù)由以上三個數(shù)據(jù)通信任務(wù)中的任意一個激活,它的主要工作是:根據(jù)ModbusRTU數(shù)據(jù)幀規(guī)范,解析及保存固定列和上位機、固定列和移動列之間傳輸?shù)臄?shù)據(jù)幀。
ModbusRTU協(xié)議規(guī)定數(shù)據(jù)幀之間的間隔至少是3.5個字符,而Stm32F103R8T6的串口不具備超時中斷。因此,采用基于定時器中斷的串口數(shù)據(jù)接收方法以確定ModbusRTU數(shù)據(jù)幀是否傳輸完成。
ModbusRTU數(shù)據(jù)幀在串口傳輸過程中,字符與字符之間的數(shù)據(jù)間隔很短,如果串口接收數(shù)據(jù)過程,出現(xiàn)較長時間接收不到數(shù)據(jù)的情況,則說明當前ModbusRTU數(shù)據(jù)幀已經(jīng)傳輸完畢,后面再有新的數(shù)據(jù)接收,則作為下一幀ModbusRTU數(shù)據(jù)幀處理。本文正是利用ModbusRTU協(xié)議的這種特性,借助定時器中斷來實現(xiàn)ModbusRTU完整數(shù)據(jù)幀的判斷的,串口中斷接收到第一個字節(jié)的數(shù)據(jù)后,啟動定時器,定時時間設(shè)為3.5個字符的串口傳輸時間(根據(jù)波特率進行計算)。若在定時時間未到時,收到下一字節(jié),則保存到同一數(shù)據(jù)幀;若定時時間已到,仍然沒有收到新的數(shù)據(jù),則觸發(fā)定時器中斷,通知對應(yīng)的通信處理任務(wù)已接收到完整數(shù)據(jù)幀,可以進行相關(guān)數(shù)據(jù)處理。相關(guān)軟件流程見圖2:
μCOS-II是搶占式內(nèi)核,它按照任務(wù)優(yōu)先級的高低對任務(wù)進行調(diào)度,因此任務(wù)優(yōu)先級的合理設(shè)置,對于密集架這種實時性要求較高的控制軟件來說尤為重要。在該軟件系統(tǒng)中,各任務(wù)的優(yōu)先級由高到低依次為:RS485通信任務(wù)、RS232通信任務(wù)、網(wǎng)絡(luò)通信任務(wù)、用戶任務(wù)。
綜合多任務(wù)機制的控制軟件主流程結(jié)構(gòu)圖如圖3所示。
4 結(jié)束語
本文探討了一種密集架控制軟件的設(shè)計方法,軟件基于ModbusRTU協(xié)議建立固定列和移動列的通信,并利用了μCOS-II操作系統(tǒng)的多任務(wù)機制來合理安排密集架軟件各個功能模塊的執(zhí)行和協(xié)調(diào)?;谠摷軜?gòu)的控制軟件,已經(jīng)應(yīng)用于一套固定列+17列移動列的復(fù)雜密集架系統(tǒng)。實踐表明,軟件運行穩(wěn)定可靠,系統(tǒng)對控制指令響應(yīng)及時,有效保證了密集架系統(tǒng)的穩(wěn)定性。
[參考文獻]
[1]任哲.嵌入式實時操作系統(tǒng)μCOS-II原理及應(yīng)用(第一版)[M].北京:北京航空航天大學(xué)出版社,2005年.
[2]意法半導(dǎo)體技術(shù)支持:STM32F103xxx參考手冊.2010.
[3]意法半導(dǎo)體技術(shù)支持:Cotrex-M3權(quán)威指南.2007.
[4]李月恒,梁勝之,韓存武.基于STM32處理器的Modbus TCP/RTU網(wǎng)關(guān)設(shè)計[J].中國科技信息,2013,(9):76-77.