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