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

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

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

i.MX RT1024:移植MODBUS TCP協(xié)議棧教程

恩智浦MCU加油站 ? 來源:恩智浦MCU加油站 ? 2023-05-31 17:28 ? 次閱讀

教程簡介 MODBUS是一種基于主從結(jié)構(gòu)的控制協(xié)議,由一個(gè)主機(jī)和多個(gè)從機(jī)組成。 MODBUS是施耐德電氣于1979年為可編程邏輯控制器PLC通信所開發(fā)并發(fā)布的協(xié)議,至今已有相當(dāng)長的歷史。 以前它主要基于串口,但由于物聯(lián)網(wǎng)的發(fā)展,基于TCP的MODBUS現(xiàn)在被越來越廣泛地使用。恩智浦的i.MX RT 系列控制器的SDK中沒有相關(guān)的demo,本文的目標(biāo)是向大家介紹如何在SDK中的lwip_ping_freertos例程基礎(chǔ)上添加MODBUS TCP。

MODBUS 協(xié)議棧的下載地址:

https://www.embedded-experts.at/en/freemodbus/

測試軟件QModMaster 的下載地址:

https://sourceforge.net/projects/qmodmaster/

我在本次教程使用了MIMXRT1024-EVK 作為硬件平臺,MIMXRT1024-EVK 和電腦都連接到一臺路由器組成一個(gè)測試網(wǎng)絡(luò)。使用 MCUXpresso IDE 作為開發(fā)環(huán)境,MIMXRT1024-EVK SDK 版本是 2.12.1。 一、文件復(fù)制

下載完協(xié)議棧后,先解壓,隨后將其中的 modbus 目錄完整復(fù)制到 lwip_ping_freertos 工程目錄下,添加 modbus 及其所有子文件夾到工程的 include paths 中。

95aac492-ff8d-11ed-90ce-dac502259ad0.png

在協(xié)議棧里有一個(gè)demo 目錄,里面是modbus 被移植到各個(gè)廠商處理器上的demo, 可惜沒有i.MX RT。仔細(xì)對比各個(gè) demo 就可以發(fā)現(xiàn),原來這些 demo 有很多就是基于freertos 和 lwip 的。我們就從 MCF5235 TCP 下手,它既有freertos 又有l(wèi)wip,完美符合我們的項(xiàng)目??梢园阉?port 目錄復(fù)制到我們項(xiàng)目的modbus 目錄下。把其中的文件全部涵蓋進(jìn)來。

二、修改程序

接下來首先是在 lwip_ping_freertos.c 中include “mb.h”。這個(gè)文件包含了 freemodbus 協(xié)議棧提供的所有接口函數(shù)。

1.程序結(jié)構(gòu)

Lwip 協(xié)議棧為用戶應(yīng)用程序的編寫提供 3 種編程接口:

第一種是Raw Callback API,這種方式下協(xié)議棧與用戶程序間通過回調(diào)函數(shù)實(shí)現(xiàn)通信。而且協(xié)議棧同應(yīng)用程序處在同一個(gè)進(jìn)程中,彼此間的執(zhí)行都會互相制約。

第二種是 Sequential API 方式,用戶向內(nèi)核注冊回調(diào)函數(shù),并通過直接調(diào)用內(nèi)核 UDP 或TCP 相關(guān)操作函數(shù)來完成應(yīng)用程序的編寫。在這種方式下,協(xié)議棧內(nèi)核運(yùn)行于進(jìn)程 tcpip_thread, 而應(yīng)用程序進(jìn)程也是一個(gè)單獨(dú)的進(jìn)程。獨(dú)立的進(jìn)程結(jié)構(gòu)可以使協(xié)議棧和應(yīng)用程序的執(zhí)行互不影響。通過使用郵箱和信號量等機(jī)制,內(nèi)核進(jìn)程可以直接將數(shù)據(jù)遞交給應(yīng)用程序郵箱中然后繼續(xù)執(zhí)行,不必阻塞等待。

第三種是使用 BSD socket 函數(shù)進(jìn)行應(yīng)用程序開發(fā)。本來這是最簡單的方式,但是由于BSD socket 函數(shù)在實(shí)現(xiàn)上高度抽象,不適合小型嵌入式TCP/IP 應(yīng)用,所以 lwip 里的socket 函數(shù)并不是非常完整。

為實(shí)現(xiàn)與 lwip 協(xié)議棧之間的相互調(diào)用,freemodbus 協(xié)議棧采用的是sequential API 方式。具體的調(diào)用順序如下:在 mb.c 中提供了 eMBTCPInit() 函數(shù), 這個(gè)函數(shù)調(diào)用eMBTCPDoInit()函數(shù), 隨后層層調(diào)用下去,最后在 xMBTCPPortInit()函數(shù)中調(diào)用 tcp_bind()。這個(gè)函數(shù)是 lwip 的 tcp.c 提供的。下圖反映出了 modbus 協(xié)議棧的層次結(jié)構(gòu)。

95c43224-ff8d-11ed-90ce-dac502259ad0.png

最下層的tcp_bind()函數(shù)的作用是將一個(gè)連接結(jié)構(gòu)與本地 IP地址addr和端口號 port 進(jìn)行綁定。作為服務(wù)器端程序,執(zhí)行這一步操作是必要的,服務(wù)器必須與熟知端口進(jìn)行綁定才能接受客戶端的連接請求。這里可以看到,freemodbus協(xié)議棧并沒有以最標(biāo)準(zhǔn)的方式調(diào)用netconn_bind()進(jìn)行綁定,而是直接調(diào)用 tcp_bind()。原因應(yīng)該是這樣做可以免去IPC 通信過程,在無操作系統(tǒng)的環(huán)境下也能工作。

tcp_listen()的任務(wù)是讓 tcp 內(nèi)核監(jiān)聽這個(gè)端口;tcp_accept()是為新的連接注冊一個(gè)回調(diào)函數(shù)prvxMBTCPPortAccept()。在tcpip_thread()進(jìn)程監(jiān)聽到有效連接后會回調(diào)這個(gè)函數(shù)。而這個(gè)函數(shù)會把 modbus 的數(shù)據(jù)包從 tcp 數(shù)據(jù)包中復(fù)制出來,隨后發(fā)送 mailbox 信息給modbus 的進(jìn)程,用來處理消息。

2. 修改接口

95cefef2-ff8d-11ed-90ce-dac502259ad0.png

95cefef2-ff8d-11ed-90ce-dac502259ad0.png

隨后是修改porttcp.c。在這個(gè)文件中的 prvxMBTCPPortReceive()函數(shù)有一個(gè)致命問題必須被改正。這個(gè)函數(shù)是 tcpip_thread()核心進(jìn)程在收到 modbus 包后的回調(diào)函數(shù)。當(dāng)數(shù)據(jù)處理完成后它會調(diào)用pbuf_free()函數(shù)釋放pbuf包并返回 ERR_OK。tcpip_thread()核心進(jìn)程收到ERR_OK就知道數(shù)據(jù)已經(jīng)處理完了,就可以放心踏實(shí)的干別的事情了。然而不知為何,這里的 prvxMBTCPPortReceive() 函數(shù)在某些時(shí)候釋放了pbuf卻并不返回 ERR_OK。于是tcpip_thread()核心進(jìn)程在沒有收到正確的返回值時(shí)會認(rèn)為數(shù)據(jù)包沒有被處理,會把這個(gè)實(shí)際已經(jīng)廢棄的包暫存下來,下次再處理。等到下次處理時(shí)就會產(chǎn)生 pbuf錯(cuò)誤,使得整個(gè)程序被鎖死。

以下是修改的地方:

95eac7e0-ff8d-11ed-90ce-dac502259ad0.png

3. 上層代碼編寫

接下去是為上層應(yīng)用寫的示例代碼。以下 code 全部都是在 lwip_ping_freertos.c 中。 3.1 Tcpip協(xié)議棧初始化 我沒有指定 IP 地址,而是由路由器來分配。

96145ab0-ff8d-11ed-90ce-dac502259ad0.png

962106de-ff8d-11ed-90ce-dac502259ad0.png

3.2Modbus協(xié)議棧初始化

96367dde-ff8d-11ed-90ce-dac502259ad0.png

964ab6e6-ff8d-11ed-90ce-dac502259ad0.png

這個(gè)進(jìn)程首先是等 DHCP 拿到路由器給的 IP 地址,隨后就可以初始化 modbus 協(xié)議,并采用輪詢方式等待連接。

3.3編寫各種命令對應(yīng)的程序9662114c-ff8d-11ed-90ce-dac502259ad0.png

966f3142-ff8d-11ed-90ce-dac502259ad0.png

9686d4be-ff8d-11ed-90ce-dac502259ad0.png

96a11d92-ff8d-11ed-90ce-dac502259ad0.png

三、驗(yàn)證 連接所有線路后編譯下載。我們的程序會在串口打印出路由器給它分配的 IP 地址。

96b7dffa-ff8d-11ed-90ce-dac502259ad0.png

打 開 QModMaster, Modbus 模式選 TCP;

選項(xiàng)->Modbus TCP->從機(jī) IP 填獲得的 IP 地址,端口是 502;功能碼選Read Holding Register (0x03),起始地址 100;

寄存器數(shù)量選 6,Data Format 選 16 進(jìn)制; 按連接按鈕,QModMaster 就能和我們的板子連上,按鈕變成連接起來的樣子;按旁邊讀寫按鈕,就能讀出register的值(見程序vTask_HoldingRegister())。 一切順利,移植成功!

96d03a14-ff8d-11ed-90ce-dac502259ad0.png

QModMaster有一個(gè)總線監(jiān)視器窗口,可以看到收發(fā)的數(shù)據(jù)。

96f4fb56-ff8d-11ed-90ce-dac502259ad0.png

審核編輯 :李倩

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

    關(guān)注

    112

    文章

    16367

    瀏覽量

    178122
  • 協(xié)議棧
    +關(guān)注

    關(guān)注

    2

    文章

    141

    瀏覽量

    33633
  • SDK
    SDK
    +關(guān)注

    關(guān)注

    3

    文章

    1036

    瀏覽量

    45957

原文標(biāo)題:i.MX RT1024: 移植 MODBUS TCP協(xié)議棧教程

文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    i.MX RT1020到i.MX RT1010的遷移手冊

    i.MX RT1020到i.MX RT1010的遷移指南
    發(fā)表于 12-12 06:25

    i.MX RT1060到i.MX RT1064的遷移手冊

    i.MX RT1060到i.MX RT1064的遷移指南
    發(fā)表于 12-12 07:21

    i.MX RT1024功耗測量應(yīng)用說明在哪里?

    NXP 文檔 i.MX RT1024工業(yè)產(chǎn)品跨界處理器數(shù)據(jù)表提到i.MX RT1024 功耗測量應(yīng)用說明- 但該說明未在 RT1024
    發(fā)表于 03-23 08:17

    如何將i.MX RT1024與外部64MB SDRAM一起使用?

    我想將 i.MX RT1024 與外部 64MB SDRAM 一起使用。根據(jù)數(shù)據(jù)表,它支持 8/16 位 SDRAM 外部存儲器接口。從性能的角度來看,哪種模式更好?如何?如果有任何鏈接/參考可以通過此詳細(xì)信息,請告訴我。謝謝
    發(fā)表于 05-05 11:17

    01:i.MX RT的市場應(yīng)用和參考解決方案

    i.MX RT產(chǎn)品是今年市場上最受歡迎的跨界MCU產(chǎn)品。i.MX RT定位為一款MCU產(chǎn)品,它可以重復(fù)利用傳統(tǒng)的Arm MCU生態(tài)系統(tǒng)。除此之外,本次講座還將簡要介紹
    的頭像 發(fā)表于 01-21 07:13 ?3359次閱讀
    01:<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>的市場應(yīng)用和參考解決方案

    恩智浦i.MX RT1170開創(chuàng)GHz MCU時(shí)代

    自2017年上市以來,i.MX RT系列取得了優(yōu)秀的市場表現(xiàn)。i.MX RT1170跨界MCU是恩智浦i.MX
    的頭像 發(fā)表于 03-22 11:14 ?3493次閱讀

    恩智浦i.MX RT1170在將該系列帶上了更高的層面

    自2017年上市以來,i.MX RT系列取得了優(yōu)秀的市場表現(xiàn)。i.MX RT1170跨界MCU是恩智浦i.MX
    的頭像 發(fā)表于 05-18 11:15 ?3787次閱讀

    i.MX RT開發(fā)筆記-08 | i.MX RT1062嵌套中斷向量控制器NVIC(按鍵中斷檢測)

    系列文章目錄i.MX RT開發(fā)筆記-01 | 初識 i.MX RT1062 跨界MCUi.MX RT
    發(fā)表于 12-01 13:51 ?2次下載
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>開發(fā)筆記-08 | <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1062嵌套中斷向量控制器NVIC(按鍵中斷檢測)

    RT-Thread & NXP 發(fā)布 i.MX RT 系列 BSP 新框架

    前言i.MX RT 是 NXP 推出的跨界處理器系列。該系列下又包括 i.MX RT1020、i.MX
    發(fā)表于 12-07 13:06 ?2次下載
    <b class='flag-5'>RT</b>-Thread & NXP 發(fā)布 <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b> 系列 BSP 新框架

    適用于i.MX RT500和i.MX RT600 MCU的Xtensa音頻框架介紹

    在眾多的恩智浦i.MX RT跨界處理器當(dāng)中,您可能會發(fā)現(xiàn)有些系列除了Arm內(nèi)核之外還結(jié)合了高性能的DSP,利用集成DSP的技術(shù)優(yōu)勢,可提供高性能音頻數(shù)字信號處理能力,并包含特定算法操作,可實(shí)現(xiàn)完全
    的頭像 發(fā)表于 11-10 09:39 ?2720次閱讀

    RT-Thread文檔_野火 I.MX RT1052上手指南

    RT-Thread文檔_野火 I.MX RT1052 上手指南
    發(fā)表于 02-22 18:25 ?2次下載
    <b class='flag-5'>RT</b>-Thread文檔_野火 <b class='flag-5'>I.MX</b> <b class='flag-5'>RT</b>1052上手指南

    i.MX RT10xx使用FlexIO實(shí)現(xiàn)XY2-100振鏡控制協(xié)議

    本文介紹了如何使用i.MX RT系列芯片上的FlexIO實(shí)現(xiàn)XY2-100激光振鏡控制協(xié)議。FlexIO模塊是NXP Kinetis和i.MX RT
    的頭像 發(fā)表于 05-18 09:21 ?5942次閱讀
    在<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>10xx使用FlexIO實(shí)現(xiàn)XY2-100振鏡控制<b class='flag-5'>協(xié)議</b>

    i.MX RT的FlexRAM配置問題

    i.MX RT的FlexRAM配置問題
    的頭像 發(fā)表于 10-24 15:46 ?814次閱讀
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>的FlexRAM配置問題

    使用LwIP協(xié)議淺析實(shí)戰(zhàn)分析(i.MX RT

    既可以移植到操作系統(tǒng)上運(yùn)行,也可以在無操作系統(tǒng)的情況下獨(dú)立運(yùn)行。? ? ?TCP/IP協(xié)議的模型結(jié)構(gòu)如下圖所示,由于TCP/IP
    的頭像 發(fā)表于 02-02 17:05 ?1756次閱讀
    使用LwIP<b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b>淺析實(shí)戰(zhàn)分析(<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>)

    如何在i.MX RT微控制器上初始化LWIP協(xié)議

    i.MX RT微控制器上初始化LWIP協(xié)議是一個(gè)復(fù)雜但有趣的過程,它涉及多個(gè)步驟和關(guān)鍵組件的配置.
    的頭像 發(fā)表于 10-12 11:48 ?373次閱讀
    如何在<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>微控制器上初始化LWIP<b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b>