賈濤 陳家林
【摘要】 Modbus協(xié)議作為一個(gè)跨時(shí)代的網(wǎng)絡(luò)協(xié)議,是全球第一個(gè)真正用于工業(yè)現(xiàn)場(chǎng)的總線協(xié)議,在工業(yè)領(lǐng)域具備廣闊的應(yīng)用前景。本文介紹了Modbus協(xié)議的主要特點(diǎn),并詳述在基于STM32單片機(jī)以及嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-II上的工業(yè)儀表內(nèi)進(jìn)行構(gòu)建Modbus協(xié)議的系統(tǒng)設(shè)計(jì)。
【關(guān)鍵詞】 Modbus協(xié)議 嵌入式實(shí)時(shí)操作系統(tǒng) 系統(tǒng)設(shè)計(jì)
一、引言
Modbus協(xié)議是由Modicon公司在1978年發(fā)明的一種工業(yè)通信協(xié)議,正式為工業(yè)網(wǎng)絡(luò)拉開(kāi)了序幕。Modbus 標(biāo)準(zhǔn)定義了 OSI 模型第7層上的應(yīng)用層報(bào)文傳輸協(xié)議,它在連接至不同類型總線或網(wǎng)絡(luò)的設(shè)備之間提供客戶機(jī)/服務(wù)器通信。由于其開(kāi)放性標(biāo)準(zhǔn)、支持多種電氣接口、幀格式通俗易懂的特點(diǎn),特別是工控領(lǐng)域上HMI、PLC、前端儀表等設(shè)備間通信得到了廣泛使用。通常Modbus協(xié)議由串行鏈路通過(guò)一個(gè)主/從總線模型實(shí)現(xiàn)。同一時(shí)刻,只有一個(gè)主站連接于總線,一個(gè)或多個(gè)從站連接在同一個(gè)串行總線上。
二、硬件結(jié)構(gòu)設(shè)計(jì)
在工業(yè)儀表內(nèi)除了實(shí)現(xiàn)主要的監(jiān)測(cè)物理量之外,儀表還需具備數(shù)據(jù)通信互連功能。本文所指的工業(yè)儀表是基于STM32L152RBT6為控制器的硬件環(huán)境實(shí)現(xiàn)的對(duì)外界環(huán)境溫度監(jiān)測(cè)的儀表,并通過(guò)在其內(nèi)部構(gòu)建Modbus協(xié)議實(shí)現(xiàn)數(shù)據(jù)通信。STM32L152RBT6是屬于由ST公司的STM32L152系列微控制器,該系列屬于是超低功耗,高數(shù)據(jù)安全性,高效能的ARM Cortex-M3微控制器芯片。其低功耗運(yùn)行模式電流為10.4μA,能夠滿足實(shí)際的工業(yè)應(yīng)用中低功耗穩(wěn)定的需求。同時(shí)利用STM32內(nèi)提供的串行口外設(shè)和485總線轉(zhuǎn)換模塊實(shí)現(xiàn)通信接口。轉(zhuǎn)換模塊采用的是SP3072EEN接口芯片,采用半雙工通訊方式,與單片機(jī)引腳連接簡(jiǎn)單。硬件結(jié)構(gòu)框圖如圖1所示。
三、軟件功能設(shè)計(jì)
為了在基于嵌入式的工業(yè)儀表內(nèi)構(gòu)建一個(gè)實(shí)時(shí)性強(qiáng)、運(yùn)行穩(wěn)定的Modbus協(xié)議,使用了μC/OS-II作為整個(gè)儀表的軟件平臺(tái),其是由Jean J. Labrosse于1992年編寫(xiě)的一個(gè)嵌入式多任務(wù)操作系統(tǒng),憑借其足夠的穩(wěn)定性和安全性在數(shù)十年之間得到了許多機(jī)構(gòu)的標(biāo)準(zhǔn)認(rèn)證。在μC/OS-II內(nèi)具體應(yīng)用的軟功能都是通過(guò)系統(tǒng)提供的多個(gè)用戶任務(wù)來(lái)實(shí)現(xiàn)。
3.1 Modbus主站設(shè)計(jì)
實(shí)際工業(yè)應(yīng)用中,工業(yè)儀表需要向前端傳感設(shè)備或其他儀表進(jìn)行數(shù)據(jù)交互,以便實(shí)時(shí)讀取到需要的數(shù)據(jù)值,儀表內(nèi)部需要構(gòu)建一個(gè)Modbus主站作為主動(dòng)發(fā)送數(shù)據(jù)請(qǐng)求命令的客戶端。Modbus主站工作原理如圖2所示。
本設(shè)計(jì)利用了μC/OS-Ⅱ所提供的系統(tǒng)服務(wù)將主站模塊分為三個(gè)部分:請(qǐng)求主站服務(wù)的用戶任務(wù)、主站服務(wù)管理任務(wù)、串口底層驅(qū)動(dòng)函數(shù)。
請(qǐng)求主站服務(wù)的用戶任務(wù)是指的是那些用戶任務(wù)中有調(diào)用Modbus主站服務(wù)的需求。各個(gè)用戶任務(wù)通過(guò)實(shí)際應(yīng)用發(fā)送特定的主站請(qǐng)求命令,并通過(guò)操作系統(tǒng)提供的消息隊(duì)列進(jìn)行命令緩沖。
主站系統(tǒng)中的主站管理任務(wù)是負(fù)責(zé)專門管理來(lái)自各個(gè)請(qǐng)求主站服務(wù)的任務(wù)的具體請(qǐng)求。該任務(wù)也屬于一個(gè)用戶任務(wù),只是對(duì)請(qǐng)求命令的緩沖隊(duì)列進(jìn)行集中處理。
串口底層的中斷處理實(shí)現(xiàn)了串行鏈路上具體的數(shù)據(jù)發(fā)送與接收。
主站服務(wù)由請(qǐng)求主站服務(wù)的任務(wù)發(fā)起,各個(gè)請(qǐng)求主站服務(wù)的任務(wù)按優(yōu)先級(jí)順序執(zhí)行并依次調(diào)用主站服務(wù)調(diào)用函數(shù),該函數(shù)完成數(shù)據(jù)幀的建立與命令的填充最后將緩沖區(qū)傳遞給主站管理任務(wù)。主站管理任務(wù)優(yōu)先級(jí)是低于所有請(qǐng)求主站服務(wù)的任務(wù),它將依次處理接收到得數(shù)據(jù)幀內(nèi)容,對(duì)數(shù)據(jù)幀進(jìn)行封裝并交給串口底層驅(qū)動(dòng)實(shí)現(xiàn)最終的發(fā)送和接收工作。當(dāng)接收到從站回復(fù)或者發(fā)生接收超時(shí),主站管理任務(wù)將在緩沖區(qū)中產(chǎn)生一個(gè)標(biāo)志符通知上層請(qǐng)求任務(wù)進(jìn)行處理。為了發(fā)送和接收的實(shí)時(shí)性考慮,這里將數(shù)據(jù)幀的校驗(yàn)和處理工作交給上層請(qǐng)求任務(wù)完成。
3.2 Modbus從站設(shè)計(jì)
為了實(shí)現(xiàn)數(shù)據(jù)互連,后臺(tái)上位機(jī)或者現(xiàn)場(chǎng)PLC需要實(shí)時(shí)獲取前端儀表的數(shù)據(jù)信息。前端儀表內(nèi)部需要構(gòu)建一個(gè)Modbus從站作為服務(wù)器提供前端數(shù)據(jù)。Modbus從站工作原理如圖3所示。
由基于μC/OS-II的平臺(tái),可將從站功能模塊化到一個(gè)μC/OS-II的獨(dú)立任務(wù)內(nèi),通過(guò)內(nèi)核的多任務(wù)管理調(diào)度對(duì)從站進(jìn)行狀態(tài)輪詢并且通過(guò)底層中斷進(jìn)行實(shí)際的數(shù)據(jù)幀接收工作。當(dāng)收到一個(gè)請(qǐng)求時(shí),從站在首先需要校驗(yàn)報(bào)文包。若發(fā)生通信錯(cuò)誤則不作任何響應(yīng),回到空閑狀態(tài)。若無(wú)通信錯(cuò)誤,則按照Modbus協(xié)議規(guī)定解析請(qǐng)求包,進(jìn)行具體的事務(wù)處理。若發(fā)生錯(cuò)誤,則返回一個(gè)異常響應(yīng)給主站。當(dāng)要求的處理完成后,單播報(bào)文需要一個(gè)格式化的響應(yīng)發(fā)往給主站。
四、結(jié)語(yǔ)
本文實(shí)現(xiàn)了在基于嵌入式的工業(yè)儀表上的Modbus主從站搭建和設(shè)計(jì)工作。經(jīng)過(guò)測(cè)試,儀表內(nèi)的Modbus協(xié)議具備協(xié)議標(biāo)準(zhǔn)的要求和功能,滿足實(shí)時(shí)性要求和穩(wěn)定性,能夠同時(shí)作為主站和從站多任務(wù)進(jìn)行工作,達(dá)到了設(shè)計(jì)的目的。