0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何將FreeMODBUS協(xié)議棧移植到AT32 MCU

MCU開發(fā)加油站 ? 來(lái)源:AT32 MCU 雅特力科技 ? 2023-12-15 16:22 ? 次閱讀

概述

Modbus是一種串行通信協(xié)議,是Modicon公司(現(xiàn)施耐德電氣)于1979年為使用可編程邏輯控制器PLC)通信而發(fā)表。如今Modbus已成為工業(yè)領(lǐng)域通信協(xié)議的業(yè)界標(biāo)準(zhǔn),并且是工業(yè)電子設(shè)備之間常用的連接方式。

關(guān)于Modbus協(xié)議

Modbus協(xié)議使用的是主從的通訊技術(shù),即由主設(shè)備主動(dòng)查詢和操作從設(shè)備。一般將主控設(shè)備方所使用的協(xié)議稱為Modbus Master,從設(shè)備方所使用的協(xié)議稱為Modbus Slave。典型的主設(shè)備包括工控機(jī)和工業(yè)控制器等;典型的從設(shè)備如可編程邏輯控制器(PLC)等。

MODBUS是OSI模型第7層上的應(yīng)用層報(bào)文傳輸協(xié)議,它在連接至不同類型總線或網(wǎng)絡(luò)的設(shè)備之間提供客戶機(jī)/服務(wù)器通信。 Modbus通訊物理接口可以選用串口(包括RS232、RS485等),也可以選擇以太網(wǎng)口等。 圖1. Modbus通信棧

a05d2096-9b1f-11ee-8b88-92fbcf53809c.png

MODBUS協(xié)議定義了一個(gè)與基礎(chǔ)通信層無(wú)關(guān)的簡(jiǎn)單協(xié)議數(shù)據(jù)單元(PDU)。特定總線或網(wǎng)絡(luò)上的MODBUS協(xié)議映射能夠在應(yīng)用數(shù)據(jù)單元(ADU)上引入一些附加域。

圖2. 通用Modbus幀

a074ec3a-9b1f-11ee-8b88-92fbcf53809c.png

當(dāng)服務(wù)器對(duì)客戶機(jī)響應(yīng)時(shí),它使用功能碼域來(lái)指示正常(無(wú)差錯(cuò))響應(yīng)或者出現(xiàn)某種差錯(cuò)(稱為異常響應(yīng))。需要管理超時(shí),以便明確地等待可能不會(huì)出現(xiàn)的應(yīng)答。

圖3. Modbus事務(wù)處理(無(wú)差錯(cuò))

a0820208-9b1f-11ee-8b88-92fbcf53809c.png

圖4. Modbus事務(wù)處理(異常響應(yīng))

a09cf4f0-9b1f-11ee-8b88-92fbcf53809c.png

MODBUS使用一個(gè)‘big-Endian’表示地址和數(shù)據(jù)項(xiàng)。這意味著當(dāng)發(fā)射多個(gè)字節(jié)時(shí),首先發(fā)送最高有效位。例如,寄存器大小16-bit的值為0x1234,先發(fā)送的第一字節(jié)為0x12,然后為0x34。

MODBUS的數(shù)據(jù)模型以一系列具有不同特征表格上的數(shù)據(jù)模型為基礎(chǔ)。四個(gè)基本表格為:

表1. Modbus數(shù)據(jù)模型

a0a9ff1a-9b1f-11ee-8b88-92fbcf53809c.png

MODBUS有三類功能碼:公共功能碼、用戶定義功能碼、保留功能碼。

公共功能碼是較好地被定義的功能碼,保證是唯一的、公開證明的,具有可用的一致性測(cè)試。

圖5. 公共功能碼定義

a0adc1b8-9b1f-11ee-8b88-92fbcf53809c.png

Modbus串行鏈路協(xié)議是一個(gè)主從協(xié)議。在同一時(shí)刻,只有一個(gè)主節(jié)點(diǎn)連接于總線,一個(gè)或多個(gè)子節(jié)點(diǎn)(最大編號(hào)為247)連接于同一個(gè)串行總線。Modbus通信總是由主節(jié)點(diǎn)發(fā)起。子節(jié)點(diǎn)在沒有收到來(lái)自主節(jié)點(diǎn)的請(qǐng)求時(shí),從不會(huì)發(fā)送數(shù)據(jù)。子節(jié)點(diǎn)之間從不會(huì)互相通信。主節(jié)點(diǎn)在同一時(shí)刻只會(huì)發(fā)起一個(gè)Modbus事務(wù)處理。

主節(jié)點(diǎn)以兩種模式對(duì)子節(jié)點(diǎn)發(fā)出Modbus請(qǐng)求:

1、單播模式,主節(jié)點(diǎn)以特定地址訪問某個(gè)子節(jié)點(diǎn),子節(jié)點(diǎn)接到并處理完請(qǐng)求后,子節(jié)點(diǎn)向主節(jié)點(diǎn)返回一個(gè)報(bào)文(一個(gè)'應(yīng)答')。每個(gè)子節(jié)點(diǎn)必須有唯一的地址(1到247),這樣才能區(qū)別于其它節(jié)點(diǎn)被獨(dú)立的尋址。

圖6. 單播模式

a0be2e90-9b1f-11ee-8b88-92fbcf53809c.png

2、廣播模式,主節(jié)點(diǎn)向所有的子節(jié)點(diǎn)發(fā)送請(qǐng)求。對(duì)于主節(jié)點(diǎn)廣播的請(qǐng)求沒有應(yīng)答返回。廣播請(qǐng)求一般用于寫命令。所有設(shè)備必須接受廣播模式的寫功能。地址0是專門用于表示廣播數(shù)據(jù)的。

圖7. 廣播模式

a0d02cd0-9b1f-11ee-8b88-92fbcf53809c.png

Modbus有兩種串行傳輸模式被定義:RTU模式(默認(rèn))和ASCII模式。

圖8. RTU和ASCII模式的位序列

a0db3c88-9b1f-11ee-8b88-92fbcf53809c.png

Modbus串行鏈路上所有設(shè)備的傳輸模式(和串行口參數(shù))必須相同。

有關(guān)Modbus實(shí)現(xiàn)和特性的詳細(xì)信息,請(qǐng)?jiān)L問Modbus官網(wǎng):https://modbus.org。

關(guān)于FreeModbus協(xié)議棧

FreeMODBUS是一個(gè)針對(duì)通用的Modbus協(xié)議棧在嵌入式系統(tǒng)中應(yīng)用的實(shí)現(xiàn)。它提供了RTU/ASCII傳輸模式及TCP協(xié)議支持。FreeModbus遵循BSD許可證,這意味著用戶可以將FreeModbus應(yīng)用于商業(yè)環(huán)境中。目前FreeMODBUS只免費(fèi)提供了一個(gè)Modbus從機(jī)節(jié)點(diǎn)的協(xié)議棧。該協(xié)議棧使用ANSI C編寫,并且支持多個(gè)變量。 本應(yīng)用指南將介紹如何在AT32F435單片機(jī)上,通過FreeMODBUS協(xié)議棧實(shí)現(xiàn)Modbus從機(jī)節(jié)點(diǎn)的主要功能,并提供基于AT32F43x_StdPeriph_Lib和FreeMODBUS協(xié)議棧的源代碼。如結(jié)合AT32-Comm-EV Board和AT-START Board可以方便快速的搭建起基于RS485的Modbus從機(jī)節(jié)點(diǎn)。

關(guān)于Modbus Poll調(diào)試軟件

Modbus Poll是一個(gè)Modbus主機(jī)模擬器,支持Modbus RTU、ASCI、TCP/IP傳輸模式。它可以協(xié)助開發(fā)人員調(diào)試Modbus從設(shè)備,測(cè)試和模擬Modbus協(xié)議的通信。通過多文檔界面接口,可以同時(shí)監(jiān)控多個(gè)Modbus從機(jī)設(shè)備、數(shù)據(jù)域等。每個(gè)窗口可簡(jiǎn)單地設(shè)定從設(shè)備ID、功能碼、地址、長(zhǎng)度和輪詢間隔。支持Modbus數(shù)據(jù)模型的四個(gè)基本表格,支持Modbus的多個(gè)公共功能碼。

本應(yīng)用指南中將下載安裝Modbus Poll在PC機(jī)上作為Modbus主機(jī),與AT-START Board(作為Modbus從機(jī))通過USB轉(zhuǎn)RS485的模塊相連,實(shí)現(xiàn)一個(gè)完整的、可測(cè)試的Modbus通信網(wǎng)絡(luò)。

AT32硬件準(zhǔn)備

硬件主要由AT32-Comm-EV Board和AT-START Board組成。

本應(yīng)用指南提供的demo使用到的外設(shè)資源有USARTTMR等,用戶可根據(jù)具體需要靈活配置和修改,使用RS232或RS485來(lái)實(shí)現(xiàn)Modbus物理層的連接。

圖9. AT32 Modbus結(jié)構(gòu)原理圖

a0ecdee8-9b1f-11ee-8b88-92fbcf53809c.png

AT-START Board

當(dāng)前提供例程基于AT-START-F435??商峁┗赗S232的Modbus通信。

圖10. AT-START-F435 V1.0實(shí)驗(yàn)板

a0ff1c66-9b1f-11ee-8b88-92fbcf53809c.png

AT32-Comm-EV Board

可提供例程基于RS485的Modbus通信支持。

圖11. AT-START結(jié)合AT32-Comm-EV使用

a1298adc-9b1f-11ee-8b88-92fbcf53809c.png

將FreeModbus移植到AT32上

基礎(chǔ)工程準(zhǔn)備

下載最新版本BSP&PACK文件,按照其應(yīng)用指南進(jìn)行安裝及配置,本文檔及例程均基于AT32F4xx_StdPeriph_Lib_V2.x.x的BSP&PACK文件進(jìn)行開發(fā)??山栌胊t_start_f435文件夾下的temple工程來(lái)進(jìn)行修改,更改文件夾及工程名為freemodbus,并準(zhǔn)備在該工程內(nèi)添加FreeMODBUS源碼。

工程內(nèi)添加FreeModbus源碼

用戶需前往FreeMODBUS官網(wǎng)或Github上下載最新版源碼。源碼包解壓后,內(nèi)有如下文件。

本文及所有移植例程均基于freemodbus-v1.6版本進(jìn)行移植。

圖12. FreeMODBUS源碼文件

a141c2d2-9b1f-11ee-8b88-92fbcf53809c.png

將源碼包解壓后,復(fù)制modbus文件夾和demoBAREport文件夾到前面的基礎(chǔ)工程freemodbus目錄下面,將port文件夾改名為modbus_port。如下圖所示。

圖13. freemodbus工程目錄

a161d5b8-9b1f-11ee-8b88-92fbcf53809c.png

打開工程文件,并按以下2個(gè)步驟添加到工程文件內(nèi)??蓞⒖糀T提供的例程文件進(jìn)行添加。

1、添加modbus和modbus_port內(nèi)的所有.c文件(與tcp相關(guān)的除外)到工程項(xiàng)目?jī)?nèi)。

圖14. freemodbus工程的項(xiàng)目

a17c4452-9b1f-11ee-8b88-92fbcf53809c.png

2、需將添加的.c文件所對(duì)應(yīng)的.h文件的路徑添加到工程的文件夾設(shè)置內(nèi)。

圖15. freemodbus工程的文件夾設(shè)置

a1889a68-9b1f-11ee-8b88-92fbcf53809c.png

工程代碼的修改

1、修改“port.h”文件。在該文件中添加包含關(guān)于AT32 MCU的“at32f435_437.h”頭文件。補(bǔ)全用于互斥操作的開關(guān)中斷宏定義。屏蔽掉關(guān)于TRUE、FALSE的宏定義,因在AT BSP的頭文件中已有定義,避免編譯出錯(cuò)。 2、修改“portserial.c”和“porttimer.c”文件。在該文件中添加關(guān)于USART和TMR外設(shè)的底層驅(qū)動(dòng)部分代碼。用戶可根據(jù)自己的硬件環(huán)境來(lái)自行修改,所以這里不進(jìn)行具體說明,也可參考AT所提供的例程文件。 3、需特別注意的是,因USART寄存器DT的值里包含數(shù)據(jù)位和校驗(yàn)位,而FreeMODBUS源碼里在讀取USART接收的數(shù)據(jù)后,會(huì)把所有值都當(dāng)作數(shù)據(jù)位來(lái)處理而出錯(cuò),這可能是和其他廠家的MCU有差異,所以這里需在“mbascii.c”文件中去修改源碼。具體可參考AT所提供的例程文件。 4、在工程中新建并添加“mbtask.c/.h”文件。該文件用于創(chuàng)建Modbus的通信任務(wù)(作從機(jī))來(lái)調(diào)用FreeMODBUS協(xié)議棧的API層,并建立Modbus的數(shù)據(jù)模型(4個(gè)基本表格)用于與ModbusPoll(作主機(jī))進(jìn)行模擬通信測(cè)試。 “mbtask.c/.h”文件中實(shí)現(xiàn)的調(diào)用管理:

保持寄存器的讀/寫

輸入寄存器的讀取

線圈的讀/寫

離散量輸入的讀取

“mbtask.h”文件中定義的Modbus數(shù)據(jù)模型和建立通信所需的參數(shù):

表2. Modbus的配置參數(shù)

a1945060-9b1f-11ee-8b88-92fbcf53809c.png

設(shè)備功能的實(shí)現(xiàn)

1、在“mbtask.c”文件中編寫void modbus_task(void)函數(shù)去調(diào)用協(xié)議棧的API層,來(lái)實(shí)現(xiàn)modbus從機(jī)任務(wù)的功能。

a1a3222a-9b1f-11ee-8b88-92fbcf53809c.png

2、在“main.c”文件中,由int main(void) 主函數(shù)去調(diào)用modbus_task()任務(wù)函數(shù)即可。

a1b9a4d2-9b1f-11ee-8b88-92fbcf53809c.png

設(shè)備的測(cè)試

至此,官方例程移植完畢,編譯并下載,開打與AT-Link相連的串口,可看到如下打印信息。 圖16. 串口打印信息

a1ca76fe-9b1f-11ee-8b88-92fbcf53809c.png

從打印信息可以看到,從設(shè)備已經(jīng)正常的運(yùn)行起來(lái)。

這時(shí)我們需要將此設(shè)備與上位機(jī)相連接,再打開Modbus Poll軟件,模擬主設(shè)備來(lái)進(jìn)行單播通信,即發(fā)送請(qǐng)求并接收應(yīng)答。

1. 首先對(duì)Modbus Poll軟件進(jìn)行連接設(shè)置,選擇與從設(shè)備相同的傳輸模式(RTU Mode),并配置相應(yīng)串口的參數(shù),也須與從設(shè)備相同。

圖17. Modbus Poll連接設(shè)置

a1e54092-9b1f-11ee-8b88-92fbcf53809c.png

2. 再對(duì)Modbus Poll軟件進(jìn)行讀寫命令的定義,下面僅以功能碼03(讀保持寄存器)為例來(lái)講解,用戶可自行用同樣的方式測(cè)試其他功能碼。

圖18. Modbus Poll讀/寫定義

a1f1a38c-9b1f-11ee-8b88-92fbcf53809c.png

3. 在Modbus Poll軟件的文檔界面中,可以看到已成功讀回保持寄存器的值,并與從設(shè)備的程序中初始化保持寄存器時(shí)的值一致,測(cè)試通過。

圖19. Modbus Poll文檔界面

a1ff15c6-9b1f-11ee-8b88-92fbcf53809c.png

來(lái)源:AT32 MCU 雅特力科技

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16800

    瀏覽量

    349348
  • 通信協(xié)議
    +關(guān)注

    關(guān)注

    28

    文章

    823

    瀏覽量

    40191
  • MODBUS
    +關(guān)注

    關(guān)注

    28

    文章

    1742

    瀏覽量

    76668
  • 移植
    +關(guān)注

    關(guān)注

    1

    文章

    375

    瀏覽量

    28073
  • AT32
    +關(guān)注

    關(guān)注

    1

    文章

    110

    瀏覽量

    2047
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    開發(fā)一款支持主機(jī)模式的FreeModbus協(xié)議

    FreeModbus 是一款開源的 Modbus 協(xié)議,但是只有從機(jī)開源,主機(jī)源碼是需要收費(fèi)的。同時(shí)網(wǎng)上也沒有發(fā)現(xiàn)比較好的開源的 Modbus 主機(jī)協(xié)議
    發(fā)表于 07-27 16:18 ?2974次閱讀
    開發(fā)一款支持主機(jī)模式的<b class='flag-5'>FreeModbus協(xié)議</b><b class='flag-5'>棧</b>

    如何將freemodbus移植stm32平臺(tái)

    modbus是一個(gè)非常好的串口協(xié)議(當(dāng)然也能用在網(wǎng)口上),它簡(jiǎn)潔、規(guī)范、強(qiáng)大。可以滿足大部分的工業(yè)、嵌入式需求。這里詳細(xì)說下如何將freemodbus移植
    發(fā)表于 08-16 06:59

    如何將LwIP協(xié)議移植μC/OS-II實(shí)時(shí)操作系統(tǒng)上去呢

    LwIP協(xié)議是什么?什么是μC/OS-II實(shí)時(shí)操作系統(tǒng)呢?如何將LwIP協(xié)議移植μC/OS-
    發(fā)表于 11-05 08:44

    如何將FreeModbus移植STM32平臺(tái)上去

    modbus是什么?如何將FreeModbus移植STM32平臺(tái)上?
    發(fā)表于 11-17 07:44

    介紹Modbus協(xié)議在STM32平臺(tái)上的移植

    在STM32平臺(tái)上的移植。1.1 freemodbus介紹??freemodbus是一個(gè)奧地利人寫的Modbus協(xié)議。它是一個(gè)針對(duì)嵌入式應(yīng)用的一個(gè)免費(fèi)(自由)的通用
    發(fā)表于 01-14 06:57

    怎樣去獲取FreeMODBUS協(xié)議

    FreeMODBUS是什么呢?FreeMODBUS協(xié)議有何功能呢?怎樣去獲取FreeMODBUS協(xié)議呢?
    發(fā)表于 01-24 07:45

    RT-Thread freemodbus協(xié)議移植實(shí)現(xiàn)

    前言繼續(xù)熟悉RT-Thread freemodbus的應(yīng)用,熟悉modbus協(xié)議。平臺(tái):Pandora STM32L475,Keil MDK5,RT-Thread 4.0.3有前幾次的移植,本次驗(yàn)證
    發(fā)表于 04-29 14:40

    Modbus on AT32 MCU

    Modbus on AT32 MCU前言本應(yīng)用筆記介紹了如何將FreeMODBUS協(xié)議移植
    發(fā)表于 07-26 20:22

    GUIX移植AT32 MCU的過程和方法

    本應(yīng)用筆記主要演示GUIX移植AT32 MCU的過程和方法。本應(yīng)用筆記在ThreadX OS基礎(chǔ)上進(jìn)行講解,因此建議閱讀者先看AT32的如
    發(fā)表于 10-25 07:51

    如何將FreeMODBUS協(xié)議移植AT32F43x單片機(jī)

    本應(yīng)用筆記介紹了如何將FreeMODBUS協(xié)議移植AT32F43x單片機(jī)方法。本文檔提供的源代碼演示了使用Modbus的應(yīng)用程序。單片機(jī)
    發(fā)表于 10-26 06:18

    其實(shí)ST的HAL庫(kù)與FreeModbus移植很配哦--FreeModbus從站設(shè)計(jì)(8)

    用HAL庫(kù)函數(shù)理清Modbus的數(shù)據(jù)收發(fā)流程。闡述了HAL庫(kù)與FreeModbus協(xié)議接口的基本框架。最初設(shè)想是能不能完全用HAL庫(kù)的函數(shù)來(lái)實(shí)現(xiàn)的FreeModbus移植?;贖AL
    發(fā)表于 12-20 18:55 ?16次下載
    其實(shí)ST的HAL庫(kù)與<b class='flag-5'>FreeModbus</b><b class='flag-5'>移植</b>很配哦--<b class='flag-5'>FreeModbus</b>從站設(shè)計(jì)(8)

    FreeModbus 在 STM32F1 平臺(tái)的移植和解析

    Modbus協(xié)議在STM32平臺(tái)上的移植。1.1 freemodbus介紹??freemodbus是一個(gè)奧地利人寫的Modbus協(xié)議。它是一
    發(fā)表于 01-14 13:57 ?41次下載
    <b class='flag-5'>FreeModbus</b> 在 STM32F1 平臺(tái)的<b class='flag-5'>移植</b>和解析

    如何將FreeMODBUS協(xié)議移植AT32 MCU

    之間常用的連接方式。關(guān)于Modbus協(xié)議Modbus協(xié)議使用的是主從的通訊技術(shù),即由主設(shè)備主動(dòng)查詢和操作從設(shè)備。一般主控設(shè)備方所使用的協(xié)議稱為ModbusMast
    的頭像 發(fā)表于 11-14 08:15 ?816次閱讀
    <b class='flag-5'>如何將</b><b class='flag-5'>FreeMODBUS協(xié)議</b><b class='flag-5'>棧</b><b class='flag-5'>移植</b><b class='flag-5'>到</b><b class='flag-5'>AT32</b> <b class='flag-5'>MCU</b>

    如何將FreeMODBUS協(xié)議移植AT32F43x單片機(jī)方法

    電子發(fā)燒友網(wǎng)站提供《如何將FreeMODBUS協(xié)議移植AT32F43x單片機(jī)方法.pdf》資料免費(fèi)下載
    發(fā)表于 12-18 11:15 ?0次下載
    <b class='flag-5'>如何將</b><b class='flag-5'>FreeMODBUS協(xié)議</b><b class='flag-5'>棧</b><b class='flag-5'>移植</b><b class='flag-5'>到</b>AT32F43x單片機(jī)方法

    FreeMODBUS協(xié)議移植AT32 MCU的方案設(shè)計(jì)

    Modbus協(xié)議使用的是主從的通訊技術(shù),即由主設(shè)備主動(dòng)查詢和操作從設(shè)備。一般主控設(shè)備方所使用的協(xié)議稱為Modbus Master,從設(shè)備方所使用的協(xié)議稱為Modbus Slave。典
    發(fā)表于 12-15 16:09 ?482次閱讀
    <b class='flag-5'>FreeMODBUS協(xié)議</b><b class='flag-5'>棧</b><b class='flag-5'>移植</b><b class='flag-5'>到</b><b class='flag-5'>AT32</b> <b class='flag-5'>MCU</b>的方案設(shè)計(jì)