基于嵌入式STM32的Modbus RTU協(xié)議實現(xiàn)_第1頁
基于嵌入式STM32的Modbus RTU協(xié)議實現(xiàn)_第2頁
基于嵌入式STM32的Modbus RTU協(xié)議實現(xiàn)_第3頁
基于嵌入式STM32的Modbus RTU協(xié)議實現(xiàn)_第4頁
基于嵌入式STM32的Modbus RTU協(xié)議實現(xiàn)_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第第頁基于嵌入式STM32的ModbusRTU協(xié)議實現(xiàn)

2023年第11期儀表技術(shù)33

基于嵌入式STM32的ModbusRTU協(xié)議實現(xiàn)

磊,彭道剛,趙斌斌,黃麗

(上海電力學(xué)院自動化工程學(xué)院,上海200090)

Modbus協(xié)議以其高效性、

34儀表技術(shù)2023年第11期

式的主要優(yōu)點(diǎn)是在相同波特率下其傳輸?shù)淖址拿芏?/p>

每個信息必須連續(xù)傳輸。它的消息高于ASCII模式,幀格式如表1所示。

表1

起始位T1-T2-T3-T4

RTU消息幀格式

數(shù)據(jù)n個8Bit

CRC校驗16Bit

結(jié)束符T1-T2-T3-T4

設(shè)備地址功能代碼8Bit

8Bit

地址域:本設(shè)計中用到的Modbus功能碼如表2所

示,信息地址包括8位(RTU),有效的從機(jī)設(shè)備地址范圍0~247(10進(jìn)制),各從機(jī)設(shè)備的尋址范圍為1~247。主機(jī)把從機(jī)地址放入信息幀的地址區(qū),并向從機(jī)

圖1

系統(tǒng)硬件設(shè)計

接口能實現(xiàn)將數(shù)字量的控制信號轉(zhuǎn)換成模擬量輸出,

達(dá)到控制設(shè)備的目的。采集的數(shù)據(jù)可以在LCD液晶便于現(xiàn)場參數(shù)的調(diào)試和修改,同時也可以將屏上顯示,

485、測量的數(shù)據(jù)通過RS-以太網(wǎng)傳輸至監(jiān)控中心工作

站。JTAG接口用于在線仿真和軟件調(diào)試。22.1

Modbus協(xié)議Modbus協(xié)議概述

把自己的地址放入響應(yīng)信息的地尋址。從機(jī)響應(yīng)時,

讓主機(jī)識別已作出響應(yīng)的從機(jī)地址。址區(qū),

功能碼:當(dāng)主機(jī)向從機(jī)發(fā)送信息時,功能代碼向從機(jī)說明應(yīng)執(zhí)行的動作。如讀一組離散式線圈或輸入信讀一組寄存器的數(shù)據(jù),讀從機(jī)的號的ON/OFF狀態(tài),

診斷狀態(tài),寫線圈(或寄存器)等。部分功能代碼代表的操作如表2所示。

表2

功能碼010203040506

名稱讀線圈讀離散量輸入讀保持寄存器讀輸入寄存器寫單個線圈寫單個寄存器

Modbus功能代碼

功能

讀線圈的當(dāng)前狀態(tài)讀取離散量輸入的當(dāng)前狀態(tài)讀取保持寄存器的內(nèi)容讀輸入寄存器的內(nèi)容將線圈的輸出寫為ON或OFF將二進(jìn)制數(shù)寫到一個保持寄存器

1979年Modbus協(xié)議由Modicon公司(現(xiàn)在是施

具有劃時代、里程碑式的耐德電氣的一個品牌)發(fā)明,

意義,從此掀起了工業(yè)控制網(wǎng)絡(luò)技術(shù)的序幕。Modbus

是全球第一個真正用于工業(yè)現(xiàn)場的總線協(xié)議,近年來在控制器和測量儀表上也得到了大量地使用,目前已成為我國工業(yè)自動化領(lǐng)域的一種國際標(biāo)準(zhǔn)。Modbus

232、RS-422、RS-485通信接口和協(xié)議支持傳統(tǒng)的RS-以太網(wǎng)接口。

Modbus通信協(xié)議采用主-從(Master-Slave)模型,

是一種應(yīng)用層報文協(xié)議,可以在不同類型的總線或網(wǎng)而不管它們是經(jīng)過何種網(wǎng)絡(luò)進(jìn)行通信的,在同絡(luò)鏈接,

一通信網(wǎng)絡(luò)上每個設(shè)備都有唯一的設(shè)備地址,并且只可以有多個從設(shè)備。主設(shè)備可單獨(dú)能有一個主設(shè)備,

和從設(shè)備通信,也能以廣播方式和所有從設(shè)備通信。如果是單獨(dú)通信,從設(shè)備返回一應(yīng)答消息作為回應(yīng),如則不作任何回應(yīng)。果是以廣播方式進(jìn)行查詢的,2.2

Modbus協(xié)議的數(shù)據(jù)幀

Modbus協(xié)議有兩種傳輸模式:RTU模式和ASCII模式。ASCII模式中數(shù)據(jù)用ASCII碼表示,通過冒號(ASCII碼3AH)、0AH)字符回車換行(ASCII碼0DH,采用LRC數(shù)據(jù)校驗;RTU表示數(shù)據(jù)幀的開始和結(jié)束,

模式中數(shù)據(jù)用非壓縮BCD碼表示,通過時間標(biāo)記來實

采用CRC數(shù)據(jù)校驗??噩F(xiàn)數(shù)據(jù)幀開始和結(jié)束的判定,

制器以RTU模式在Modbus總線上進(jìn)行通信時,信息

該模中的每8位字節(jié)分成2個4位16進(jìn)制的字符,

數(shù)據(jù)域:數(shù)據(jù)域和功能碼密切相關(guān),根據(jù)功能碼的

不同而不同。

CRC校驗:ModbusRTU采用循環(huán)冗余檢驗CRC方法計算錯誤校驗碼,按照CRC算法,使用標(biāo)準(zhǔn)的16位生成多項式對任意長度的信息字段校驗出一個16位的校驗碼。2.3

ModbusRTU通信結(jié)構(gòu)模型

本文用底層數(shù)據(jù)采集系統(tǒng)為依托建立檢測平臺采

利用ModbusRTU協(xié)議實現(xiàn)集標(biāo)準(zhǔn)的電壓電流信號,

數(shù)據(jù)采集系統(tǒng)與計算機(jī)之間的通信。系統(tǒng)組網(wǎng)結(jié)構(gòu)如數(shù)據(jù)采集系統(tǒng)為從站,主圖2所示。以PC機(jī)為主站,

從站根據(jù)各自的編號向主站向從站發(fā)出取數(shù)據(jù)命令,

站返回各項采集的數(shù)據(jù),主站將接收的數(shù)據(jù)處理后存入數(shù)據(jù)庫。3

ModbusRTU協(xié)議的實現(xiàn)

ModbusRTU協(xié)議采用Master/Slave通信模型。在μC/OS-II操作系統(tǒng)環(huán)境下,實現(xiàn)ModbusRTU中PC端主站和MiniARM端從站之間的通信。

2023年第11期儀表技術(shù)

Bit字,而PNum是操作的數(shù)據(jù)。

35

如圖3所示為ModbusRTU主站程序流程圖。為實現(xiàn)ModbusRTU主站協(xié)議的功能處理模塊,首先需然后根據(jù)服要完成串口的初始化和服務(wù)函數(shù)的構(gòu)造,

務(wù)構(gòu)造函數(shù)構(gòu)造Modbus請求幀并且調(diào)用串口發(fā)送命令將請求幀發(fā)送出去,如果程序在設(shè)定的時間內(nèi)接收到應(yīng)答幀,程序?qū)⒄{(diào)用對應(yīng)的應(yīng)答幀解析函數(shù)進(jìn)行處

圖2

系統(tǒng)網(wǎng)絡(luò)結(jié)構(gòu)

3.1ModbusRTU主站的實現(xiàn)

Modbus主站服務(wù)程序的核心模塊是功能處理模

理,否則返回應(yīng)答超時碼。同時,解析函數(shù)對串口緩沖區(qū)內(nèi)接收到的數(shù)據(jù)進(jìn)行分析,若應(yīng)答幀解析正確,函數(shù)將數(shù)據(jù)裝入目標(biāo)緩沖區(qū),否則返回校驗失敗碼

塊,包括串口初始化、數(shù)據(jù)幀的構(gòu)造和解析以及發(fā)送數(shù)

據(jù)幀等功能。發(fā)送數(shù)據(jù)幀時必須將其封裝成標(biāo)準(zhǔn)的Modbus數(shù)據(jù)幀才能進(jìn)行發(fā)送。在協(xié)議幀的組成上,Modbus協(xié)議定義了一個與基礎(chǔ)通信層無關(guān)的簡單協(xié)議數(shù)據(jù)單元(PDU),通過在PDU上增加地址域和CRC校驗域等附加域定義了應(yīng)用數(shù)據(jù)單元(ADU)。CRC碼為2個字節(jié),16位的二進(jìn)制值。由發(fā)送設(shè)備計算CRC值,并把它附到信息中去。接收設(shè)備在接收信息過程中再次計算CRC值并與CRC的實際值進(jìn)行比較,若兩者不一致,即產(chǎn)生一個錯誤。校驗開始,時,把16位寄存器的各位都置為“1”然后把信息中

只的相鄰2個8位字節(jié)數(shù)據(jù)放到當(dāng)前寄存器中處理,

有每個字符的8位數(shù)據(jù)用于CRC處理,起始位、停止位和校驗位不參與CRC計算。

CRC校驗時,每個8位數(shù)據(jù)與該寄存器的內(nèi)容進(jìn)行異或運(yùn)算,然后向最低有效位(LSB)方向移位,用零填入最高有效位(MSB)后,再對LSB檢查,若LSB=1,則

不作異或運(yùn)算。寄存器與預(yù)置的固定值異或;若LSB=0,

重復(fù)上述處理過程,直至移位8次,最后一次(第

8次)移位后,下一個8位字節(jié)數(shù)據(jù)與寄存器的當(dāng)前值異或,再重復(fù)上述過程。全部處理完信息中的數(shù)據(jù)字節(jié)后,最終得到的寄存器值為CRC值。

CRC值附加到信息時,低位在先,高位在后。為了方便功能參數(shù)的獲取,定義了一個如下結(jié)構(gòu)體:

typedefstruct{

unsignedcharSlaveID;unsignedcharFunc;intStartAddr;intPNum;}Parameter

圖3ModbusRTU主站程序流程圖

3.2ModbusRTU從站的實現(xiàn)

ModbusRTU協(xié)議是一個一主多從的通信協(xié)議,所

以需要對每個從站分配不同的地址。ModbusRTU從

站主要實現(xiàn)數(shù)據(jù)幀的接收和存儲,并且根據(jù)接收到的數(shù)據(jù)幀中的功能代碼給出一應(yīng)答消息作為對主站的回應(yīng)。ModbusRTU從站的程序設(shè)計流程圖如圖4所示。首先需要對串口初始化,如設(shè)置波特率、數(shù)據(jù)位和奇偶校驗位等,然后調(diào)用串口接收命令讀取主站發(fā)送來的數(shù)據(jù)幀,并判斷接收到的數(shù)據(jù)幀中的地址與本機(jī)是否相符,如果不符,直接結(jié)束,否則對數(shù)據(jù)幀進(jìn)行CRC校驗。當(dāng)校驗正確的時候就可以根據(jù)相應(yīng)的功否則向主站能代碼調(diào)用對應(yīng)的函數(shù)去執(zhí)行功能操作,

返回一個錯誤信息的應(yīng)答幀。下面是功能代碼為03時,讀保持寄存器的功能函數(shù)。

voidreadholdingregister(unsignedchar*Rx){

StartAddr=(*Rx++)<<8;StartAddr+=*Rx++;//起始地址

其中SlaveID是從站地址,一個Modbus網(wǎng)絡(luò)最多

允許有255個從站。Func是服務(wù)功能號的選擇。StartAddr是需要操作的設(shè)備在從站中的地址,它是16

36儀表技術(shù)2023年第11期

從站能否解析請求幀及時響出請求幀完成相應(yīng)功能,

應(yīng)主站請求,發(fā)出應(yīng)答幀。與PC機(jī)相連之后,分別對兩種功能服務(wù)進(jìn)行若干測試,并根據(jù)ModbusRTU協(xié)議的內(nèi)容驗證所得到的結(jié)果是否正確。在主站PC機(jī)上的截圖如5所示。

圖4ModbusRTU從站程序流程圖

outputnum=(*Rx++)<<8;

outputnum+=(*Rx++);//輸出數(shù)量

if(outputnum<=0x07d0&&outputnum>=0x0001){

if(StartAddr<=0xffff&&startaddr>=0x0000)//起始地址{

send[0]=SlaveID;send[1]=0x03;send[2]=2*outputnum;for(n=1;n<=2*outputnum;n++){

send[n+2]=ox[startaddr+n-1];

re_crc=GetCRC16(send,2*outputnum+3);send[2*outputnum+4]=re_crc&0xff;send[2*outputnum+3]=re_crc>>8&0xff;}

圖5主站PC機(jī)通信測試

由圖5可以看出ModbusRTU主站對地址為1的

ModbusRTU從站的操作,讀寄存器地址01和寫寄存這里以03讀寄存器功能為例來分析。器地址01,

主站PC機(jī)通過串口發(fā)送一個Modbus幀包含8個字節(jié),工控板判斷出是ModbusRTU幀,執(zhí)行RTU服01代表所請求的從站地址,03代表所要執(zhí)行的讀務(wù),

0001為寄存器的寄存器號(1號寄存寄存器功能,

0001為寄存器的數(shù)量(1個字節(jié)),D5CA為器),

CRC校驗碼。從站接到主站的請求幀后,解析幀,返01代回一個響應(yīng),反應(yīng)幀如圖5的接收所示,同樣的,

03代表該幀執(zhí)行的功能是讀寄存表了該從站的地址,

02代表了字節(jié)計數(shù),即為后面讀出來數(shù)據(jù)的總字器,

7984為CRC校驗碼。其中0001即為數(shù)據(jù)采集節(jié)數(shù),

系統(tǒng)所讀取到的放在1號寄存器里的數(shù)字量。4

結(jié)論

3.3

系統(tǒng)通信參數(shù)

ModbusRTU是基于串口的數(shù)據(jù)傳輸模式,為了實

現(xiàn)主站和從站之間的通信,在同一網(wǎng)絡(luò)上所有設(shè)備都必須設(shè)置相同的傳輸模式和串口參數(shù)。本設(shè)計中的通信參數(shù)設(shè)置如表3所示。

表3

通信參數(shù)串口波特率奇偶校驗數(shù)據(jù)長度停止位

PC端COM19600bit/s

無8位1位

串口通信參數(shù)

數(shù)據(jù)采集系統(tǒng)端ModbusRTU9600bit/s

無8位1

本系統(tǒng)采用了STM32F103ZE嵌入式微控制器,可以使系統(tǒng)小型化,提高了系統(tǒng)性能,并且便于各種外設(shè)的擴(kuò)展,可以實現(xiàn)多功能采集。本系統(tǒng)將基于STM32F103ZE微處理器為核心的數(shù)據(jù)采集系統(tǒng)作為485總線上,PC機(jī)作為主站成功地獲從站配置在RS-取了設(shè)備參數(shù),并利用上位機(jī)界面顯示采集信號,達(dá)到了系統(tǒng)設(shè)計的基本要求。

通過實驗測試,本文所介紹的ModbusRTU協(xié)議的主從通信模式,可以良好地應(yīng)用于工業(yè)現(xiàn)場的設(shè)備參數(shù)的通信傳輸。由于系統(tǒng)通信可靠、傳輸速率快,在電力及其他工業(yè)現(xiàn)場具有廣闊的應(yīng)用前景。

(下轉(zhuǎn)第54頁)

3.4

系統(tǒng)通信調(diào)試

采用Modbus調(diào)試精靈作為RTU主站軟件,用戶

可以通過該人機(jī)界面選擇從站

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論